在旅行商問題中,給定一組城市及每座城市與其他城市之間的旅行成本,目標是找出一條經過所有城市的路徑,要求該路徑只經過每座城市一次並且旅行總成本最低。從任意一座城市出發,經過每一座城市之後,再回到出發城市結束旅行。
課上給的距離矩陣,可能是疏忽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 已知每兩座城市之間的位置,要求每座城市必...