日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python蚁群算法 路径规划_蚁群算法(1) - Python实现

發布時間:2025/3/15 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python蚁群算法 路径规划_蚁群算法(1) - Python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4

5 #建立“螞蟻”類

6 classAnt(object):7 def __init__(self, path):8 self.path = path #螞蟻當前迭代整體路徑

9 self.length = self.calc_length(path) #螞蟻當前迭代整體路徑長度

10

11 def calc_length(self, path_): #path=[A, B, C, D, A]注意路徑閉環

12 length_ =013 for i in range(len(path_)-1):14 delta = (path_[i].x - path_[i+1].x, path_[i].y - path_[i+1].y)15 length_ +=np.linalg.norm(delta)16 returnlength_17

18 @staticmethod19 def calc_len(A, B): #靜態方法,計算城市A與城市B之間的距離

20 return np.linalg.norm((A.x - B.x, A.y -B.y))21

22

23 #建立“城市”類

24 classCity(object):25 def __init__(self, x, y):26 self.x =x27 self.y =y28

29

30 #建立“路徑”類

31 classPath(object):32 def __init__(self, A): #A為起始城市

33 self.path =[A, A]34

35 def add_path(self, B): #追加路徑信息,方便計算整體路徑長度

36 self.path.append(B)37 self.path[-1], self.path[-2] = self.path[-2], self.path[-1]38

39

40 #構建“蟻群算法”的主體

41 classACO(object):42 def __init__(self, ant_num=50, maxIter=300, alpha=1, beta=5, rho=0.1, Q=1):43 self.ants_num = ant_num #螞蟻個數

44 self.maxIter = maxIter #蟻群最大迭代次數

45 self.alpha = alpha #信息啟發式因子

46 self.beta = beta #期望啟發式因子

47 self.rho = rho #信息素揮發速度

48 self.Q = Q #信息素強度

49 ###########################

50 self.deal_data('coordinates.dat') #提取所有城市的坐標信息

51 ###########################

52 self.path_seed = np.zeros(self.ants_num).astype(int) #記錄一次迭代過程中每個螞蟻的初始城市下標

53 self.ants_info = np.zeros((self.maxIter, self.ants_num)) #記錄每次迭代后所有螞蟻的路徑長度信息

54 self.best_path = np.zeros(self.maxIter) #記錄每次迭代后整個蟻群的“歷史”最短路徑長度

55 ###########################

56 self.solve() #完成算法的迭代更新

57 self.display() #數據可視化展示

58

59 defdeal_data(self, filename):60 with open(filename, 'rt') as f:61 temp_list = list(line.split() for line in f) #臨時存儲提取出來的坐標信息

62 self.cities_num = len(temp_list) #1. 獲取城市個數

63 self.cities = list(City(float(item[0]), float(item[1])) for item in temp_list) #2. 構建城市列表

64 self.city_dist_mat = np.zeros((self.cities_num, self.cities_num)) #3. 構建城市距離矩陣

65 for i inrange(self.cities_num):66 A =self.cities[i]67 for j inrange(i, self.cities_num):68 B =self.cities[j]69 self.city_dist_mat[i][j] = self.city_dist_mat[j][i] =Ant.calc_len(A, B)70 self.phero_mat = np.ones((self.cities_num, self.cities_num)) #4. 初始化信息素矩陣

71 #self.phero_upper_bound = self.phero_mat.max() * 1.2 ###信息素濃度上限

72 self.eta_mat = 1/(self.city_dist_mat + np.diag([np.inf]*self.cities_num)) #5. 初始化啟發函數矩陣

73

74 defsolve(self):75 iterNum = 0 #當前迭代次數

76 while iterNum <77 self.random_seed>

78 delta_phero_mat = np.zeros((self.cities_num, self.cities_num)) #初始化每次迭代后信息素矩陣的增量

79 ##########################################################################

80 for i inrange(self.ants_num):81 city_index1 = self.path_seed[i] #每只螞蟻訪問的第一個城市下標

82 ant_path = Path(self.cities[city_index1]) #記錄每只螞蟻訪問過的城市

83 tabu = [city_index1] #記錄每只螞蟻訪問過的城市下標,禁忌城市下標列表

84 non_tabu = list(set(range(self.cities_num)) -set(tabu))85 for j in range(self.cities_num-1): #對余下的城市進行訪問

86 up_proba = np.zeros(self.cities_num-len(tabu)) #初始化狀態遷移概率的分子

87 for k in range(self.cities_num-len(tabu)):88 up_proba[k] = np.power(self.phero_mat[city_index1][non_tabu[k]], self.alpha) *\89 np.power(self.eta_mat[city_index1][non_tabu[k]], self.beta)90 proba = up_proba/sum(up_proba) #每條可能子路徑上的狀態遷移概率

91 while True: #提取出下一個城市的下標

92 random_num =np.random.rand()93 index_need = np.where(proba >random_num)[0]94 if len(index_need) >0:95 city_index2 =non_tabu[index_need[0]]96 break

97 ant_path.add_path(self.cities[city_index2])98 tabu.append(city_index2)99 non_tabu = list(set(range(self.cities_num)) -set(tabu))100 city_index1 =city_index2101 self.ants_info[iterNum][i] =Ant(ant_path.path).length102 if iterNum == 0 and i == 0: #完成對最佳路徑城市的記錄

103 self.best_cities =ant_path.path104 else:105 if self.ants_info[iterNum][i] < Ant(self.best_cities).length: self.best_cities =ant_path.path106 tabu.append(tabu[0]) #每次迭代完成后,使禁忌城市下標列表形成完整閉環

107 for l inrange(self.cities_num):108 delta_phero_mat[tabu[l]][tabu[l+1]] += self.Q/self.ants_info[iterNum][i]109

110 self.best_path[iterNum] =Ant(self.best_cities).length111

112 self.update_phero_mat(delta_phero_mat) #更新信息素矩陣

113 iterNum += 1

114

115 defupdate_phero_mat(self, delta):116 self.phero_mat = (1 - self.rho) * self.phero_mat +delta117 #self.phero_mat = np.where(self.phero_mat > self.phero_upper_bound, self.phero_upper_bound, self.phero_mat) # 判斷是否超過濃度上限

118

119 def random_seed(self): #產生隨機的起始點下表,盡量保證所有螞蟻的起始點不同

120 if self.ants_num <= self.cities_num: #螞蟻數 <= 城市數

121 self.path_seed[:] =np.random.permutation(range(self.cities_num))[:self.ants_num]122 else: #螞蟻數 > 城市數

123 self.path_seed[:self.cities_num] =np.random.permutation(range(self.cities_num))124 temp_index =self.cities_num125 while temp_index + self.cities_num <=self.ants_num:126 self.path_seed[temp_index:temp_index + self.cities_num] =np.random.permutation(range(self.cities_num))127 temp_index +=self.cities_num128 temp_left = self.ants_num %self.cities_num129 if temp_left !=0:130 self.path_seed[temp_index:] =np.random.permutation(range(self.cities_num))[:temp_left]131

132 def display(self): #數據可視化展示

133 plt.figure(figsize=(6, 10))134 plt.subplot(211)135 plt.plot(self.ants_info, 'g.')136 plt.plot(self.best_path, 'r-', label='history_best')137 plt.xlabel('Iteration')138 plt.ylabel('length')139 plt.legend()140 plt.subplot(212)141 plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'g-')142 plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'r.')143 plt.xlabel('x')144 plt.ylabel('y')145 plt.savefig('ACO.png', dpi=500)146 plt.show()147 plt.close()148

149

150 ACO()

77>

總結

以上是生活随笔為你收集整理的python蚁群算法 路径规划_蚁群算法(1) - Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。