實驗原理
具體實現需要解決的兩個首要問題
實驗**
蟻群演算法的基本原理**於自然界螞蟻覓食的最短路徑原理,根據昆蟲學家的觀察,發現自然界的螞蟻雖然視覺不發達,但它可以在沒有任何提示的情況下找到從食物源到巢穴的最短路徑,並且能在環境發生變化(如原有路徑上有了障礙物)後,自適應地搜尋新的最佳路徑。
單個的螞蟻為了避免自己迷路,它在爬行時,同時也會釋放一種特殊的分泌物——資訊素(pheromone),而且它也能覺察到一定範圍內的其它螞蟻所分泌的資訊素,並由此影響它自己的行為。當一條路上的資訊素越來越多(當然,隨著時間的推移會逐漸減弱),後來的螞蟻選擇這條路徑的概率也就越來越大,從而進一步增加了該路徑的資訊素濃度,這種選擇過程稱為螞蟻的自催化過程。
同時為了保證螞蟻在覓食的時候不至走進死胡同而無限迴圈,螞蟻在尋找路徑的過程中,需要有一定的隨機性,雖然在覓食的過程中會根據資訊素的濃度去覓食,但是有時候也有判斷不准,環境影響等其他很多種情況,還有最終要的一點就是當前資訊素濃度大的路徑並不一定是最短的路徑,需要不斷的去修正,多樣性保證了系統的創新能力。
正是這兩點小心翼翼的巧妙結合才使得蟻群的智慧型行為湧現出來。
#include
#include
#include
#include
#include
#define city_num 20
//城市數量
#define ant_num 30
//蟻群數量
#define tmac 1000
//最大迭代次數
#define rou 0.3
//誤差大小
#define alpha 1
//資訊素重要程度的引數
#define beta 4
//啟發式因子重要程度的引數
#define q 100
//資訊素殘留引數
double dis[
100]
[100];
//距離
double info[
100]
[100];
//資訊素矩陣
const
double mmax=
1000
;double citypos[30]
[2]=
;//返回指定範圍內的隨機整數
intrnd
(int n,
int p)
//返回指定範圍內的隨機浮點數
double
rnd(
double d,
double b)
struct ant
//選擇下乙個城市
//返回值為城市編號
intchoosenextcity()
else
}//進行輪盤選擇
double dbtemp=
0.0;
if(dbtotal>
0.0)}}
}//如果城市間的資訊素非常小(小到比double能夠表示的最小的數字還要小)
//出現這種情況,就把第乙個沒去過的城市作為返回結果
if(nselectedcity==-1
)}}return nselectedcity;
}//螞蟻在城市間移動
void
move()
//螞蟻進行搜尋一次
void
search()
length+
=dis[path[city_num-1]
][path[0]
];}}
;struct tsp
}//初始化環境資訊素
puts
("init info");
for(
int i=
0;i}//更新資訊素,當前每條路上的資訊素等於過去保留的資訊素
//加上每個螞蟻這次走過去剩下的資訊素
void
updateinfo()
//最後城市和開始城市之間的資訊素
n=ants[i]
.path[0]
;
tmpinfo[n]
[m]=tmpinfo[n]
[m]+q/ants[i]
.length;
tmpinfo[m]
[n]=tmpinfo[n]
[m];
}//更新環境資訊素
for(
int i=
0;i}//尋找路徑,迭代tmac次
void
search()
//儲存最佳結果
for(
int j=
0;j//更新環境資訊素
updateinfo()
;printf
("current minimum length %lf\n"
,ant_best.length);}
}};int
main()
}return0;
}
蟻群演算法解決tsp問題
控制蟻群演算法走向的關鍵是資訊素,資訊素類似遺傳演算法的適應性函式,類似退火演算法的評價函式,影響著其中乙隻螞蟻的下一步的選擇。螞蟻 類似遺傳演算法的染色體,就是一條解,在tsp問題中螞蟻的路徑就是tsp的解。資訊素 評價函式,與路徑成反比 迭代次數t 所有螞蟻跑完視為一次迭代週期。程式流程 1,隨...
蟻群演算法解決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...