python實現遺傳演算法(旅行商問題)

2021-08-15 09:38:53 字數 3037 閱讀 5629

網上找到一篇不錯的**:

然後我用python對其做了演算法實現,貼**:

from matplotlib import pyplot as plt

import numpy as np

import random

def coordinate_init(size):

# 產生座標字典

coordinate_dict = {}

coordinate_dict[0] = (-size, 0) # 起點是(-size,0)

up=1

for i in range(1, size + 1): # 順序標號隨機座標

x=np.random.uniform(-size,size)

if np.random.randint(0,2)==up:

y=np.sqrt(size**2-x**2)

else:

y=-np.sqrt(size**2-x**2)

coordinate_dict[i]=(x,y)

coordinate_dict[size + 1] = (-size, 0) # 終點是(-size,0),構成乙個圓

return coordinate_dict

def distance_matrix(coordinate_dict, size): # 生成距離矩陣

d = np.zeros((size + 2, size + 2))

for i in range(size + 1):

for j in range(size + 1):

if (i == j):

continue

if (d[i][j] != 0):

continue

x1 = coordinate_dict[i][0]

y1 = coordinate_dict[i][1]

x2 = coordinate_dict[j][0]

y2 = coordinate_dict[j][1]

distance = np.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)

if (i == 0):

d[i][j] = d[size + 1][j] = d[j][i] = d[j][size + 1] = distance

else:

d[i][j] = d[j][i] = distance

return d

def path_length(d_matrix, path_list, size): # 計算路徑長度

length = 0

for i in range(size + 1):

length += d_matrix[path_list[i]][path_list[i + 1]]

return length

def shuffle(my_list):#起點和終點不能打亂

效果的話,只能算差強人意了。很明顯最優路徑是乙個圈,沒有交叉的,然而史上最優路徑也不是乙個圈,更不用說最後一代了。演算法本身的缺陷吧,要做更多的調優和設計更好的運算元,才能有一定概率得到最優解吧。

缺點如下:

1、早熟。這是最大的缺點,即演算法對新空間的探索能力是有限的,也容易收斂到區域性最優解。

2、大量計算。涉及到大量個體的計算,當問題複雜時,計算時間是個問題。

3、處理規模小。目前對於維數較高的問題,還是很難處理和優化的。

4、難於處理非線性約束。對非線性約束的處理,大部分演算法都是新增懲罰因子,這是一筆不小的開支。

5、穩定性差。因為演算法屬於隨機類演算法,需要多次運算,結果的可靠性差,不能穩定的得到解。

最大優點:不需要知道怎麼去解決乙個問題,需要知道是,用什麼方式對可行解編碼,使得它能被遺傳演算法機制所利用。

整體來看,是不如模擬退火演算法的,畢竟模擬退火在引數不錯的條件下,得到全域性最優解的概率收斂到1。而遺傳演算法只能說得到不錯的解,至於是不是最優解,看運氣了。。。以上。

TSP 旅行商問題 遺傳演算法

問題描述 對於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 ...

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

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

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

以下是遺傳演算法 ga 解決旅行商問題 tsp 原始碼 include include include include include using namespace std define inf 1000 typedef struct individual bool compare individ...