巡回セールスマン問題(分割法)

test ケーススタディファイル名   // C/C++,C#,VB の場合
Java Test ケーススタディファイル名   // Java の場合
PHP test.php ケーススタディファイル名   // PHP の場合
Ruby test.rb ケーススタディファイル名   // Ruby の場合
py -3 test.py ケーススタディファイル名   // Python の場合		
などと入力してやれば実行できます.ケーススタディファイル,たとえば data.txt は,同じ問題を乱数の初期値を変えて実行したいような場合に効果的であり,たとえば以下のような形式で作成します.
問題の数 2
問題 data1.txt 繰り返し回数 10
問題 data2.txt 繰り返し回数 10		
  日本語で記述した部分(「問題の数」,「問題」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください(以下の説明においても同様).各データの意味は以下に示す通りです.

問題の数

問題の数を入力します.この例では 2 となっています.

問題

各問題の始まりであり,上で与えた問題の数だけ以下のデータが繰り返されます.この項には,データファイル名を入力します(上の例では,data1.txt と data2.txt ).

繰り返し回数

同じ問題を,乱数の初期値を変えて何回実行するかを示します.得られた結果の平均等によって,最終的な結論としたいような場合に利用します.

  データファイルは,問題自身とその解法の詳細を記述するためのファイルであり,たとえば以下のように記述します.なお,4 行目,及び,5 行目は,Java のプログラムを実行する場合だけに必要とします.他の言語のプログラムを実行する際には,4 行目,及び,5 行目を削除してください.
都市の数 439 選択方法(0:最良,1:最初) 1 近傍(2or3) 3 整数 1
出力(0:ディスプレイ,1:ファイル) -1 出力ファイル名 result\pr439
分割数 X 4 Y 3 最大試行回数 1000
図示(0:しない,1:結果,2:初期状態と結果,3:ステップ) 3
都市番号 0 図の大きさ(幅,高さ) 1000 750
7125 11300
7225 11050
         ・・・・・
1775 5375
2075 6475		
  各データの意味は以下に示す通りです.

都市の数

  都市の数を入力します

選択方法(0:最良,1:最初)

  分割された各領域の最適値を逐次改善法を利用して求めます.逐次改善法においては,λ近傍に含まれる(λ本の)枝を入れ替えるという作業を距離の改善がなされなくなるまで続けることによって,解を求めます.各ステップにおいて,どのλ本の枝を入れ替えるかを探索していきますが,ここに 0 を入力すると,λ本の枝を入れ替えるすべての組み合わせの内,最も改善度が高いものを選択します.また,1 を入力すると,最初に見つかったλ本の枝をすぐ入れ替えます.通常,1 で良いと思います.

近傍(2or3)

  λの値を入力してください,利用できるのは 2 または 3 だけです.

整数

  各都市の位置情報( x 座標と y 座標)の入力方法と都市間距離の計算方法を指定します.
=1 : 位置情報は整数,距離は整数計算
=-1 : 位置情報は実数,距離は整数計算
=-2 : 位置情報は実数,距離を実数計算

出力(0:ディスプレイ,1:ファイル)

  結果の出力方法を入力します.
=-1 : 得られた経路長だけを画面に表示します
=0 : 経路長と巡回する都市の順番を画面に表示します
=1 : 得られた経路長だけをファイルに保存します.なお,保存は,追加( append )形式で行われます.
=2 : 経路長と巡回する都市の順番をファイルに保存します.なお,保存は,追加( append )形式で行われます.

出力ファイル名

  結果を保存するファイル名です.なお,画面に出力する場合は必要ありません(入力しても無視).

分割数 X

  x 軸方向の分割数です.1 (分割しない)以上の値を入力してください.この例に場合は,4 分割します.

  y 軸方向の分割数です.1 (分割しない)以上の値を入力してください.この例の場合は,3 分割します.

最大試行回数

  逐次改善法における最大試行回数です.もちろん,この回数より少ない回数で改善が不可能になればその時点で終了します.

図示(0:しない,1:結果,2:初期状態と結果,3:ステップ)

  Java においては,結果の図示が可能です.ここでは,結果を図示するか否かを入力します.ただし,図示しない場合においても,入力データの 5 行目は必ず記述してください.
=0 : 図示しない
=1 : 最終結果だけを図示
=2 : 初期状態と最終結果を図示
=3 : 初期状態,最終結果,各領域毎の最適解,および,連結の過程を表示

都市番号

  都市番号を表示する際,その字の大きさを入力します.0 を入力すると都市番号を表示しません.

図の大きさ(幅,高さ)

  図の幅と高さの最大値を入力します.実際に表示される図の大きさは,これらの値と都市座標の分布状況によって,上下,左右の縮尺が等しくなるように決められます.

7125 11300
  ・・・・・

  以下,各都市の x 座標と y 座標です.都市の数だけ必要になります.この入力された順番が,その都市の都市番号になります( 0 から始まる).

  結果を画面に出力する場合,乱数の初期値が変化する毎に入力待ちの状態になります.また,都市の順番も出力する場合は,10 都市出力する毎に入力待ちの状態になります.return キーを入力すれば継続されます.

  なお,Java において,結果を図示する場合,対応する図が表示される毎に,コマンドプロンプトの画面に

  図を確認したらreturnキーを押してください

のようなメッセージが出力されますので,メッセージに従い return を押して継続してください.すべての処理が終了すると,return を押しても応答しなくなりますが,表示されている図を削除するとプログラムが終了します.