ชะตากรรมของคองคอร์ด


16

พื้นหลัง

ปัญหาพนักงานขายที่เดินทาง (TSP) ขอวงจรที่สั้นที่สุดที่ผู้เข้าชมคอลเลกชันที่กำหนดของเมือง สำหรับจุดประสงค์ของคำถามนี้เมืองจะเป็นจุดในระนาบและระยะทางระหว่างพวกเขาจะเป็นระยะทางแบบยุคลิดตามปกติ(ปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุด) วงจรจะต้องเป็น "ไปกลับ" หมายความว่ามันจะต้องกลับไปที่เมืองเริ่มต้น

ตัวแก้ปัญหา Concorde TSPสามารถแก้ปัญหากรณีปัญหาพนักงานขาย Euclidean ที่เดินทางได้อย่างรวดเร็วและเร็วเกินคาด ตัวอย่างเช่น Concorde สามารถแก้ปัญหาอินสแตนซ์ 85,900 จุดได้อย่างแม่นยำซึ่งบางส่วนมีลักษณะดังนี้:ส่วนของภาพวาดของ pla85900 Tour

อย่างไรก็ตามอินสแตนซ์ TSP บางรายการใช้เวลานานเกินไปสำหรับ Concorde ยกตัวอย่างเช่นไม่มีใครได้รับสามารถที่จะแก้ปัญหานี้เช่น 100,000 จุดบนพื้นฐานของโมนาลิซ่า (มีรางวัล $ 1,000 ให้ถ้าคุณสามารถแก้มันได้!)

Concorde พร้อมให้ดาวน์โหลดในรูปของซอร์สโค้ดหรือไฟล์ที่เรียกใช้งานได้ โดยค่าเริ่มต้นจะใช้QSoptตัวแก้ปัญหาโปรแกรมเชิงเส้น (LP) ในตัวแต่ยังสามารถใช้ตัวแก้ปัญหา LP ที่ดีขึ้นเช่น CPLEX

ความท้าทาย

อินสแตนซ์ของ TSP ที่เล็กที่สุดที่คุณสามารถสร้างได้ใช้เวลานานกว่าห้านาทีในการแก้ไขคือConcorde คืออะไร

คุณสามารถเขียนโปรแกรมเพื่อแสดงผลอินสแตนซ์หรือใช้วิธีอื่นที่คุณต้องการ

เกณฑ์การให้คะแนน

คะแนนน้อยลงในอินสแตนซ์ที่ดีกว่า ความสัมพันธ์จะถูกทำลายโดยขนาดไฟล์ของอินสแตนซ์ (ดูด้านล่าง)

มาตรฐาน

คอมพิวเตอร์หลายเครื่องทำงานเร็วหรือช้ากว่าดังนั้นเราจะใช้เซิร์ฟเวอร์ NEOS สำหรับ Concordeเป็นมาตรฐานการวัดสำหรับรันไทม์ คุณสามารถส่งรายการคะแนนในแบบฟอร์มการประสานงาน 2 มิติอย่างง่ายต่อไปนี้:

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

การตั้งค่าที่ควรใช้กับ NEOS คือ "ข้อมูลคองคอร์ด (ไฟล์ xy-list, L2 ปกติ)", "อัลกอริทึม: คองคอร์ด (QSopt)" และ "สุ่มเมล็ด: คงที่"

พื้นฐาน

อินสแตนซ์ 1,889 จุดrl1889.tspจากTSPLIBใช้เวลา "Total Running Time: 871.18 (วินาที)" ซึ่งมากกว่าห้านาที ดูเหมือนว่านี้:

ภาพประกอบไม่มีเมืองของ rl1889.tsp


2
โพสต์ SE ที่เกี่ยวข้องในการสร้างกรณีฮาร์ดไดรฟ์
ตลอดไป

คำตอบ:


17

88 เมือง, รันไทม์ของ NEOS 341 วินาที

ในบทความล่าสุดเราได้สร้างกลุ่มของยากที่จะแก้ปัญหาอินสแตนซ์ของปริภูมิแบบยุคลิด คุณสามารถดาวน์โหลดอินสแตนซ์จากตระกูลนี้รวมถึงรหัสสำหรับสร้างได้ที่นี่:

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

ตัวอย่างเมือง 88 แห่งจากครอบครัวนี้ใช้ Concorde บนเซิร์ฟเวอร์ NEOS มากกว่า 5 นาที ตัวอย่าง 178 เมืองจากครอบครัวนี้ใช้เวลามากกว่าหนึ่งวันในการแก้ไข


1
นี่มันอัศจรรย์มาก!!
A. Rex

กระดาษที่ดีมาก! ผลลัพธ์ที่น่าอัศจรรย์ คุณสมควรได้รับชัยชนะจากสิ่งนี้ทั้งหมด!
agtoever

8

77 เมือง, เวลาเฉลี่ย 7.24 นาที (434.4 วินาที) บน NEOS

ฉันไปงานเลี้ยงช้านิดหน่อย แต่ฉันต้องการมีส่วนร่วม 77-node เช่น weruSnowflake77

ฉันสร้างอินสแตนซ์นี้ในขณะที่พยายามทำความเข้าใจว่าลักษณะท้องถิ่นและระดับโลกกำหนดแรงกดดันที่สูงขึ้นต่อเวลาที่คองคอร์ดใช้เพื่อให้ตรงกับขอบเขตล่างที่ดีที่สุดกับความยาวของทัวร์ที่พบได้สั้นที่สุด

ในการสร้างอินสแตนซ์นี้ฉันเริ่มต้นด้วยกราฟฐาน (13 x 13 ตาราง) จากนั้นก็แนะนำจุดใหม่หรือจุดเก่าที่แปลแล้วอย่างเป็นระบบเพื่อคงการปรับแต่งที่ดูเหมือนจะทำให้คองคอร์ดเดินลึกเข้าไปในกิ่งก้านของมัน

เทคนิคนี้คล้ายกับวิธีที่อัลกอริธึมทางพันธุกรรมกลายพันธุ์การท่องเที่ยวที่มีอยู่และยังคงมีการทัวร์ระยะสั้นสำหรับรุ่นต่อไปของการกลายพันธุ์ยกเว้นกราฟจะถูกกลายพันธุ์และกราฟที่ยากต่อการแก้จะถูกเก็บไว้ นอกจากนี้ยังคล้ายกับวิธีที่เรากลายพันธุ์กราฟโดยใช้การผ่อนคลายเพื่อช่วยสร้างขอบเขตที่ต่ำลงยกเว้นว่าฉันกำลังไปในทางตรงกันข้ามตัดกลายเป็นกราฟที่มีอยู่เพื่อสร้างกราฟที่หายาก

ในกระบวนการฉันพบกราฟเล็ก ๆ สองสามตัวที่ใช้เวลาคองคอร์ดเพื่อแก้ปัญหา แต่นี่เป็นกราฟเล็ก ๆ แรกที่ฉันพบซึ่งใช้เวลาน้อยกว่า 5 นาที

ด้วยการทดลองใช้งาน 10 NEOS โดยใช้เมล็ดพืชคงที่และ QSopt รันไทม์เฉลี่ยคือ 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

กรุ

ปัญหาชุดไฟล์จาก repo:

  • weruSnowflake77.txt (ไฟล์รายการ xy, บรรทัดฐาน L2)
  • weruSnowflake77.tsp (รูปแบบ TSPLIB, EUC_2D)

เย็น! นี่คือรูปภาพของอินสแตนซ์ของคุณหากคุณต้องการแก้ไขในโพสต์ของคุณ: i.stack.imgur.com/DnJ7T.png
A. Rex

@ A.Rex ขอบคุณ! ใช่นั่นเป็นหนึ่งในเส้นทางที่ดีที่สุด ควร (มีสมมุติฐาน) มีเส้นทางที่แตกต่างกันจำนวนมากซึ่งมีความยาวเท่ากัน มีวิธีที่ดีสำหรับเราในการหาปริมาณเส้นทางที่เหมาะสมที่สุดที่จะมีได้หรือไม่? ถ้าไม่ Concorde สาขาและตัดฉันเดิมพันมันสามารถจำทุกสาขาที่มีระยะเวลาเดียวกัน ...
ลอว์เรเวฬุ

5

Python 3, 911 เมือง, ระยะเวลาในการทำงาน 1418 วินาทีบน NEOS

สคริปต์ Python 3.x ต่อไปนี้สร้างพิกัดของ 911 เมือง ใช้เวลา NEOS 1418 วินาทีในการคำนวณเส้นทางที่สั้นที่สุดของ 47739

นี่คือภาพเส้นทางที่สั้นที่สุดของเจ้า (ขอบคุณ A. Rex): เส้นทางที่สั้นที่สุดระหว่าง 911 เมือง

รหัส / อัลกอริทึมนั้นมาจากการแยกไปสองทางFeigenbaumซึ่งฉันใช้เพื่อสร้างชุดของค่าซึ่งฉันใช้เป็นพื้นฐานสำหรับการสร้างพิกัดของเมือง ฉันทดสอบพารามิเตอร์จนกว่าฉันจะพบจำนวนเมืองน้อยกว่า 1,000 แห่งที่ใช้เวลา NEOS เป็นระยะเวลาที่น่าประหลาดใจ (เหนือเวลาที่กำหนด 5 นาที)

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: ฉันมีสคริปต์ทำงานในการค้นหาจำนวนเมืองที่ต่ำกว่าที่ใช้เวลา> 5 นาทีใน NEOS ฉันจะโพสต์พวกเขาในคำตอบนี้หากฉันพบใด ๆ

PS: ประณาม! การรันสคริปต์นี้ด้วยพารามิเตอร์l 1811 แทน 1301 ผลลัพธ์ใน 1156 เมืองด้วยเวลาทำงานบน NEOS เพียง 4 ชั่วโมงซึ่งมากกว่ากรณีอื่น ๆ ที่มีพารามิเตอร์ที่คล้ายกัน ...


นี่คือภาพทัวร์เมือง 911 ของคุณหากคุณต้องการแก้ไขในโพสต์ของคุณ: i.imgur.com/G1ZPX0k.png
A. Rex

@ A.Rex ขอบคุณ เพิ่มมัน
ตลอดไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.