網上找到一篇不錯的**:
然後我用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...