0

그래서 여행 세일즈맨 문제에 대한 2-opt 개선에 대한 설명을 찾고 있었지만 그 점에 관해서는 알지만 한 가지를 이해하지 못합니다.여행 세일즈맨 - 2-Opt 개선

나는 생성 된 경로의 두 가장자리가 서로 교차하는 경우 두 점을 전환 할 수 있으며 더 이상 교차하지 않는다는 것을 알고 있습니다. 그러나 두 개의 가장자리가 교차하는지 여부를 어떻게 결정할 수 있는지 이해할 수 없습니다. 내 질문에 명확하게하려면

, 이것은 내가 지금까지 한 일이다 (나는 자바를했다)

  1. 내가 X로, 도시를 대표하는 Point를라는 개체를 가지고 y 좌표 .
  2. List에 포함 된 Points 집합을 가진 PointSet이 있습니다.
  3. 나는 가까운 이웃 알고리즘을 통해 상당히 짧은 방법으로 PointSet을 배열 computeByNN()라는 방법이 있습니다.

그래서 이제 정렬 된 PointSet (최적은 아니지만 여전히 짧음)이 있으며 2 개를 선택하고 싶습니다. 그러나, 나는 어디에서 시작해야할지 모른다. 각 라인 세그먼트를 점검하여 교차하는지 확인해야합니까? 그렇다면 두 포인트를 전환하십시오. 나는 그것이 휴리스틱 스의 목적을 무효화하고 일종의 무차별 한 해결책이되는 것처럼 느낍니다. 투어의 두 세그먼트가 교차하는지 확인하는 효율적인 방법이 있습니까?

질문이 명확하지 않은 경우 애원을 표시합니다. 누구든지 나를 필요로한다면 더 명확하게 편집하려고 노력할 것입니다.

+1

모든 가장자리에서 각각을 검사하는 것은'O (n²)'뿐입니다. 완벽하게 합리적인 실행 시간은 NP- 완전한 문제 (분명히 알려진 다항식 시간 정확한 해결책이 없음)을 근사 할 때입니다. – Paulpro

답변

1

좋아하는 경우 룩업 테이블을 만들어 교차 가장자리를 감지 할 수 있습니다. n = 1000의 경우, 10^12 개 항목은 분명히 너무 사치 스럽습니다. 그러나 당신은 아마 짧은 가장자리에 대해 가장 걱정하고 있습니까? 각 노드에 대해 가장 가까운 이웃 노드의 √n에 에지를 포함 시키려고했습니다. 그렇다면 당신은 단지 메가 바이트의 공간과 어쨌든 O (n^2) 전처리 영역에 있습니다. 거기에서 그것은 휴리스틱 한, 행운을 빌어 요!

또한이 작업은 즉시 수행 할 수 있습니다.

+0

이상적으로는 교차하는 모든 가장자리 (심지어 긴 것들까지)를 수정하고 싶습니다. Concorde TSP 솔버를 본다면 교차하는 모든 에지를 찾아 교체 할 수 있습니다. 나는 그것이 그렇게 빨리하는 방법을 이해하지 않는다. 그러나, 나는 루트 (n) 이웃을 확인하고 그것이 어떻게되는지 보면서 당신의 방법으로 그것을 시도 할 것이다. 비행 중에도 수행 할 수 있다고 말하면 무엇을 의미합니까? (나는이 모든 것에 정말로 새로운 고등학생이다. 그래서 어리석은 질문에 대해 나를 용서해 라). – ujvl

+0

즉석에서 엔트리 테이블로 시작하는 것이고, 한 쌍의 가장자리가 실제로 그래프에 나타나면 교차 여부와 상관없이 저장하십시오. 죄송합니다. TSP에 대해 잘 모르겠습니다. 동일한 쌍을 반복해서 테스트 할 예정이라면 그럴만 한 가치가 있습니다. 내 생각의 √ n 부분을 구현하는 명백한 빠른 방법이 없으므로 교차 가장자리를 검사하는 방법에 중점을 두는 것이 좋습니다. 예를 들어, 가장자리 A의 가장 높은 y 값이 가장자리 B의 가장 낮은 값보다 작은 경우 다른 검사를 수행 할 필요가 없습니다. – clwhisk

+0

x 및 y 차원에서 각 가장자리가 처리하는 그림자 선 세그먼트를 계산하여 시간 복잡도를 줄일 수 있습니다. 그러면 O (n^2)에서 교차하는 알고리즘을 찾는 알고리즘이있을 것입니다. 그런 다음 교차 할 수있는 가장자리에 대해서만 교차 테스트를 수행합니다. – clwhisk