#include
#include
#include
#include
#include
#include
using
namespace std;
#define t0 50000.0
// 初始溫度
#define t_end (1e-8)
#define q 0.98
// 退火係數
#define l 1000
// 每個溫度時的迭代次數,即鏈長
#define n 31
// 省會、首府城市數量
#define earth_radius 6378.137
#define pi acos(-1)
int city_list[n]
;// 用於存放乙個解
//中國31個省會、首府城市的經緯度
double city_pos[n][2
]=,,
,,,,
,,,,
,,,,
,,,,
,,,,
,,,,
,,,,
};//省會城市名稱
string city_name[n]=;
//函式宣告
double
getdistance
(double lat1,
double lng1,
double lat2,
double lng2)
;通過給定經緯度計算城市之間的距離,參考google maps
double
pathlen
(int
* arry)
;//給定城市順序,計算城市環路徑的長度
void
init()
;//初始化城市序列
void
swapcity()
;//交換兩個城市順序產生新序列
double
rad(
double d)
double
getdistance
(double lat1,
double lng1,
double lat2,
double lng2)
double
pathlen
(int
* arry)
int last_city = arry[n-1]
;// 最後乙個城市序號
double last_dis =
getdistance
(city_pos[first_city][0
],city_pos[first_city][1
],city_pos[last_city][0
],city_pos[last_city][1
]); path = path + last_dis;
return path;
// 返回總的路徑長度
}void
init()
void
swapcity()
int temp = city_list[pos1]
; city_list[pos1]
= city_list[pos2]
; city_list[pos2]
= temp;
// 交換兩個點
}int
main()
else}}
count++
; t*
=q;if
(!change)
++countgap;
else
countgap=0;
if(countgap==2)
break;}
finish=
clock()
;double duration=((
double
)(finish-start)
)/clocks_per_sec;
printf
("模擬退火演算法,初始溫度t0=%.2f,降溫係數q=%.2f,每個溫度迭代%d次,共降溫%d次,得到的tsp最優路徑為:\n"
,t0,q,l,count)
;for
(int i=
0;i1;i++
)// 輸出最優路徑
cout<]
pathlen
(city_list)
;// 最優路徑長度
cout<<
"最優路徑長度為:"
<"km"
"程式執行耗時:"
<"sec"
}
TSP 旅行商問題 遺傳演算法
問題描述 對於n組城市座標,尋找最短路徑使其經過所有城市並回到起點。問題資料集 tsp.eil51問題1 37 52 2 49 49 3 52 64 4 20 26 5 40 30 6 21 47 7 17 63 8 31 62 9 52 33 10 51 21 11 42 41 12 31 32 ...
旅行商問題
旅行商問題 乙個商人從城市a出發,訪問bcde等城市各一次最後回到a,問行程如何使得路程或費用最低。這是個np 非多項式可解,但一般驗證容易 問題,假設中間有4個城市,那麼全排列為4!24種,沒有很好的演算法,基本只能窮舉了。class vertex 4 public class lianxi pu...
旅行商問題
一銷售商從n個城市中的某一城市出發,不重複地走完其餘n 1個城市並回到原出發點,在所有可能的路徑中求出路徑長度最短的一條。本題假定該旅行商從第1個城市出發。對每個測試例,第1行有兩個整數 n 4 n 10 和m 4 m 20 n是結點數,m是邊數。接下來m行,描述邊的關係,每行3個整數 i,j le...