콩코드의 곤경


16

배경

외판원 문제 (TSP)은 짧은 회로를 요구 방문하는 도시의 지정된 컬렉션. 이 질문의 목적을 위해 도시는 평면의 점이되고 도시 사이의 거리는 일반적인 유클리드 거리 (가장 가까운 정수로 반올림)가됩니다. 회로는 "왕복"이어야합니다. 즉, 출발 도시로 돌아와야합니다.

콩코드 TSP 솔버 , 유클리드 외판원 문제의 인스턴스를 해결할 수있는 정확 하고 훨씬 더 빨리 하나가 기대보다. 예를 들어 Concorde는 85,900 포인트 인스턴스를 정확하게 해결할 수 있었으며 그 중 일부는 다음과 같습니다.pla85900 투어 드로잉 세그먼트

그러나 일부 TSP 인스턴스는 Concorde의 경우에도 너무 오래 걸립니다. 예를 들어, 아무도 모나리자를 기반으로이 100,000 포인트 인스턴스 를 해결할 수 없었습니다 . (만약 당신이 그것을 해결할 수 있다면 $ 1,000 상금이 제공됩니다!)

콩코드는 소스 코드 또는 실행 파일로 다운로드 할 수 있습니다 . 기본적으로 내장 된 LP (linear program) 솔버 QSopt 를 사용하지만 CPLEX와 같은 더 나은 LP 솔버를 사용할 수도 있습니다.

도전

Concorde 가 해결하는 데 5 분 이상 걸리는 가장 작은 TSP 인스턴스는 무엇입니까 ?

인스턴스를 출력하는 프로그램을 작성하거나 원하는 다른 방법을 사용할 수 있습니다.

채점

인스턴스의 점수가 적을수록 좋습니다. 인스턴스의 파일 크기에 따라 연결이 끊어집니다 (아래 참조).

표준화

다른 컴퓨터는 더 빠르거나 느리게 실행되므로 런타임에 대한 측정 표준으로 Concorde 용 NEOS 서버를 사용 합니다 . 다음과 같은 간단한 2 차원 좌표 형식으로 포인트 목록을 제출할 수 있습니다.

#cities
x_0 y_0
x_1 y_1
.
.
.
x_n-1 y_n-1

NEOS에서 사용해야하는 설정은 "Concorde data (xy-list file, L2 norm)", "Algorithm : Concorde (QSopt)"및 "Random seed : fixed"입니다.

베이스 라인

1889 점 인스턴스 rl1889.tsp에서 TSPLIB는 5 분 이상이다, "871.18 (초) 총 러닝 타임"을합니다. 다음과 같이 보입니다 :

rl1889.tsp의 도시 없음 일러스트


2
하드 컨 코드 사례 생성에 대한 관련 SE 게시물 .
agtoever

답변:


17

88 개 도시, NEOS에서 341 초의 런타임

최근 논문에서 우리는 유클리드 TSP 사례를 해결하기 위해 어려운 가족을 구성했습니다. 이 패밀리에서 인스턴스를 생성하고 여기에서 생성하기위한 코드를 다운로드 할 수 있습니다.

http://www.or.uni-bonn.de/%7Ehougardy/HardTSPInstances.html

이 제품군의 88 개 도시 인스턴스는 5 분 이상 NEOS 서버에서 Concorde를 가져옵니다. 이 가족의 178 개 도시 사례는 이미 해결하는 데 하루 이상이 걸렸습니다.


1
이거 엄청나 네!!
A. Rex

아주 좋은 종이! 놀라운 결과. 당신은 이것으로 승리 할 가치가 있습니다!
agtoever

8

NEOS에서 77 개 도시, 7.24 분 (434.4 초) 평균 런타임

파티에 조금 늦었지만 77 노드 인스턴스 weruSnowflake77을 제공하고 싶습니다.

이 인스턴스를 만들면서 콩코드가 가장 짧은 발견 된 투어의 길이와 가장 낮은 하한선을 맞추기 위해 소요되는 시간에 압력을 가하는 지역 및 전역 특성을 이해하려고 노력했습니다.

이 사례를 만들기 위해 기본 그래프 (13 x 13 정사각형)로 시작한 다음 체계적으로 새로운 점을 도입하거나 이전 점을 변환하여 절단하기 전에 평균적으로 콩코드가 가지에 깊숙이 들어가도록 조정 한 내용을 유지했습니다.

이 기법은 유전자 알고리즘이 기존 투어를 변경하고 그래프 자체가 변경되고 해결하기 어려운 그래프가 유지되는 것을 제외하고는 차세대 돌연변이에 대해 더 짧은 투어를 유지하는 방식과 유사합니다. 또한 반대 방향으로 가고 기존 그래프를 변경하여 하한을 찾기 어려운 그래프를 구성하는 것을 제외하고는 완화를 사용하여 그래프를 변경하여 좋은 하한을 구성하는 방법과 비슷합니다.

이 과정에서 해결하는 데 몇 분의 시간이 걸리는 작은 그래프가 있지만 최소 5 분의 시간이 걸리는 첫 번째 작은 그래프입니다.

고정 시드 및 QSopt를 사용하여 NEOS에서 10 번의 시험 실행으로 평균 런타임은 7.24 분 (434.531 초)이었습니다. 최소 런타임은 5.6 분 (336.64 초)입니다. 최대 런타임은 8.6 분 (515.80 초)입니다. 시험은 폐기되지 않았습니다. 아래의 전체 벤치 마크 표 :

10 회 이상 벤치 마크 결과 :

----------------------------------
| Run | Job ID# | Total running  |
|     |         | time (seconds) |
|-----|---------|----------------|
| 1   | 7739963 | 513.44         |
| 2   | 7740009 | 336.64         |
| 3   | 7740023 | 514.25         |
| 4   | 7740029 | 447.97         |
| 5   | 7740038 | 357.10         |
| 6   | 7740072 | 447.47         |
| 7   | 7740073 | 336.19         |
| 8   | 7740075 | 515.80         |
| 9   | 7740088 | 361.26         |
| 10  | 7740091 | 515.19         |
----------------------------------

weruSnowflake77 (xy 목록, L2 규범) :

77
-700 -700
700 -700
200 0
0 200
-200 0
0 -200
0 0
-600 600
-500 600
-400 600
-300 600
-200 600
-100 600
0 600
100 600
200 600
300 600
400 600
500 600
600 600
-600 -600
-500 -600
-400 -600
-300 -600
-200 -600
-100 -600
0 -600
100 -600
200 -600
300 -600
400 -600
500 -600
600 -600
600 -500
600 -400
600 -300
600 -200
600 -100
600 0
600 100
600 200
600 300
600 400
600 500
-600 -500
-600 -400
-600 -300
-600 -200
-600 -100
-600 0
-600 100
-600 200
-600 300
-600 400
-600 500
-500 -500
-400 -400
-300 -300
-200 -200
-100 -100
100 100
200 200
300 300
400 400
500 500
100 -100
200 -200
300 -300
400 -400
500 -500
-100 100
-200 200
-300 300
-400 400
-500 500
700 700
-700 700

저장소

저장소에서 문제 세트 파일 :

  • weruSnowflake77.txt (xy 목록 파일, L2 규범)
  • weruSnowflake77.tsp (TSPLIB 형식, EUC_2D)

멋있는! 게시물로 편집하려는 경우 인스턴스 사진은 다음과 같습니다. i.stack.imgur.com/DnJ7T.png
A. Rex

@ A.Rex 감사합니다! 그렇습니다. 그것은 최적의 경로 중 하나입니다. (가설 적으로) 동일한 최적 길이의 다른 경로가 많이 있어야합니다. 인스턴스가 가질 수있는 다양한 최적 경로를 수량화 할 수있는 좋은 방법이 있습니까? 콩코드가 가지를 자르고 자르면 길이가 같은 모든 가지를 기억할 수있을 것입니다 ...
Lawrence Weru

5

Python 3, 911 도시, NEOS에서 1418 초의 런타임

다음 Python 3.x 스크립트는 911 도시의 좌표를 생성합니다. 가장 짧은 경로 47739 를 계산 하는 데 NEOS 1418 초가 걸렸습니다 .

가장 짧은 경로의 사진입니다 (A. Rex 덕분에). 911 도시 사이의 최단 경로

코드 / 알고리즘은 Feigenbaum bifurcation을 기반으로하며 , 도시의 좌표를 생성하는 기초로 사용 된 일련의 값을 생성했습니다. NEOS에 필요한 시간 (필요한 5 분 이상)이 걸리는 1000 세 미만의 여러 도시가 발견 될 때까지 매개 변수를 실험했습니다.

x = 0.579
coords = []
for _ in range(1301):
    if int(3001*x) not in coords:
        coords.append(int(3001*x))
    x = 3.8*x*(1-x)
coords = list(zip(coords, coords[::-1]))
print(len(coords))
for coord in coords:
    print(f"{coord[0]} {coord[1]}")

추신 : NEOS에서 5 분 이상 걸리는 더 적은 수의 도시를 검색하는 스크립트가 있습니다. 찾은 경우이 답변에 게시하겠습니다.

PS : 젠장! 1301 대신 l 매개 변수 1811 로이 스크립트를 실행하면 NEOS 에서 실행 시간이 4 시간 이상인 1156 개 도시가 생성 됩니다.


다음은 게시물로 편집하려는 경우 911 도시 여행 사진입니다 : i.imgur.com/G1ZPX0k.png
A. Rex

@ A.Rex 감사합니다. 추가했습니다.
agtoever
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.