信息素的局部更新策略
每只螞蟻在構造出一條從起點到終點的路徑后,蟻群算法還要求根據路徑的總長度來更新這條路徑所包含的每條邊上信息素的濃度(在旅行商問題中每座城市是圖中的一個節點,城市兩兩間有一條邊相連)。下面給出了蟻群算法更新信息素的公式:
.
上面的第一個公式體現了信息素的更新值的計算,其中,Ck代表第k只螞蟻所構造的路徑的總長度,Q是憑經驗設定的一個參數,通常置為1。component(i,j)表示從城市i到城市j的一條邊,m是螞蟻的總數。上面的第二個公式是說i和j這條邊的信息素值tau等於這條邊上原有的信息素加上在上一次構造路徑活動中所有經過這條邊的螞蟻貢獻的信息素更新值(即第一個公式)。
假設三只螞蟻構造的路徑長度如下所示:
Tour 1: 450
Tour 2: 380
Tour 1: 460
則它們的信息素的更新值相加結果為:componentNewPheromone = (Q / 450) + (Q / 380) + (Q / 460)
最后把它加到各個螞蟻的路徑中每條邊原來的信息素值之上:
componentPheromone = componentPheromone + componentNewPheromone
上述信息素更新過程的偽代碼如下所示:
for ant in colony do //蟻群中每條螞蟻都逐個更新自己路徑經過邊上的的信息素 tour = ant.getTour(); //螞蟻計算路徑的總長度 pheromoneToAdd = getParam('Q') / tour.distance(); //螞蟻計算信息素的更新值 for cityIndex in tour do //回溯路徑中的每個城市 if lastCity(cityIndex) do // 如果當前城市是路徑上的最后一個城市,取出它和第一個城市間的邊 edge = getEdge(cityIndex, 0) else do edge = getEdge(cityIndex, cityIndex+1) //否則,取當前城市和路徑上下一個城市間的邊 end if currentPheromone = edge.getPheromone(); //獲得邊上之前的信息素 edge.setPheromone(currentPheromone + pheromoneToAdd)//原有信息素加上更新值后得到新信息素 end for // ant路徑上所有的邊的信息素更新完畢 end for //蟻群中所有螞蟻都處理完畢
信息素的揮發
在自然界中螞蟻遺留下來的信息素經過一段時間后會揮發,我們在算法中也模擬上述過程,具體公式如下:
rho是一個人為設定的參數,稱為揮發率,一般為0-1間的數。
相應的偽代碼如下所示:
for edge in edges updatedPheromone = (1 - getParam('rho')) * edge.getPheromone() edge.setPheromone(updatedPheromone) end for
精英螞蟻策略
精英螞蟻是對蟻群算法的一種改進,所謂精英螞蟻是指當全部螞蟻都構造完各自的路徑之后,所有路徑中最短的那條路徑所對應的螞蟻。精英螞蟻策略的公式如下所示,它和上面的信息素局部更新公式的唯一區別在於精英螞蟻在像其它螞蟻一樣更新完自己路徑上的信息素后,還要再重復一遍信息素的更新過程,只不過這次要把更新值乘上一個參數e,e通常選在0和1之間。