遺傳演算法解決旅行商問題 TSP (實驗課)

2021-08-19 21:38:59 字數 1951 閱讀 9971

在旅行商問題中,給定一組城市及每座城市與其他城市之間的旅行成本,目標是找出一條經過所有城市的路徑,要求該路徑只經過每座城市一次並且旅行總成本最低。從任意一座城市出發,經過每一座城市之後,再回到出發城市結束旅行。

課上給的距離矩陣,可能是疏忽9到3和3到9的距離不一致,但這不妨礙程式設計

#include

#include

#include

#define num_c 10//城市個數

#define max_t 100//種群數量

#define rate 0.6//選擇率

#define generation 1000//迭代次數

#define v_rate 10//變異率百分比

using

namespace

std;

//城市距離矩陣

int distance_t[10][10] = ,,,

,,,,

,,};//種群個體

class solution_t

; //計算當前的cost

void computecost()

//對個體進行變異,也就是隨機交換兩個位置的元素

void variation()

};solution_t population[max_t];//種群

solution_t nextpo[max_t];//儲存子代的臨時陣列

//初始化種群,先將個體順序初始化,就是賦值為0123456789

//然後隨機擾動5次,隨機交換兩個位置的元素

void init(solution_t(&population)[max_t])

for (int j = 0; j < num_c / 2; j++)

}}//選擇一定比例適應度高的個體,並從保留下來的個體中隨機選擇個體,填充剩餘位置

void select(solution_t(&population)[max_t])

}//交叉的過程,a b是父代 a1 b1是子代

void exchange(solution_t a, solution_t b, solution_t &a1, solution_t &b1)}}

if (num == 0)

flag = false;

}flag = true;

while (flag)}}

if (num == 0)

flag = false;

}//輸出a1 b1 不用a b是為了不改變父代

for (int i = 0; i < num_c; i++)

}int main()

//隨機變異

for (int j = 0; j < max_t; j++)

//計算適應度

for (int j = 0; j < max_t; j++)

nextpo[j].computecost();

//覆蓋父代

for (int j = 0; j < max_t; j++)

population[j] = nextpo[j];

//輸出

cout

<< "generation: "

<< i << endl;

for (int k = 0; k < max_t; k++)

cout

<< " cost:"

<< population[k].cost << endl;}}

return

0;}

遺傳演算法得到的不一定是最優解,而是近似最優解,所以可以每次收斂到的數值都不一樣。

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

遺傳演算法解決旅行商問題

給出常數 城市數量 變異概率 種群數 子群數,父代傳遞比例 隨機生成城市距離矩陣,將經過城市的順序作為基因序列進行編碼,適應度和走過n個城市的總距離成反比。先隨機構建出第一批種群的個體,按照父代傳遞比例按適應度從高到底選出個體複製進子群 我選的是0.2 之後子群其他個體通過父代種群進行雜交和變異生成...

C語言編寫遺傳演算法解決TSP旅行商問題

最近在上計算智慧型的課,老師剛剛教了遺傳演算法,布置了用遺傳演算法解決tsp的問題的作業,於是經過幾小時的奮戰,終於編寫完成。首先先對tsp問題進行分析。tsp問題,也就是旅行商問題,題目的大題內容是 一位旅行商,要遍遊n座城市 城市數量記為num city 已知每兩座城市之間的位置,要求每座城市必...