Hoàn cảnh của Concorde


16

Lý lịch

Các vấn đề nhân viên bán hàng đi du lịch (TSP) yêu cầu các mạch ngắn nhất mà thăm một bộ sưu tập cho các thành phố. Đối với mục đích của câu hỏi này, các thành phố sẽ là các điểm trong mặt phẳng và khoảng cách giữa chúng sẽ là khoảng cách Euclide thông thường (làm tròn đến số nguyên gần nhất). Mạch phải là "khứ hồi", nghĩa là nó phải trở về thành phố bắt đầu.

Người giải quyết TSP của Concorde có thể giải quyết các trường hợp của vấn đề nhân viên bán hàng du lịch Euclide, chính xác và nhanh hơn nhiều so với mong đợi. Ví dụ, Concorde có thể giải quyết chính xác 85.900 điểm , các phần trong đó trông như thế này:Phân đoạn bản vẽ của tour pla85900

Tuy nhiên, một số trường hợp TSP mất quá nhiều thời gian, ngay cả đối với Concorde. Ví dụ, không ai có thể giải quyết trường hợp 100.000 điểm này dựa trên Mona Lisa . (Có một giải thưởng $ 1.000 được cung cấp nếu bạn có thể giải quyết nó!)

Concorde có sẵn để tải xuống dưới dạng mã nguồn hoặc tệp thực thi. Theo mặc định, nó sử dụng bộ giải QSopt chương trình tuyến tính tích hợp (LP) tích hợp , nhưng nó cũng có thể sử dụng các bộ giải LP tốt hơn như CPLEX.

Các thách thức

Ví dụ TSP nhỏ nhất mà bạn có thể tạo ra phải mất hơn 5 phút để giải quyết?

Bạn có thể viết một chương trình để xuất ra thể hiện hoặc sử dụng bất kỳ phương thức nào bạn muốn.

Chấm điểm

Càng ít điểm trong ví dụ càng tốt. Ties sẽ bị phá vỡ bởi kích thước tập tin của ví dụ (xem bên dưới).

Tiêu chuẩn hóa

Các máy tính khác nhau chạy nhanh hơn hoặc chậm hơn, vì vậy chúng tôi sẽ sử dụng Máy chủ NEOS cho Concorde làm tiêu chuẩn đo lường cho thời gian chạy. Bạn có thể gửi danh sách các điểm theo mẫu tọa độ 2 chiều đơn giản sau:

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

Các cài đặt nên được sử dụng trên NEOS là "Dữ liệu Concorde (tệp danh sách xy, định mức L2)", "Thuật toán: Concorde (QSopt)" và "Hạt giống ngẫu nhiên: đã sửa".

Đường cơ sở

Ví dụ 1.889 điểm rl1889.tsptừ TSPLIB mất "Tổng thời gian chạy: 871,18 (giây)", tức là hơn năm phút. Nó trông như thế này:

minh họa không có thành phố của rl1889.tsp


2
Bài SE có liên quan về Tạo trường hợp cứng.
bất cứ lúc nào

Câu trả lời:


16

88 Thành phố, thời gian chạy 341 giây trên NEOS

Trong một bài báo gần đây, chúng tôi đã xây dựng một gia đình khó giải quyết các trường hợp TSP euclid. Bạn có thể tải xuống các phiên bản từ gia đình này cũng như mã để tạo chúng tại đây:

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

Ví dụ 88 thành phố từ gia đình này đưa Concorde trên máy chủ NEOS hơn 5 phút. Ví dụ 178 thành phố từ gia đình này đã mất hơn một ngày để giải quyết.


1
Thật đáng kinh ngạc!!
A. Rex

Giấy rất đẹp! Kết quả tuyệt vời. Bạn hoàn toàn xứng đáng với chiến thắng này!
bất cứ lúc nào

6

77 thành phố, thời gian chạy trung bình 7,24 phút trên NEOS

Tôi đến bữa tiệc muộn một chút, nhưng tôi muốn đóng góp một ví dụ 77 nút, weruSnowflower77.

Tôi đã tạo ra trường hợp này trong khi cố gắng hiểu những đặc điểm địa phương và toàn cầu nào gây áp lực tăng lên về lượng thời gian điều phối để phù hợp với giới hạn thấp nhất của nó với thời gian của chuyến đi ngắn nhất được tìm thấy.

Để xây dựng trường hợp này, tôi bắt đầu với một biểu đồ cơ sở (13 x 13 vuông), sau đó giới thiệu một cách có hệ thống các điểm mới hoặc dịch các điểm cũ, giữ lại các điều chỉnh xuất hiện để làm cho concorde đi sâu hơn vào các nhánh của nó trước khi cắt.

Kỹ thuật này tương tự như cách một thuật toán di truyền làm thay đổi các chuyến tham quan hiện có và duy trì các chuyến tham quan ngắn hơn cho thế hệ đột biến tiếp theo, ngoại trừ chính biểu đồ đang bị đột biến và các biểu đồ khó giải quyết hơn được giữ lại. Nó cũng tương tự như cách chúng ta thay đổi đồ thị bằng cách sử dụng các thư giãn để giúp xây dựng các giới hạn thấp tốt hơn, ngoại trừ tôi đang đi ngược lại, làm biến đổi một biểu đồ hiện có để xây dựng một biểu đồ khó tìm ra các giới hạn thấp hơn.

Trong quá trình tôi đã tìm thấy một vài biểu đồ nhỏ hơn cần vài phút để giải quyết, nhưng đây là biểu đồ nhỏ đầu tiên tôi tìm thấy có thời gian tối thiểu là 5 phút.

Với 10 lần chạy thử trên NEOS bằng cách sử dụng hạt giống cố định và QSopt, thời gian chạy trung bình là 7,24 phút (434,531 giây). Thời gian chạy tối thiểu là 5,6 phút (336,64 giây). Thời gian chạy tối đa là 8,6 phút (515,80 giây). Không có thử nghiệm đã bị loại bỏ. Bảng điểm chuẩn đầy đủ dưới đây:

Kết quả điểm chuẩn trên 10 lần chạy:

----------------------------------
| 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         |
----------------------------------

weruSnowflower77 (danh sách xy, định mức 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

Kho

Sự cố đặt tệp từ repo:

  • weruSnowflower77.txt (tệp danh sách xy, định mức L2)
  • weruSnowflower77.tsp (định dạng TSPLIB, EUC_2D)

Mát mẻ! Đây là hình ảnh về ví dụ của bạn nếu bạn muốn chỉnh sửa nó vào bài đăng của mình: i.stack.imgur.com/DnJ7T.png
A. Rex

@ A.Rex cảm ơn! Đúng là một trong những tuyến tối ưu. Nó (theo giả thuyết) có rất nhiều tuyến đường khác nhau có cùng độ dài tối ưu. Có cách nào tốt để chúng ta định lượng có bao nhiêu tuyến tối ưu khác nhau mà một thể hiện có thể có không? Nếu Concorde phân nhánh và cắt, tôi cá là nó có thể nhớ tất cả các nhánh có cùng chiều dài ...
Lawrence Weru

5

Python 3, 911 thành phố, thời gian chạy 1418 giây trên NEOS

Kịch bản Python 3.x sau đây tạo tọa độ của 911 thành phố. NEOS mất 1418 giây để tính toán con đường ngắn nhất là 47739.

Dưới đây là hình ảnh về con đường ngắn nhất của bạn (nhờ A. Rex): con đường ngắn nhất giữa các thành phố 911

Mã / thuật toán dựa trên phân nhánh Feigenbaum , mà tôi đã sử dụng để tạo ra một loạt các giá trị, mà tôi đã sử dụng làm cơ sở để tạo tọa độ của các thành phố. Tôi đã thử nghiệm các tham số cho đến khi tôi tìm thấy một số thành phố dưới 1000, mất NEOS một khoảng thời gian đáng ngạc nhiên (cao hơn 5 phút yêu cầu).

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]}")

PS: Tôi có một đoạn script đang chạy để tìm kiếm số lượng thành phố thấp hơn cũng mất> 5 phút trên NEOS. Tôi sẽ đăng chúng trong câu trả lời này nếu tôi tìm thấy bất kỳ.

Tái bút: Chết tiệt! Chạy tập lệnh này với tham số l 1811 thay vì 1301 kết quả ở 1156 thành phố với thời gian chạy trên NEOS chỉ hơn 4 giờ , nhiều hơn so với các trường hợp khác có tham số tương tự ...


Đây là hình ảnh về chuyến tham quan thành phố 911 của bạn nếu bạn muốn chỉnh sửa nó vào bài đăng của mình: i.imgur.com/G1ZPX0k.png
A. Rex

@ A.Rex cảm ơn. Đã thêm nó.
bất cứ lúc nào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.