程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

基於改進的螞蟻群算法求解最短路徑問題、二次分配問題、背包問題【Matlab&Python代碼實現】

編輯:Python

                          

                                    歡迎您的到來

                      個人主頁:電力系統科研室

                    專欄目錄:電力系統與算法之美

                           

【現在公眾號名字改為:荔枝科研社】

博主課外興趣:中西方哲學,送予讀者:

做科研,涉及到一個深在的思想系統,需要科研者邏輯缜密,踏實認真,但是不能只是努力,很多時候借力比努力更重要,然後還要有仰望星空的創新點和啟發點。在我這個專欄記錄我有空時的一些哲學思考和科研筆記:科研和哲思。建議讀者按目錄次序逐一浏覽,免得驟然跌入幽暗的迷宮找不到來時的路,它不足為你揭示全部問題的答案,但若能讓人胸中升起一朵朵疑雲,也未嘗不會釀成晚霞斑斓的別一番景致,萬一它居然給你帶來了一場精神世界的苦雨,那就借機洗刷一下原來存放在那兒的“真理”上的塵埃吧。

     或許,雨過雲收,神馳的天地更清朗.......

本文目錄如下:️️️

目錄

1 知識點

 1.1 蟻群算法步驟

1.2 蟻群算法程序

2 螞蟻算法求解最短路徑問題——Python實現

2.1 源碼實現

2.2  ACA_TSP實現

3 螞蟻算法求解最短路徑問題——Matlab實現

4 螞蟻算法求解二次指派問題——Matlab實現

5 螞蟻算法求解背包問題——Matlab實現

6 改進螞蟻算法——BP神經網絡螞蟻優化算法

 7 寫在最後

1 知識點

詳細知識點見:智能優化算法—蟻群算法(Python實現)

我們這一節知識點只講蟻群算法求解最短路徑步驟及流程。

 1.1 蟻群算法步驟

     設螞蟻的數量為m,地點的數量為n,地點i與地點j之間相距Dij,t時刻地點i與地點j連接的路徑上的信息素濃度為Sij,初始時刻每個地點間路徑上的信息素濃度相等。

   螞蟻k根據各個地點間連接路徑上的信息素決定下一個目標地點,Pijk表示t時刻螞蟻k從地點i轉移的概率,概率計算公式如下:

上式中,為啟發函數,,表示螞蟻從地點i轉移到地點j的期望程度;為螞蟻k即將訪問地點的集合,開始時中有n-1個元素(除出發地點),隨時間的推移,螞蟻每到達下一個地點,中的元素便減少一個,直至空集,即表示所有地點均訪問完畢;a為信息素重要程度因子,值越大,表明信息素的濃度在轉移中起到的作用越大,也就是說螞蟻選擇距離近的下一個地點的概率更大,β為啟發函數重要程度因子。

 螞蟻在釋放信息素的同時,每個地點間連接路徑上的信息素逐漸消失,用參數

 表示信息素的揮發程度。因此,當所有螞蟻完成一次循環後,每個地點間連接路徑上的信息素濃度需更新,也就是有螞蟻路過並且留下信息素,有公式表示為:

其中,表示第k只螞蟻在地點i與j連接路徑上釋放的信息素濃度;表示所有螞蟻在地點i與j連接路徑上釋放的信息素濃度之和;Q為常數,表示螞蟻循環一次所釋放的信息素總量;Lk表示第k只螞蟻經過路徑的長度,總的來說,螞蟻經過的路徑越短,釋放的信息素濃度越高,最終選出最短路徑。 

1.2 蟻群算法程序

(1)參數初始化

在尋最短路錢,需對程序各個參數進行初始化,蟻群規模m、信息素重要程度因子α、啟發函數重要程度因子β、信息素會發因子、最大迭代次數ddcs_max,初始迭代值為ddcs=1。

(2)構建解空間

將每只螞蟻隨機放置在不同的出發地點,對螞蟻訪問行為按照公式計算下一個訪問的地點,直到所有螞蟻訪問完所有地點。

(3)更新信息素

計算每只螞蟻經過的路徑總長Lk,記錄當前循環中的最優路徑,同時根據公式對各個地點間連接路徑上的信息素濃度進行更新。

(4)判斷終止

迭代次數達到最大值前,清空螞蟻經過的記錄,並返回步驟(2)。

2 螞蟻算法求解最短路徑問題——Python實現

2.1 源碼實現

智能優化算法—蟻群算法(Python實現)

2.2  ACA_TSP實現

補充知識點:scipy.spatial.distance.cdist

#============導入相關庫=================
import numpy as np
from scipy import spatial
import pandas as pd
import matplotlib.pyplot as plt
from sko.ACA import ACA_TSP
num_points = 25
points_coordinate = np.random.rand(num_points, 2) # 生成點的坐標
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')#函數用於計算兩個輸入集合的距離
def cal_total_distance(routine):
num_points, = routine.shape
return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])
#=============ACA_TSP解決==================================
aca = ACA_TSP(func=cal_total_distance, n_dim=num_points,
size_pop=50, max_iter=200,
distance_matrix=distance_matrix)
best_x, best_y = aca.run()
#=============可視化=======================
fig, ax = plt.subplots(1, 2)
best_points_ = np.concatenate([best_x, [best_x[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
pd.DataFrame(aca.y_best_history).cummin().plot(ax=ax[1])
plt.show()

       

3 螞蟻算法求解最短路徑問題——Matlab實現

 

完整代碼點這裡: 螞蟻算法求解最短路徑

 

4 螞蟻算法求解二次指派問題——Matlab實現

      在社會網絡分析中,有一種方法用來研究關系之間的關系,通俗來講,就是研究兩個方陣的相關性和回歸性。這種方法叫做QAP(Quadratic Assignment Procedure,二次指派程序)。它對兩個方陣各個格值的相似性進行比較,給出兩個矩陣之間的相關系數,同時對系數進行非參數檢驗,它以對矩陣數據的置換為基礎。

          QAP與其他標准的統計程序的不同之處在於,矩陣的各個值之間不相互獨立,因此用許多標准的統計程序就不能對其進行參數估計和統計檢驗,否則會計算出錯誤的標准差。對於這個問題,學者們利用一種隨機化檢驗方法(randomization test)來檢驗,QAP屬於其中一種。

 

 完整代碼需要點這裡:  螞蟻算法求解二次指派問題

 

5 螞蟻算法求解背包問題——Matlab實現

 完整代碼點這裡:螞蟻算法求解背包問題

 

 

 

6 改進螞蟻算法——BP神經網絡螞蟻優化算法

改進了少許,感興趣可以看看,可能還需要你自己的加工:BP神經網絡螞蟻優化算法

 7 寫在最後

部分理論引用網絡文獻,若有侵權請聯系博主刪除。 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved