首頁 > 軟體

Python實現蟻群演演算法

2022-03-04 19:01:00

1、引言

在自然界中各種生物群體顯現出來的智慧近幾十年來得到了學者們的廣泛關注,學者們通過對簡單生物體的群體行為進行模擬,進而提出了群智慧演演算法。其中,模擬蟻群覓食過程的蟻群優化演演算法(Ant Colony Optimization, ACO)和模擬鳥群運動方式的粒子群演演算法(Particle Swarm Optimization, PSO)是兩種最主要的群智慧演演算法。

蟻群演演算法是一種源於大自然生物世界的新的仿生進化演演算法,由義大利學者M. Dorigo, V. Maniezzo和A.Colorni等人於20世紀90年代初期通過模擬自然界中螞蟻集體尋徑行為而提出的一種基於種群的啟發式隨機搜尋演演算法"。螞蟻有能力在沒有任何提示的情形下找到從巢穴到食物源的最短路徑,並且能隨環境的變化,適應性地搜尋新的路徑,產生新的選擇。其根本原因是螞蟻在尋找食物時,能在其走過的路徑上釋放一種特殊的分泌物——資訊素(也稱外激素),隨著時間的推移該物質會逐漸揮發,後來的螞蟻選擇該路徑的概率與當時這條路徑上資訊素的強度成正比。當一條路徑上通過的螞蟻越來越多時,其留下的資訊素也越來越多,後來螞蟻選擇該路徑的概率也就越高,從而更增加了該路徑上的資訊素強度。而強度大的資訊素會吸引更多的螞蟻,從而形成一種正反饋機制。通過這種正反饋機制,螞蟻最終可以發現最短路徑。

最早的蟻群演演算法是螞蟻系統(Ant System,AS),研究者們根據不同的改進策略對螞蟻系統進行改進並開發了不同版本的蟻群演演算法,併成功地應用於優化領域。用該方法求解旅行商(TSP)問題、分配問題、車間作業排程(job-shop)問題,取得了較好的試驗結果。蟻群演演算法具有分散式計算、無中心控制和分散式個體之間間接通訊等特徵,易於與其他優化演演算法相結合,它通過簡單個體之間的共同作業表現出了求解複雜問題的能力,已被廣泛應用於求解優化問題。蟻群演演算法相對而言易於實現,且演演算法中並不涉及複雜的數學操作,其處理過程對計算機的軟硬體要求也不高,因此對它的研究在理論和實踐中都具有重要的意義。

目前,國內外的許多研究者和研究機構都開展了對蟻群演演算法理論和應用的研究,蟻群演演算法已成為國際計算智慧領域關注的熱點課題。雖然目前蟻群演演算法沒有形成嚴格的理論基礎,但其作為一種新興的進化演演算法已在智慧優化等領域表現出了強大的生命力。

2 蟻群演演算法理論

蟻群演演算法是對自然界螞蟻的尋徑方式進行模擬而得出的一種仿生演演算法。螞蟻在運動過程中,能夠在它所經過的路徑上留下資訊素進行資訊傳遞,而且螞蟻在運動過程中能夠感知這種物質,並以此來指導自己的運動方向。因此,由大量螞蟻組成的蟻群的集體行為便表現出一種資訊正反饋現象:某一路徑上走過的螞蟻越多,則後來者選擇該路徑的概率就越大。

3 演演算法理論圖解 

(1)在自然界中,螞蟻的食物源總是隨機分散於蟻巢周圍,在蟻群協調、分工、合作後總能找到一條通往食物源的最短路徑。現實中,我們能觀察到大量螞蟻在巢穴與食物源之間形成近乎直線的路徑,而不是曲線、圓等其他形狀,如圖(a)。

(2)螞蟻群體不僅能完成複雜的任務,並且還能適應環境的變化,如在蟻群運動路線上突然出現障礙物時,一開始各只螞蟻分佈是均勻的,不管路徑長短,螞蟻總是先按同等概率選擇各條路徑,如圖(b)。

(3)螞蟻在運動過程中,能在其經過的路徑上留下資訊素,並且能感知到這種物質的存在及其強度,並以此指導自己運動的方向,螞蟻傾向於資訊素濃度高的方向移動。在相同時間內較短路徑上的資訊素量就遺留得較多,則選擇較短路徑得螞蟻也隨即增多,如圖(c)。

 

(4)不難看出,由於大量螞蟻組成得蟻群集體行為表現出的一種資訊正反饋現象,在某一路徑上走過的螞蟻越多,則後來者選擇該路徑的概率就越大,螞蟻個體質檢就是通過這種資訊交流機制來搜尋食物,並最終沿著最短路徑行進,如圖(d)。

4 人工蟻群優化過程 

基於以上真實蟻群尋找食物時的最優路徑選擇問題,可以構造人工蟻群,來解決最佳化問題,如TSP問題。人工蟻群中把具有簡單功能的工作單元看作螞蟻。二者的相似之處在於都是優先選擇資訊素濃度大的路徑。較短路徑的資訊素濃度高,所以能夠最終被所有螞蟻選擇,也就是最終的優化結果。兩者的區別在於人工蟻群有一定的記憶能力,能夠記憶已經存取過的節點。同時,人工蟻群再選擇下一條路徑的時候是按一定演演算法規律有意識地尋找最短路徑,而不是盲目的。例如在TSP問題中,可以預先知道當前城市到下一個目的地的距離。

在TSP問題的人工蟻群演演算法中,假設m只螞蟻在圖的相鄰節點間移動,從而共同作業非同步地得到問題的解。每隻螞蟻的一步轉移概率由圖中的每條邊上的兩類引數決定:一是資訊素值,也稱資訊素痕跡;二是可見度,即先驗值。

資訊素的更新方式有兩種:一是揮發,也就是所有路徑上的資訊素以一定的比率減少,模擬自然蟻群的資訊素隨時間揮發的過程;二是增強,給評價值“好”(有螞蟻走過)的邊增加資訊素。

螞蟻向下一個目標的運動是通過一個隨機原則來實現的,也就是運用當前所在節點儲存的資訊,計算出下一步可達節點的概率,並按此概率實現一步移動,如此往復,越來越接近最優解。

螞蟻在尋找過程中,或在找到一個解後,會評估該解或解的一部分的優化程度,並把評價資訊儲存在相關連線的資訊素中。

這種演演算法有別於傳統程式設計模式,其優勢在於,避免了冗長的程式設計和籌劃,程式本身是基於一定規則的隨機執行來尋找最佳設定。也就是說,當程式最開始找到目標的時候,路徑可能不是最優的。但是,程式可以通過螞蟻尋找食物的時候的資訊素原理,不斷地去修正原來的路線,使整個路線越來越短,也就是說,程式執行的時間越長(在程式中也就是迭代次數不能太少,同時還要保證一定的螞蟻數量),所獲得的路徑就越可能接近最優路徑。這看起來很類似與我們所見的由無數例子進行歸納概括形成最佳路徑的過程。實際上好似是程式的一個自我學習的過程。

這種優化過程的本質在於

選擇機制:資訊素越多的路徑,被選擇的概率越大。

更新機制:路徑上面的資訊素會隨螞蟻的經過而增長,而且同時也隨時間的推移逐漸揮發消失。

協調機制:螞蟻間實際上是通過分泌物來互相通訊、協同工作的。

蟻群演演算法正是充分利用了選擇、更新和協調的優化機制,即通過個體之間的資訊交流與相互共同作業最終找到最優解,使它具有很強的發現較優解的能力。

事實上,每隻螞蟻並不是像我們想象的需要知道整個世界的資訊,他們其實只關心很小範圍內的眼前資訊,而且根據這些區域性資訊利用幾條簡單的規則進行決策,但是,當叢集裡有無數螞蟻的時候,複雜性的行為就會凸現出來。這就是人工生命、複雜性科學解釋的規律!那麼,這些簡單規則是什麼呢?下面詳細說明:

1、範圍:

螞蟻觀察到的範圍是一個方格世界,螞蟻有一個引數為速度半徑(一般是3),那麼它能觀察到的範圍就是3*3個方格世界,並且能移動的距離也在這個範圍之內。

2、環境:

螞蟻所在的環境是一個虛擬的世界,其中有障礙物,有別的螞蟻,還有資訊素,資訊素有兩種,一種是找到食物的螞蟻灑下的食物資訊素,一種是找到窩的螞蟻灑下的窩的資訊素。每個螞蟻都僅僅能感知它範圍內的環境資訊。環境以一定的速率讓資訊素消失。

3、覓食規則

在每隻螞蟻能感知的範圍內尋找是否有食物,如果有就直接過去。否則看是否有資訊素,並且比較在能感知的範圍內哪一點的資訊素最多,這樣,它就朝資訊素多的地方走,並且每隻螞蟻多會以小概率犯錯誤,從而並不是往資訊素最多的點移動。螞蟻找窩的規則和上面一樣,只不過它對窩的資訊素做出反應,而對食物資訊素沒反應。

4、移動規則

每隻螞蟻都朝向資訊素最多的方向移,並且,當週圍沒有資訊素指引的時候,螞蟻會按照自己原來運動的方向慣性的運動下去,並且,在運動的方向有一個隨機的小的擾動。為了防止螞蟻原地轉圈,它會記住最近剛走過了哪些點,如果發現要走的下一點已經在最近走過了,它就會盡量避開。

5、避障規則:

如果螞蟻要移動的方向有障礙物擋住,它會隨機的選擇另一個方向,並且有資訊素指引的話,它會按照覓食的規則行為。

6、播撒資訊素規則

每隻螞蟻在剛找到食物或者窩的時候撒發的資訊素最多,並隨著它走遠的距離,播撒的資訊素越來越少。

根據這幾條規則,螞蟻之間並沒有直接的關係,但是每隻螞蟻都和環境發生互動,而通過資訊素這個紐帶,實際上把各個螞蟻之間關聯起來了。比如,當一隻螞蟻找到了食物,它並沒有直接告訴其它螞蟻這兒有食物,而是向環境播撒資訊素,當其它的螞蟻經過它附近的時候,就會感覺到資訊素的存在,進而根據資訊素的指引找到了食物。

那麼,螞蟻究竟是怎麼找到食物的呢?

在沒有螞蟻找到食物的時候,環境沒有有用的資訊素,那麼螞蟻為什麼會相對有效的找到食物呢?這要歸功於螞蟻的移動規則,尤其是在沒有資訊素時候的移動規則。首先,它要能儘量保持某種慣性,這樣使得螞蟻儘量向前方移動(開始,這個前方是隨機固定的一個方向),而不是原地無謂的打轉或者震動;其次,螞蟻要有一定的隨機性,雖然有了固定的方向,但它也不能像粒子一樣直線運動下去,而是有一個隨機的干擾。這樣就使得螞蟻運動起來具有了一定的目的性,儘量保持原來的方向,但又有新的試探,尤其當碰到障礙物的時候它會立即改變方向,這可以看成一種選擇的過程,也就是環境的障礙物讓螞蟻的某個方向正確,而其他方向則不對。這就解釋了為什麼單個螞蟻在複雜的諸如迷宮的地圖中仍然能找到隱蔽得很好的食物。當然,在有一隻螞蟻找到了食物的時候,其他螞蟻會沿著資訊素很快找到食物的。

螞蟻如何找到最短路徑的?

這一是要歸功於資訊素,另外要歸功於環境,具體說是計算機時鐘。資訊素多的地方顯然經過這裡的螞蟻會多,因而會有更多的螞蟻聚集過來。假設有兩條路從窩通向食物,開始的時候,走這兩條路的螞蟻數量同樣多(或者較長的路上螞蟻多,這也無關緊要)。當螞蟻沿著一條路到達終點以後會馬上返回來,這樣,短的路螞蟻來回一次的時間就短,這也意味著重複的頻率就快,因而在單位時間裡走過的螞蟻數目就多,灑下的資訊素自然也會多,自然會有更多的螞蟻被吸引過來,從而灑下更多的資訊素……;而長的路正相反,因此,越來越多地螞蟻聚集到較短的路徑上來,最短的路徑就近似找到了。也許有人會問區域性最短路徑和全域性最短路的問題,實際上螞蟻逐漸接近全域性最短路的,為什麼呢?這源於螞蟻會犯錯誤,也就是它會按照一定的概率不往資訊素高的地方走而另闢蹊徑,這可以理解為一種創新,這種創新如果能縮短路途,那麼根據剛才敘述的原理,更多的螞蟻會被吸引過來。

5  基本蟻群演演算法及其流程 

5.1  蟻群演演算法公式 

蟻群演演算法實際上是正反饋原理和啟發式演演算法相結合的一種演演算法。在選擇路徑時,螞蟻不僅利用了路徑上的資訊素,而且用到了城市間距離的倒數作為啟發式因子。實驗結果表明,ant-cycle模型比ant-quantity和ant-density模型有更好的效能。這是因為ant-cycle模型利用全域性資訊更新路徑上的資訊素量,而ant-quantity和ant-density模型使用區域性資訊。 

5.2 蟻群演演算法程式概括

(1)引數初始化

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

(2)構建解空間

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

(3)更新資訊素

計算每隻螞蟻經過的路徑總長Lk,記錄當前迴圈中的最優路徑,同時根據公式對各個地點間連線路徑上的資訊素濃度進行更新。

(4)判斷終止

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

5.3 流程圖 

 6 案例實現

6.1 案例1

求解函數:的最小值,其中x的取值範圍為[-5,5], y的取值範圍為[-5, 5]。這是一個有多個區域性極值的函數。

6.2 Python實現

import numpy as np
from tqdm import tqdm#進度條設定
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定預設字型
mpl.rcParams['axes.unicode_minus'] = False  # 解決儲存影象是負號'-'顯示為方塊的問題
 
 
#============蟻群演演算法求函數極值================
 
#=======適應度函數=====
def func(x,y):
    value = 20*np.power(x*x-y*y,2)-np.power(1-y,2)-3*np.power(1+y,2)+0.3
    return value
#=======初始化引數====
m=20                   #螞蟻個數
G_max=200              #最大迭代次數
Rho=0.9                #資訊素蒸發係數
P0=0.2                 #轉移概率常數
XMAX= 5               #搜尋變數x最大值
XMIN= -5              #搜尋變數x最小值
YMAX= 5               #搜尋變數y最大值
YMIN= -5              #搜尋變數y最小值
X=np.zeros(shape=(m,2)) #蟻群 shape=(20, 2)
Tau=np.zeros(shape=(m,)) #資訊素
P=np.zeros(shape=(G_max,m)) #狀態轉移矩陣
fitneess_value_list=[] #迭代記錄最優目標函數值
#==隨機設定螞蟻初始位置==
for i in range(m):#遍歷每一個螞蟻
    X[i,0]=np.random.uniform(XMIN,XMAX,1)[0] #初始化x
    X[i,1]=np.random.uniform(YMIN,YMAX,1)[0] #初始化y
    Tau[i]=func(X[i,0],X[i,1])
 
step=0.1;                #區域性搜尋步長
for NC in range(G_max):#遍歷每一代
    lamda=1/(NC+1)
    BestIndex=np.argmin(Tau) #最優索引
    Tau_best=Tau[BestIndex] #最優資訊素
     #==計算狀態轉移概率===
    for i in range(m):#遍歷每一個螞蟻
        P[NC,i]=np.abs((Tau_best-Tau[i]))/np.abs(Tau_best)+0.01 #即例最優資訊素的距離
 
    #=======位置更新==========
    for i in range(m):  # 遍歷每一個螞蟻
        #===區域性搜尋====
        if P[NC,i]<P0:
            temp1 = X[i, 0] + (2 * np.random.random() - 1) * step * lamda # x(2 * np.random.random() - 1) 轉換到【-1,1】區間
            temp2 = X[i,1] + (2 * np.random.random() - 1) * step * lamda #y
        #===全域性搜尋====
        else:
            temp1 = X[i, 0] + (XMAX - XMIN) * (np.random.random() - 0.5)
            temp2 = X[i, 0] + (YMAX - YMIN) * (np.random.random() - 0.5)
 
        #=====邊界處理=====
        if temp1 < XMIN:
            temp1 =XMIN
        if temp1 > XMAX:
            temp1 =XMAX
        if temp2 < XMIN:
            temp2 =XMIN
        if temp2 > XMAX:
            temp2 =XMAX
 
 
        #==判斷螞蟻是否移動(選更優===
        if func(temp1, temp2) < func(X[i, 0], X[i, 1]):
            X[i, 0] = temp1
            X[i, 1]= temp2
 
    #=====更新資訊素========
    for i in range(m):  # 遍歷每一個螞蟻
        Tau[i] = (1 - Rho) * Tau[i] + func(X[i, 0], X[i, 1]) #(1 - Rho) * Tau[i] 資訊蒸發後保留的
        index=np.argmin(Tau)#最小值索引
        value=Tau[index]#最小值
    fitneess_value_list.append(func(X[index,0],X[index,1])) #記錄最優目標函數值
 
 
 
#==列印結果===
min_index=np.argmin(Tau)#最優值索引
minX=X[min_index,0]  #最優變數x
minY=X[min_index,1]  #最優變數y
minValue=func(X[min_index,0],X[min_index,1])  #最優目標函數值
 
print('最優變數x',minX,end='')
print('最優變數y',minY,end='n')
print('最優目標函數值',minValue)
 
plt.plot(fitneess_value_list,label='迭代曲線')
plt.legend()
plt.show()

6.3 結果

最優變數x 5.0最優變數y 5.0
最優目標函數值 -123.7

6.4 案例2

                        

6.5 Python實現 

#====================匯入相關庫=============================
import pandas as pd
import numpy as np
from tqdm import tqdm#進度條設定
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
 
 
#=======================定義函數==========================
 
#=======目標函數=====
def calc_f(X):
    """計算粒子的的適應度值,也就是目標函數值,X 的維度是 size * 2 """
    A = 10
    pi = np.pi
    x = X[0]
    y = X[1]
    return 2 * A + x ** 2 - A * np.cos(2 * pi * x) + y ** 2 - A * np.cos(2 * pi * y)
 
#====懲罰項函數======
def calc_e(X):
    """計算螞蟻的懲罰項,X 的維度是 size * 2 """
    ee = 0
    """計算第一個約束的懲罰項"""
    e1 = X[0] + X[1] - 6
    ee += max(0, e1)
    """計算第二個約束的懲罰項"""
    e2 = 3 * X[0] - 2 * X[1] - 5
    ee += max(0, e2)
    return ee
 
#===子代和父輩之間的選擇操作====
def update_best(parent,parent_fitness,parent_e,child,child_fitness,child_e):
    """
        針對不同問題,合理選擇懲罰項的閾值。本例中閾值為0.00001
        :param parent: 父輩個體
        :param parent_fitness:父輩適應度值
        :param parent_e    :父輩懲罰項
        :param child:  子代個體
        :param child_fitness 子代適應度值
        :param child_e  :子代懲罰項
        :return: 父輩 和子代中較優者、適應度、懲罰項
        """
    # 規則1,如果 parent 和 child 都沒有違反約束,則取適應度小的
    if parent_e <= 0.00001 and child_e <= 0.00001:
        if parent_fitness <= child_fitness:
            return parent,parent_fitness,parent_e
        else:
            return child,child_fitness,child_e
    # 規則2,如果child違反約束而parent沒有違反約束,則取parent
    if parent_e < 0.00001 and child_e  >= 0.00001:
        return parent,parent_fitness,parent_e
    # 規則3,如果parent違反約束而child沒有違反約束,則取child
    if parent_e >= 0.00001 and child_e < 0.00001:
        return child,child_fitness,child_e
    # 規則4,如果兩個都違反約束,則取適應度值小的
    if parent_fitness <= child_fitness:
        return parent,parent_fitness,parent_e
    else:
        return child,child_fitness,child_e
 
#=======================初始化引數==========================
m=20                   #螞蟻個數
G_max=200              #最大迭代次數
Rho=0.9                #資訊素蒸發係數
P0=0.2                 #轉移概率常數
XMAX= 2               #搜尋變數x最大值
XMIN= 1              #搜尋變數x最小值
YMAX= 0               #搜尋變數y最大值
YMIN= -1              #搜尋變數y最小值
step=0.1                #區域性搜尋步長
P=np.zeros(shape=(G_max,m)) #狀態轉移矩陣
fitneess_value_list=[] #迭代記錄最優目標函數值
 
#=======================初始化螞蟻群體位置和資訊素==========================
def initialization():
    """
    :return: 初始化蟻群和初始資訊素
    """
    X = np.zeros(shape=(m, 2))  # 蟻群 shape=(20, 2)
    Tau = np.zeros(shape=(m,))  # 資訊素
    for i in range(m):  # 遍歷每一個螞蟻
        X[i, 0] = np.random.uniform(XMIN, XMAX, 1)[0]  # 初始化x
        X[i, 1] =np.random.uniform(YMIN, YMAX, 1)[0]  # 初始化y
        Tau[i] = calc_f(X[i])#計算資訊素
    return X,Tau
 
#===位置更新====
def position_update(NC,P,X):
    """
    :param NC: 當前迭代次數
    :param P: 狀態轉移矩陣
    :param X: 蟻群
    :return: 蟻群X
    """
    lamda = 1 / (NC + 1)
    # =======位置更新==========
    for i in range(m):  # 遍歷每一個螞蟻
        # ===區域性搜尋===
        if P[NC, i] < P0:
            temp1 = X[i, 0] + (2 * np.random.random() - 1) * step * lamda  # x(2 * np.random.random() - 1) 轉換到【-1,1】區間
            temp2 = X[i, 1] + (2 * np.random.random() - 1) * step * lamda  # y
        # ===全域性搜尋===
        else:
            temp1 = X[i, 0] + (XMAX - XMIN) * (np.random.random() - 0.5)
            temp2 = X[i, 0] + (YMAX - YMIN) * (np.random.random() - 0.5)
 
        # =====邊界處理=====
        if (temp1 < XMIN) or (temp1 > XMAX):
            temp1 = np.random.uniform(XMIN, XMAX, 1)[0]  # 初始化x
        if (temp2 < YMIN) or (temp2 > YMAX):
            temp2 = np.random.uniform(YMIN, YMAX, 1)[0]  # 初始化y
 
        #=====判斷螞蟻是否移動(選更優)=====
        #==子代螞蟻==
        children=np.array([temp1,temp2])#子代個體螞蟻
        children_fit=calc_f(children) #子代目標函數值
        children_e=calc_e(children) #子代懲罰項
        parent=X[i]#父輩個體螞蟻
        parent_fit=calc_f(parent)#父輩目標函數值
        parent_e=calc_e(parent)#父輩懲罰項
 
        pbesti, pbest_fitness, pbest_e = update_best(parent, parent_fit, parent_e, children, children_fit,children_e)
        X[i]=pbesti
    return X
 
#======資訊素更新============
def Update_information(Tau,X):
    """
    :param Tau: 資訊素
    :param X: 螞蟻群
    :return: Tau資訊素
    """
    for i in range(m):  # 遍歷每一個螞蟻
        Tau[i] = (1 - Rho) * Tau[i] + calc_f(X[i]) #(1 - Rho) * Tau[i] 資訊蒸發後保留的
    return Tau
 
#=============主函數======================
def main():
    X,Tau=initialization() #初始化螞蟻群X 和資訊素 Tau
    for NC in tqdm(range(G_max)):  # 遍歷每一代
        BestIndex = np.argmin(Tau)  # 最優索引
        Tau_best = Tau[BestIndex]  # 最優資訊素
        # 計算狀態轉移概率
        for i in range(m):  # 遍歷每一個螞蟻
            P[NC, i] = np.abs((Tau_best - Tau[i])) / np.abs(Tau_best) + 0.01  # 即離最優資訊素的距離
        # =======位置更新==========
        X=position_update(NC,P,X) #X.shape=(20, 2)
 
        # =====更新資訊素========
        Tau=Update_information(Tau, X)
 
        # =====記錄最優目標函數值========
        index = np.argmin(Tau)  # 最小值索引
        value = Tau[index]  # 最小值
        fitneess_value_list.append(calc_f(X[index]))  # 記錄最優目標函數值
 
    #=====列印結果=======
    min_index = np.argmin(Tau)  # 最優值索引
    minX = X[min_index, 0]  # 最優變數x
    minY = X[min_index, 1]  # 最優變數y
    minValue = calc_f(X[min_index])  # 最優目標函數值
 
    print('最優變數x', minX, end='') 
    print('最優變數y', minY, end='n')
    print('最優目標函數值', minValue)
    print('最優變數對應的懲罰項',calc_e(X[min_index]))
    #=====視覺化=======
    plt.plot(fitneess_value_list, label='迭代曲線')
    plt.legend()
    plt.show()
 
 
 
if __name__=='__main__':
    main()
 
 

6.6 結果

100%|██████████| 200/200 [00:00<00:00, 220.49it/s]
最優變數x 1.0000085699291246最優變數y -0.0040192755525732165
最優目標函數值 1.0032219250172503
最優變數對應的懲罰項 0

到此這篇關於Python實現蟻群演演算法的文章就介紹到這了,更多相關Python 蟻群演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com