TSP 旅行商問題 遺傳演算法

2021-08-18 17:38:16 字數 4174 閱讀 5557

問題描述

對於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

13 5 25

14 12 42

15 36 16

16 52 41

17 27 23

18 17 33

19 13 13

20 57 58

21 62 42

22 42 57

23 16 57

24 8 52

25 7 38

26 27 68

27 30 48

28 43 67

29 58 48

30 58 27

31 37 69

32 38 46

33 46 10

34 61 33

35 62 63

36 63 69

37 32 22

38 45 35

39 59 15

40 5 6

41 10 17

42 21 10

43 5 64

44 30 15

45 39 10

46 32 39

47 25 32

48 25 55

49 48 28

50 56 37

51 30 40

最優解:426

遺傳演算法基本流程
1、初始化種群,隨機產生多組可行解;

2、開始迴圈;

2.a、選擇,計算種群中每個個體的適應值,根據適應值選擇出新的種群替換原來的種群,使得適應值越大的個體被保留下來的可能越大;

2.b、交叉,將種群中的個體兩兩相鄰組合,對每對個體都有一定的交叉概率,使得其交叉互換部分,產生新的兩個個體,替換源個體;

2.c、變異,對種群中的每個個體,都有一定的變異概率,使該個體的部分變異;

3、退出迴圈體,新種群中的最優解達到目標;

遺傳演算法在tsp問題上的應用流程
1、初始化種群,隨機產生多組可行解;

2、開始迴圈;

2.a、選擇,計算種群中每個個體的適應值,根據適應值選擇出新的種群替換原來的種群,使得適應值越大的個體被保留下來的可能越大;

2.b、交叉,將種群中的個體兩兩相鄰組合,對每對個體都有一定的交叉概率,使得其交叉互換相同長度的部分城市序列,產生新的兩個個體,合法化後替換源個體;

2.c、變異,對種群中的每個個體即每個序列,都有一定的變異概率,使該個體的部分變異,即隨機選擇序列中的兩個城市,交換其順序;

3、退出迴圈體,迭代次數控制迴圈結束;

【注1】適應值為路徑總長的倒數;

【注2】交叉部分可能會產生不合法的後代,所以需要用函式處理一下,使其合法,即路徑中不存在重複節點;

引數設定
種群數量 pop_size = 300;

變異概率 u = 0.1;

交叉概率 v = 0.9;

迭代次數 k = 1000;

測試結果

演算法**

#include

#include

#include

#include

#include

using namespace std;

typedef struct node city;

const int num = 100;//city number

const int width = 100;//

const int height = 100;//

const int pop_size = 300;//種群大小

int seq_pop[pop_size][num];//種群

double energy[pop_size];//個體能量

double fitness[pop_size];//適應度

double sum_fitness = 0;

double sum_energy = 0;//總能量

double u = 0.1;//變異概率大於0.001

double v = 0.9;//交叉概率大於0.001

city citys[num];//citys

double dic[num][num];//distance from two citys;

int n;//real citys

int seq = 0;//當前最優序列

double answer;//最優解

int k = 1000;//迭代次數

void init()

void set_dic()

}}double dic_two_point(city a, city b)

double count_energy(int* conf)

temp += dic_two_point(citys[conf[0]], citys[conf[n - 1]]);

return temp;

}void generate(int* s)

v[s[i]] = true;

}}void set_fitness()

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

}int generate_pop()

}answer = count_energy(seq_pop[0]);

return maxi;

}int cho()

}int choose()

}for (int i = 0; i < pop_size; ++i)

}return maxi;

}void solve(int seq)

else }}

}}int recom()

else

}solve(t_seq[0]);

solve(t_seq[1]);

if (count_energy(t_seq[0]) < energy[i])

}if (count_energy(t_seq[1]) < energy[i + 1]) }}

sum_energy = 0;

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

}set_fitness();

return maxi;

}int vari()

}sum_energy = 0;

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

}set_fitness();

return maxi;

}void test()

while (!ifile.eof())

}void moni()

set_fitness();//設定適應度

while (t_k--)

t = choose();//選擇

if (t >= 0 && ans > energy[t])

t = recom();//雜交

if (t >= 0 && ans > energy[t])

t = vari();//變異

if (t >= 0 && ans > energy[t])

}if (answer > ans)

}void output()

cout << "the length of the road is "

<< answer << endl;

}int main()

return

0;}

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

在旅行商問題中,給定一組城市及每座城市與其他城市之間的旅行成本,目標是找出一條經過所有城市的路徑,要求該路徑只經過每座城市一次並且旅行總成本最低。從任意一座城市出發,經過每一座城市之後,再回到出發城市結束旅行。課上給的距離矩陣,可能是疏忽9到3和3到9的距離不一致,但這不妨礙程式設計 include...

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

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

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

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