Mathematicaで巡回セールスマン問題を解く
問題
電車でこんな広告を見かけました😁📸 pic.twitter.com/iXEgvtXrpL
— 早稲田大学 早水桃子研究室 (@hayamizu_lab) October 11, 2022
解法
|
|
SparseArray関数で行列を作成する。それぞれの要素は、その要素の行と列の都市間の距離を表します。例えば、最初の要素{1,2}->10
は、1と2の距離が10という意味です。最後から2番目の要素{9,9}
は行列の大きさを示していて、最後の要素Infinity
は、指定していない都市間の道の長さが無限。つまり道がないことを意味します。
|
|
FindShortestTour関数で、簡単に巡回セールスマン問題を解くことができます。{1,2,3,4,5,6,7,8,9}
は、都市の番号を表します。DistanceFunction->(d[[#1,#2]]&)
は、都市間の距離を表す行列dを渡しています。
出力
|
|
出力は、最短距離と、そのときの巡回路です。最短距離は137
、巡回路は1→2→5→9→8→7→6→3→4→1
となります。ABCの順に直すとA, B, E, I, H, G, F, C, D
となります。