模擬退火 解決 TSP 問題

2021-08-30 13:56:20 字數 1394 閱讀 7929

tsp問題求解

n個城市之間有一定距離,現在讓選擇乙個城市出發,然後到達所有的城市,最後回到原點每個城市只到達一次,求出一條路徑並且求出最短的距離

tsp問題是乙個np問題,但是可以求近似解,通過模擬退火演算法實現,

源:

#include #include #include #include #include #include #include //#define local

#define n 30 //城市數量

#define t 3000 //初始溫度(最大距離)

#define eps 1e-8 //終止平衡溫度(精度)

#define delta 0.98 //溫度衰減速率 (會控制最優解)

#define limit 10000 //概率選擇上限 (控制最優解)

#define oloop 1000 //外迴圈次數 (控制時間複雜度)

#define iloop 15000 //內迴圈次數 ...

using namespace std;

struct path ; //定義路線結構體

struct point ; //定義城市座標

path path; //記錄最優路徑

point p[n]; //每個城市的座標

double dis[n][n]; //兩兩城市間的距離

int ncase; //測試次數

double dist(point a, point b)

void getdis(point p, int n)

void input(point p, int &n)

void init(int n)

else

printf("%d\n", i);

} printf("init path length is : %.4f\n", path.len);

}void print(path t, int n)

printf("the path length is : %.4f\n", t.len);

}path getnext(path p, int n)

void sa(int n)

else

if (p_l > limit)

}if (curpath.len < newpath.len) path = curpath;

if (p_f > oloop || t < eps) break;

t *= delta; }}

int main()

模擬退火演算法解決TSP問題

模擬退火法 模擬退火法簡單解釋 為了找出地球上最高的山,一群兔子們開始想辦法。首先兔子們用酒將自己灌醉了,它們隨機地跳了很長的時間。在這期 間,它們可能走向高處,也可能踏入平地。但是,隨著時間的流逝,它們漸漸清醒了並朝著最高的方向跳去。最後就達到了珠穆朗瑪峰。所謂的退火是指將固體加熱到足夠高的溫度,...

TSP 模擬退火

都知道tsp是經典的np問題,從乙個點開始遍歷所有點,不重複,求最短路徑。可以用列舉終點,跑流量為2的最小費用,圖論來做,時間複雜度為 費用流已經用到堆優化了。顯然點,邊較多將無法承受。如果不要求精確解,使用模擬退火也是乙個不錯的選擇。模型簡單,轉移很暴力。先隨機生成一些解,然後隨機挑兩個點,開始試...

模擬退火求解TSP問題

1.尋找下乙個解 2.計算下乙個解的能量 3.決定是否接受這個解 4.降溫 double randfloat double t0 1000000 tk 1,t t0,d 0.9999 int x initx 當前解 初始解 int anse,nowe 全域性最優解的能量,當前解的能量 anse no...