問題描述
對於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、初始化種群,隨機產生多組可行解;遺傳演算法在tsp問題上的應用流程2、開始迴圈;
2.a、選擇,計算種群中每個個體的適應值,根據適應值選擇出新的種群替換原來的種群,使得適應值越大的個體被保留下來的可能越大;
2.b、交叉,將種群中的個體兩兩相鄰組合,對每對個體都有一定的交叉概率,使得其交叉互換部分,產生新的兩個個體,替換源個體;
2.c、變異,對種群中的每個個體,都有一定的變異概率,使該個體的部分變異;
3、退出迴圈體,新種群中的最優解達到目標;
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 已知每兩座城市之間的位置,要求每座城市必...