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