蟻群演算法解決tsp問題

2021-07-10 15:20:09 字數 1525 閱讀 4537

控制蟻群演算法走向的關鍵是資訊素,資訊素類似遺傳演算法的適應性函式,類似退火演算法的評價函式,影響著其中乙隻螞蟻的下一步的選擇。

螞蟻:類似遺傳演算法的染色體,就是一條解,在tsp問題中螞蟻的路徑就是tsp的解。

資訊素:評價函式,與路徑成反比

迭代次數t:所有螞蟻跑完視為一次迭代週期。

程式流程:

1,隨機生成距離矩陣

進入迴圈while(t2,資訊素遞減(只有較近的資訊素才能影響這一步)

3,對於每乙隻螞蟻,隨機生成起點,標記起點為訪問過

進入迴圈(尋找城市數量-1次)(起點已經有了)

4,尋找周圍城市的最大資訊素

5,隨機生成0~1的數如果小於bugp(螞蟻正常選擇)則從最大資訊素城市中找乙個作為下乙個

否則(螞蟻犯錯誤了,有木有感覺像退火演算法裡的允許犯錯的那個函式)隨機生成乙個未訪問過的點作為下乙個(因為至少你要保證可行吧)

6,標記這個點被訪問過

修改資訊素,修改方式為原來資訊素+q/這條路徑長度(q為1個常數)

t++;

輸出最優解。

#include #include #include #include #include #define t 1000//最大迭代次數

#define n 1000//螞蟻數量

#define cities 10//城市數量

#define bugp 0.9//每一次選擇操作的出錯概率

#define alpha 0.1//每一次資訊素的消失速率

#define q 1

int start;

int biggest[cities],biggestsum;//儲存資訊素最多時所對應的點(畢竟資訊素最大值所對應的邊不止一條,biggest記錄下那些邊的對應的終點,biggestsum為biggest的元素個數)

int distance[cities][cities];//城市的距離矩陣

double phe[cities][cities];//邊所對應的資訊素濃度(之所以選擇邊是因為點容易受到周圍優秀的點的影響)

int ant;//螞蟻當前所在點

int bugsum,bugtry[cities];//出錯時可供選擇的城市數量和城市下標

int visit[cities];//用來標記城市是否已經經過

int path[n][cities+1];//記錄每乙個螞蟻所走過的城市

void initdistance()

{ int i,j;

memset(distance,0,sizeof(distance));

srand(time(null));

for (i=0;iphe[ant][p]?max:phe[ant][p];//尋找周圍最大的資訊素的那條邊(其實是為了找到那個p點)

for (p=0;p總結:蟻群演算法的關鍵在於資訊素,而影響資訊素的因素只有兩個:螞蟻選擇這條路徑的數量和時間的流逝(越往後,越是之前的資訊素影響就越弱)。

同時注意雖然現實中螞蟻是同時去找食物,但是在蟻群演算法中螞蟻出發卻是有先後之分的,而所有的螞蟻走完就視為一次迭代。

蟻群演算法解決TSP問題

一 論述 1 演算法 蟻群演算法的基本原理 於自然界螞蟻覓食的最短路徑原理,根據昆蟲學家的觀察,發現自然界的螞蟻雖然視覺不發達,但它可以在沒有任何提示的情況下找到從食物源到巢穴的最短路徑,並且能在環境發生變化 如原有路徑上有了障礙物 後,自適應地搜尋新的最佳路徑。2 單個螞蟻尋找路徑 正反饋 單個的...

用C 實現蟻群演算法解決TSP問題

using system using system.collections.generic using system.text namespace antsystem 初始化資訊素矩陣 for int i 0 i temp i 改變資訊素矩陣,closed list為較好的路徑 private vo...

蟻群演算法 旅行商(TSP)問題詳解

蟻群演算法 ant colony optimization 最早是由marco dorigo等人在1991年提出,他們在研究新型演算法的過程中,發現蟻群在尋找食物時,通過分泌一種稱為資訊素的生物激素交流覓食資訊從而能快速的找到目標,據此提出了基於資訊正反饋原理的蟻群演算法。蟻群演算法的基本思想 於自...