遺傳演算法解決TSP問題(C 實現)

2021-10-02 06:32:42 字數 3454 閱讀 4961

巡迴旅行商問題

1.1給定一組n個城市和倆倆之間的直達距離,尋找一條閉合的旅程,使得每個城市剛好經過一次且總的旅行距離最短。

1.2 tsp問題也稱為貨郎擔問題,是乙個古老的問題。最早可以追溯到2023年euler提出的騎士旅行的問題。2023年,由美國蘭德公司推動,tsp成為近代組合優化領域的典型難題。

1.3 tsp是乙個具有廣泛的應用背景和重要理論價值的組合優化問題。 近年來,有很多解決該問題的較為有效的演算法不斷被推出,例如hopfield神經網路方法,模擬退火方法以及遺傳演算法方法等。

1.n>=8。

2.隨即生成n個城市間的連線矩陣。

3.指定起始城市。

4.給出每一代的最優路線和總路線長度。

5.以代數t作為結束條件,t>=50。

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int city_num =8;

//城市數量

const

int unit_num =

100;

//群體規模

double ps =

0.01

;//變異概率

const

int genmax =50;

//最大迭代數

//城市間距離矩陣

int length_table[city_num]

[city_num]=,

,,,,

,,};

class

unit

;bool

cmp(unit u1, unit u2)

bool

isequal

(unit u1, unit u2)

bool

i***ist

(vector temp, unit u)

void

printpath

(unit u)

class

group

;group::

group()

; flag[start_city]

=true

;for

(int j =

1; j < city_num; j++

) group[i]

.path[city_num]

= group[i]

.path[0]

;}}void group::

assess()

//cout << "alllength: " << alllength << endl;

}int group::

sort_group()

void group::

choose_copy()

}}}void group::

cross

(unit &father, unit &mother) __attribute__ (

(__mingw_attrib_no_optimize));

bool flag2[city_num]=;

int l =1+

(rand()

%(city_num -1)

);int r =1+

(rand()

%(city_num -1)

);if(l > r)

swap

(l, r)

; unit son1, son2;

for(

int i = l; i <= r; i++

)for

(int i =

0; i < l; i++

) son1.path[i]

=temp;}if

(!flag2[father.path[i]])

son2.path[i]

= father.path[i]

;else

son2.path[i]

=temp;}}

for(

int i = r +

1; i <= city_num; i++

) son1.path[i]

=temp;}if

(!flag2[father.path[i]])

son2.path[i]

= father.path[i]

;else

son2.path[i]

=temp;}}

for(

int i =

0; i <= city_num;i++)}

void group::

mutation

(unit &t)

void group::

print()

printf

("最優個體,路徑資訊為:\n");

vector temp;

int length=

sort_group()

;for

(int i =

0; i < unit_num; i++)}

printf

("總權值:%d;\n"

, length)

; temp.

clear()

;}void group::

work()

if(best.length > group[0]

.length)

choose_copy()

;//選擇複製

for(

int j =

0; j +

1< unit_num; j +=2

)//交叉

cross

(group[j]

, group[j +1]

);for(

int j =

0; j < unit_num; j++)}

}unit group[unit_num]

;//種群變數

unit bestone;

//記錄最短路徑

int generation_num;

//記錄當前達到了第幾代

intmain()

第一代

第二代

第50代

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