コンコルドのlight状


16

バックグラウンド

巡回セールスマン問題(TSP)は最短回路を尋ね訪問その都市の指定されたコレクション。この質問の目的のために、都市は飛行機内の点であり、それらの間の距離は通常になりますユークリッド距離(最も近い整数に丸められます)になります。サーキットは「往復」でなければなりません。つまり、出発都市に戻る必要があります。

コンコルドTSPソルバは、ユークリッド巡回セールスマン問題のインスタンスを解決することができ、正確かつはるかに高速1が期待するよりも。たとえば、コンコルドは85,900ポイントのインスタンスを正確に解決できました。その一部は次のようになります。pla85900ツアーの描画のセグメント

ただし、一部のTSPインスタンスは、コンコルドの場合でも時間がかかりすぎます。たとえば、誰も解決できませんでした、モナリザに基づいてこの100,000ポイントのインスタンスを。(あなたがそれを解決できるなら、1,000ドルの賞金が提供されます!)

Concordeは、ソースコードまたは実行可能ファイルとしてダウンロードできます。デフォルトでは、組み込みの線形プログラム(LP)ソルバー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で使用する必要がある設定は、「コンコルドデータ(xyリストファイル、L2ノルム)」、「アルゴリズム:コンコルド(QSopt)」、および「ランダムシード:固定」です。

ベースライン

TSPLIBrl1889.tspからの1,889ポイントのインスタンスには、「合計実行時間:871.18(秒)」がかかります。これは5分以上です。次のようになります。

rl1889.tspの非都市図


2
ハードコンコードケースの生成に関する関連するSE投稿
agtoever

回答:


16

88都市、NEOSで341秒のランタイム

最近の論文では、解決が難しいユークリッドTSPインスタンスのファミリーを構築しました。ここからインスタンスを生成するためのコードと同様に、このファミリからインスタンスをダウンロードできます。

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

このファミリーの88都市インスタンスは、NEOSサーバーで5分以上コンコルドを使用します。このファミリの178都市のインスタンスは、解決するのにすでに1日以上かかります。


1
これは素晴らしいです!!
A.レックス

とてもいい紙です!すばらしい結果。あなたは完全にこれに勝つに値します!
-agtoever

6

77都市、NEOSでの平均実行時間7.24分

私はパーティーに少し遅れましたが、77ノードのインスタンスweruSnowflake77に貢献したいと思います。

このインスタンスを作成したのは、ローカルとグローバルのどの特性が、コンコルドが最短距離と最短ツアーの長さとを一致させるのにかかる時間に上向きの圧力をかけるかを理解しようとするためです。

このインスタンスを構築するために、ベースグラフ(13 x 13の正方形)から始めて、新しいポイントまたは古いポイントを体系的に導入し、コンコルドを平均して枝に深くするように見える調整を保持してからカットします。

この手法は、遺伝的アルゴリズムが既存のツアーを変異させ、次世代の変異のために短いツアーを保持する方法に似ていますが、グラフ自体が変異され、解決が難しいグラフが保持される点が異なります。また、緩和を使用して適切な下限を作成するのに役立つグラフを変更する方法に似ていますが、逆の方法で、既存のグラフを変更して下限を見つけるのが難しいグラフを作成します。

その過程で、解決するのに数分かかる小さなグラフがいくつか見つかりましたが、これは最小で5分かかる最初の小さなグラフです。

NEOSで固定シードとQSoptを使用して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)

涼しい!投稿に編集する場合のインスタンスの画像を次に示し
A. Rex

@ A.Rexありがとう!はい、それは最適なルートの1つです。(仮定的に)同じ最適な長さの異なるルートがたくさんあるはずです。インスタンスが持つことができる最適なルートの数を定量化する良い方法はありますか?コンコルドが分岐してカットする場合、同じ長さのすべての分岐を覚えているに
違いない

5

Python 3、911都市、NEOSでの実行時間は1418秒

次のPython 3.xスクリプトは、911都市の座標を生成します。NEOS 1418秒で47739の最短パスを計算しました。

これが最短経路の写真です(A. Rexに感謝): 911都市間の最短経路

コード/アルゴリズムは、都市の座標を生成するための基礎として使用した一連の値を生成するために使用したFeigenbaum分岐に基づいています。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]}")

PS:NEOSでも5分以上かかる、より少ない数の都市を検索するスクリプトを実行しています。見つかった場合は、この回答に掲載します。

PS:くそー!1301の代わりにlパラメーター1811でこのスクリプトを実行すると、1156都市でNEOSの実行時間が4時間強になります。これは、同様のパラメーターを持つ他の場合よりもはるかに多くなります...


編集して投稿したい場合の911シティツアーの写真を次に示し
A.レックス

@ A.Rexありがとう。追加しました。
-agtoever
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.