TSP 旅行商問題 模擬退火演算法

2021-10-24 16:03:17 字數 2395 閱讀 7925

#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...