tsp遺傳演算法

2021-10-25 01:39:07 字數 3605 閱讀 1942

#include

#include

#include

#include

#include

#include

using

namespace std;

#define m 10

// 種群規模

#define n 31

// 省會、首府城市數量

#define t 10000

// 遺傳代數

#define earth_radius 6378.137

#define pi acos(-1)

int bestone[n]

;// 最優個體

int bestdistance=

100000

;//最優路徑

int bestt;

//最優代數

int t;

//當前代數

int oldpopulation[m]

[n];

// 父種群

int newpopulation[m]

[n];

// 子種群

int fit[m]

;// 種群適應度

double lfit[m]

;// 種群累計適應度

double pcorss=

0.8;

// 交叉概率

double pmutate=

0.1;

// 變異概率

//中國31個省會、首府城市的經緯度

double city_pos[n][2

]=,,

,,,,

,,,,

,,,,

,,,,

,,,,

,,,,

,,,,

};//省會城市名稱

string city_name[n]=;

double

rad(

double d)

void

copygh

(int k,

int kk)

}double

getdistance

(double lat1,

double lng1,

double lat2,

double lng2)

/將路徑作為種群適應度返回

double

pathlen

(int

* arry)

int last_city = arry[n-1]

;// 最後乙個城市序號

double last_dis =

getdistance

(city_pos[first_city][0

],city_pos[first_city][1

],city_pos[last_city][0

],city_pos[last_city][1

]); path = path + last_dis;

return path;

// 返回總的路徑長度}/*

初始化種群

*/void

init()

if(j==k)

j++;}

}}//計算種群的累積概率

void

countlrate()

lfit[0]

=(double

)(fit[0]

/sumrate)

;for

(int k=

1;kvoid

variation

(int k)

//變異

int temp = newpopulation[k]

[pos1]

; newpopulation[k]

[pos1]

= newpopulation[k]

[pos2]

; newpopulation[k]

[pos2]

= temp;

// 交換兩個點

}//挑選某代種群最優個體,直接複製到子代

//前提是種群的適應度已經計算出來

void

selectbest()

}if(bestdistance > maxevaluation)

}// system.out.println("代數 " + t + " " + maxevaluation);

// 複製染色體,k表示新染色體在種群中的位置,kk表示舊的染色體在種群中的位置

copygh(0

, maxid)

;// 將當代種群中適應度最高的染色體k複製到新種群中,排在第一位0}/*

輪盤賭挑選子代個體

*/void

selectchild()

} selectid = i;

copygh

(k, selectid);}

}bool

haselement

(int

* a,

int b)

}return

false;}

//交叉

void

ordercrossover

(int k1,

int k2)

if(ran1 > ran2)

for(

int i = ran1; i <= ran2; i++

)for

(int i =

0; i < n; i++

)for

(int j =

0; j < n; j++)}

}for

(int i =

0; i < n; i++

)for

(int j =

0; j < n; j++)}

}}//進化

void

evolution()

else

r =((

double

)rand()

)/(rand_max+

1.0)

;// 變異概率

if(r < pmutate)}}

}int

main()

cout<}for

(t =

0; t < t; t++)}

// 計算種群適應度

for(k =

0; k < m; k++

)// 計算種群中各個個體的累積概率

countlrate()

;}cout<<

"末代種群: "

;for

(k =

0; k < m; k++

) cout<} cout

"最佳個體: "

;for

(i =

0; i < n; i++

) cout

clock()

; cout<<

; cout<<

(finish-start)

*1000

<<

"ms"

;return0;

}

tsp問題 遺傳演算法解決

tsp問題最簡單的求解方法是列舉法。它的解是多維的 多區域性極值的 趨於無窮大的複雜解的空間,搜尋空間是n個點的所有排列的集合,大小為 n 1 可以形象地把解空間看成是乙個無窮大的丘陵地帶,各山峰或山谷的高度即是問題的極值。求解tsp,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。這一篇將...

遺傳演算法解決TSP問題

基本原理在 中有注釋 1 include2 include 3 include 4 include5 include 6 using std string 7 8struct position9 1617 double tsp int n,struct position position,int t...

使用遺傳演算法解決TSP問題

遺傳演算法顧名思義就是模擬生物界的自然選擇原理,比如對於tsp問題,遺傳演算法大體上是可以先隨機生成一組大量的解空間,作為乙個初始的種群,然後按照一定的策略讓種群自由交叉 也就是傳說中的交配 變異。按照一定的策略淘汰種群中不符合預期目的的個體。目前大多數遺傳演算法使用的是根據隨機生成的概率與給定的交...