蟻群演算法解決TSP問題

2021-07-25 20:31:55 字數 2824 閱讀 9659

一、論述

1、演算法**

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

2、單個螞蟻尋找路徑

正反饋:

單個的螞蟻為了避免自己迷路,它在爬行時,同時也會釋放一種特殊的分泌物——資訊素(pheromone),而且它也能覺察到一定範圍內的其它螞蟻所分泌的資訊素,並由此影響它自己的行為。當一條路上的資訊素越來越多(當然,隨著時間的推移會逐漸減弱),後來的螞蟻選擇這條路徑的概率也就越來越大,從而進一步增加了該路徑的資訊素濃度,這種選擇過程稱為螞蟻的自催化過程。

多樣性:

同時為了保證螞蟻在覓食的時候不至走進死胡同而無限迴圈,螞蟻在尋找路徑的過程中,需要有一定的隨機性,雖然在覓食的過程中會根據資訊素的濃度去覓食,但是有時候也有判斷不准,環境影響等其他很多種情況,還有最終要的一點就是當前資訊素濃度大的路徑並不一定是最短的路徑,需要不斷的去修正,多樣性保證了系統的創新能力。

正是這兩點小心翼翼的巧妙結合才使得蟻群的智慧型行為湧現出來。

3、具體實現需要解決的兩個首要問題

(1)如何實現單個螞蟻尋路的過程

(2)如何實現資訊素濃度的更新

二、具體實現

**如下所示:

#include #include #include #include #include #include #include #include using namespace std;

/*int citypos[10][2]= ,,,,,,,

,,}; //10個城市的座標*/

unsigned seed=(unsigned)time(0);//原型:void srand(unsigned seed);

//30個城市的座標

int citypos[30][2]=,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};

#define city_num 30 //城市數量

#define ant_num 30 //蟻群數量

#define tmac 1000 //迭代最大次數

#define rou 0.5 //誤差大小

#define alpha 1 // 資訊素重要程度的引數

#define beta 4 // 啟發式因子重要程度的引數

#define q 100 //資訊素殘留引數

const int maxn = 100;

double dis[maxn][maxn]; //距離

double info[maxn][maxn]; //資訊素矩陣

double e[city_num][city_num]; //啟發因子矩陣

int vis[city_num][city_num];

double bestlength;

double ans[city_num];

const double mmax = 10e9;

//返回指定範圍內的隨機整數

int rnd(int nlow,int nupper)

//返回指定範圍內的隨機浮點數

double rnd(double dblow,double dbupper)

//返回浮點數四捨五入取整後的浮點數

double round(double dba)

struct ant

//選擇下乙個城市

//返回值 為城市編號

int choosenextcity()

else

}//進行輪盤選擇

double dbtemp=0.0;

if (dbtotal > 0.0) //總的資訊素值大於0}}

}//如果城市間的資訊素非常小 ( 小到比double能夠表示的最小的數字還要小 )

//出現這種情況,就把第乙個沒去過的城市作為返回結果

if (nselectedcity == -1)

}//更新環境資訊素

updateinfo();

printf("current minimum length %lf\n", ant_best.length);}}

};int main()

printf("%d ", tsp.ant_best.path[i]);

}return 0;

}

運算結果

(1)選擇老師所給10個城市的資料,結果如下所示,經過50次迭代就能得到最優解,而且演算法相當穩定,多次嘗試都是50次就能得到最優解,相比於遺傳演算法的500次迭代在時間上有了很大的改進。

(2)選擇老師所給的30個城市的資料,經過1000次迭代過程能得到乙個非常較優的解,結果穩定在425左右,與最優解424.869292非常接近,並且偶爾會得到最優解,相比於遺傳演算法迭代10000次結果在700左右,最佳結果有了很大的飛躍。

總結:(1)蟻群演算法相比於遺傳演算法針對tsp問題的求解有了很大的改進,我覺得很大的原因是蟻群在尋找路徑過程中的正反饋調節,正是根據資訊素濃度的調整,才使得路徑長度很容易收斂。同時由於用了輪盤賭演算法,***了存在一定的多樣性,受初始值的影響不大。

(2)蟻群演算法也有一定的侷限性,雖然相對於遺傳演算法有了很大的改進,但是有時候仍然找不到最優解,只能找到次優解。後續要具體優化的話,就要調節相關引數來不斷進行改進。

蟻群演算法解決tsp問題

控制蟻群演算法走向的關鍵是資訊素,資訊素類似遺傳演算法的適應性函式,類似退火演算法的評價函式,影響著其中乙隻螞蟻的下一步的選擇。螞蟻 類似遺傳演算法的染色體,就是一條解,在tsp問題中螞蟻的路徑就是tsp的解。資訊素 評價函式,與路徑成反比 迭代次數t 所有螞蟻跑完視為一次迭代週期。程式流程 1,隨...

用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年提出,他們在研究新型演算法的過程中,發現蟻群在尋找食物時,通過分泌一種稱為資訊素的生物激素交流覓食資訊從而能快速的找到目標,據此提出了基於資訊正反饋原理的蟻群演算法。蟻群演算法的基本思想 於自...