#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問題,遺傳演算法大體上是可以先隨機生成一組大量的解空間,作為乙個初始的種群,然後按照一定的策略讓種群自由交叉 也就是傳說中的交配 變異。按照一定的策略淘汰種群中不符合預期目的的個體。目前大多數遺傳演算法使用的是根據隨機生成的概率與給定的交...