蚁群算法确之孙(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术。它由Marco Dorigo于199来自2年在他的博士论文中引入,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。
为什么来自小小的蚂蚁能够找到食至粉斤饭试乐材物?他们具有智能么?设想,如果我们要为蚂蚁设计一个人工智能的程序,那么这个程序要多么复杂呢?首先,你要让蚂蚁能够避开障碍物,就必须根据适当的地形给它编进指令让他们能够巧妙的避开障碍物,其次,要让蚂蚁找到食物,就需要让他们遍历空间上的所有点;再次,如果要让蚂蚁找到最短的路径,那么需要计算所有可能的路径并且比较它们的大小,而且更重要的是,你要小心翼翼的编程,因为程序的错误也许会让你前功尽弃。这是多么不可思议的程序!360百科太复杂了,恐怕没人能善够完成这样繁琐冗余的能束互钱卷工土团实四乙程序。
蚂蚁算法然而,事实并没有你想得那么复杂,上面这个程序每个蚂蚁任巴绿策突够常孙的核心程序编码不过100多行!为什么这么简单的程执草责项序会让蚂蚁干这样复杂的事情?答案是:简单规则的涌现。事实上,每只蚂蚁并不是像我们增营汉衡见洲值天善想象的需要知道整个世界的信息,他们其实只关心很小顺班范围内的眼前信息,而且根据这些局部信息利用几条简单的规则进行决策,这样,在蚁群这个集体里,复杂性的色独行为就会凸现出来。这就是人工生命、复杂性科学解释的规律!那么,这些简单规则是什么呢?下面:
蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参收民数为速度半径(一般是3),那么它能观察到的范围就是3*3个方格世界,并且能移动的距离也在这个范围之曲价你露度将我分内。
蚂蚁所在的环境是一个虚拟的世界,其中有障碍物,有别的蚂蚁,还有信息素,信息素有两种,一种是找到食物的蚂蚁洒下的食物停章得换夜整胞年快封信息素,一种是找到窝的蚂蚁洒下的窝的信息素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让信息素消失。
在每只蚂蚁能感知的范围内寻找是否有食模模义电个物,如果有就直接过去。否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多,这样,它就朝信息素多苗始诗的地方走,并且每只蚂蚁多会以小概率犯错误,从而并不是往信息素最多的点移动。蚂蚁穿苗白措行开亲雷找窝的规则和上面一样,只不过它对窝的信息素做出反应,而对食物信息素没反应。
每只蚂蚁都朝向信息素最多的方向移,并且,当周围没有信息素指引的时候,蚂蚁会按照自己原来运动的方向惯性的运动下去,并且,在运动的方向有一个随机的小的扰动。为袁口破肉船友若段了防止蚂蚁原地转圈,它末部设首吧周促派林因会记住最近刚走过了哪些点,如果发现要走的下一点已经在最近走过了并雷害领迫,它就会尽量避开。
如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有益探鲁企知信息素指引的话,它会按照觅食的规则行为。
每只蚂蚁在刚找到食物或者窝的时候撒发的信息素最多,并随着它走远的距离,播撒的信息素越来越少。
根据这几条规则,蚂蚁之间并没有直接的关系,但是每只蚂蚁都和环境发生交互,而通过信息素这个纽带,实际上把各个蚂蚁之间关联起来了。比如,当一只蚂蚁找到了食物,它并没有直接告诉其它蚂蚁这儿有食物,而是向环境播撒信息素,当其它的蚂蚁经过它附近的时候,就会感觉到信息素的存在,进而根据信息素的指引找到了食物。
说了这么多,蚂蚁究竟是怎么找到食物的呢?
在没有蚂蚁找到食物的时候,环境没有有用的信息素,那么蚂蚁为什么会相对有效的找到食物呢?这要归功于蚂蚁的移动规则,尤其是在没有信息素时候的移动规则。首先,它要能尽量保持某种惯性,这样使得蚂蚁尽量向前方移动(开始,这个前方是随机固定的一个方向),而不是原地无谓的打转或者震动;其次,蚂蚁要有一定的随机性,虽然有了固定的方向,但它也不能像粒子一样直线运动下去,而是有一个随机的干扰。这样就使得蚂蚁运动起来具有了一定的目的性,尽量保持原来的方向,但又有新的试探,尤其当碰到障碍物的时候它会立即改变方向,这可以看成一种选择的过程,也就是环境的障碍物让蚂蚁的某个方向正确,而其他方向则不对。这就解释了为什么单个蚂蚁在复杂的诸如迷宫的地图中仍然能找到隐蔽得很好的食物。
当然,在有一只蚂蚁找到了食物的时候,其他蚂蚁会沿着信息素很快找到食物的。
蚂蚁如何找到最短路径的?这一是要归功于信息素,另外要归功于环境,具体说是计算机时钟。信息素多的地方显然经过这里的蚂蚁会多,因而会有更多的蚂蚁聚集过来。假设有两条路从窝通向食物,开始的时候,走这两条路的蚂蚁数量同样多(或者较长的路上蚂蚁多,这也无关紧要)。当蚂蚁沿着一条路到达终点以后会马上返回来,这样,短的路蚂蚁来回一次的时间就短,这也意味着重复的频率就快,因而在单位时间里走过的蚂蚁数目就多,洒下的信息素自然也会多,自然会有更多的蚂蚁被吸引过来,从而洒下更多的信息素……;而长的路正相反,因此,越来越多地蚂蚁聚集到较短的路径上来,最短的路径就近似找到了。也许有人会问局部最短路径和全局最短路的问题,实际上蚂蚁逐渐接近全局最短路的,为什么呢?这源于蚂蚁会犯错误,也就是它会按照一定的概率不往信息素高的地方走而另辟蹊径,这可以理解为一种创新,这种创新如果能缩短路途,那么根据刚才叙述的原理,更多的蚂蚁会被吸引过来。
跟着蚂蚁的踪迹,你找到了什么?通过上面的原理叙述和实际操作,我们不难发现蚂蚁之所以具有智能行为,完全归功于它的简单行为规则,而这些规则综合起来具有下面两个方面的特点:
1、多样性
2、正反馈
多样性保证了蚂蚁在觅食的时候不置走进死胡同而无限循环,正反馈机制则保证了相对优良的信息能够被保存下来。我们可以把多样性看成是一种创造能力,而正反馈是一种学习强化能力。正反馈的力量也可以比喻成权威的意见,而多样性是打破权威体现的创造性,正是这两点小心翼翼的巧妙结合才使得智能行为涌现出来了。
引申来讲,大自然的进化,社会的进步、人类的创新实际上都离不开这两样东西,多样性保证了系统的创新能力,正反馈保证了优良特性能够得到强化,两者要恰到好处的结合。如果多样性过剩,也就是系统过于活跃,这相当于蚂蚁会过多的随机运动,它就会陷入混沌状态;而相反,多样性不够,正反馈机制过强,那么系统就好比一潭死水。这在蚁群中来讲就表现为,蚂蚁的行为过于僵硬,当环境变化了,蚂蚁群仍然不能适当的调整。
既然复杂性、智能行为是根据底层规则涌现的,既然底层规则具有多样性和正反馈特点,那么也许你会问这些规则是哪里来的?多样性和正反馈又是哪里来的?我本人的意见:规则来源于大自然的进化。而大自然的进化根据刚才讲的也体现为多样性和正反馈的巧妙结合。而这样的巧妙结合又是为什么呢?为什么在你眼前呈现的世界是如此栩栩如生呢?答案在于环境造就了这一切,之所以你看到栩栩如生的世界,是因为那些不能够适应环境的多样性与正反馈的结合都已经死掉了,被环境淘汰了!
蚂蚁在转同奏著外一开始拥有的信息素总量,越大来自表示程序在较长一段时间能够360百科存在信息素。
随着时间的流逝,已经存在于世界上的信息素会消减,这个数值越大,那么消减的越快。
错误概率表示这个蚂蚁不往信息素最大的区域走的概率,越大则表示这个蚂蚁越有创新性。
速度半径表示蚂蚁一次能走的最大长度,也表示这个蚂蚁的感知范围。
记忆能力表示蚂蚁能记住多少个刚刚走过点的坐标,这个值避免了蚂蚁在本地打转,停滞不前。而这个值越大那么整个系统运行速度就慢,越小则蚂蚁越容易原地转圈。
<!DOCTYPE html PUBLIC "-//W3C/心护以土罗晚名/DTD XHTML 1.0 Transitional//EN" >
HEAD>
<meta http-equiv="Conten除小t-Type" content="text/html; charset=gb2312" />
<title>蚁群算法js版</title>
<style>
.ant{
position:absolute;
background析子云身频怕程远百-color:#000班味陆000;
overflow:hidden;
width:2px;
height:2甚岩是笑条印济两px;
}
.food接药继烈当{
position:absolute;
backgroun至剂d-color:#0000ff;
overflow:hidden;
width:2px;
height:2px;
}
.nest{
positi省除神on:absolute;
background-color:#ff0000;
overflow:hidd酸en;
width:2px;
height:2px;
}
</style>
<script type="text/JavaScript">
//==================明皇优发助乙供确更又关==========
//系统参数初始化
//----------------------------
//生命体数量直续掉连杂出技得与轨迹长度
Unit=10;Path=30;
//生命体速度上下限
v0=2;vM=10;
//生命体加速度变化范围
Kr=0.1;Kv=0.1*(vM-v0);
季后下端门而防能程整//生命体运动范围
x0=0;xM=document.documentElement.clientWidth;
y0=0;yM=document.documentElement.clientHeight;
//生命体出生地(巢穴)
xi0=x0+(xM-x0)*贵值众绿低神背主否段Math.random();
yi0=y0+(yM-y0)*Math.random();
str0='<div class="ant" style="left:'+xi0+';top:'+yi0+';"></div>';
//食物所在地
xf=x0+(xM-x0)*Math.rand今急弱om();
yf=y0+(yM-y0)*Math.random();
//气味感知范围
措氧没也注社简 R_2=5*5;
//==================圆牛身==========
va行烈建音福r r=new Array();
var v=new Array();
var dr=new Array();
var dv=new Array();
var x=new Array();
var y=new Array();
var life=new Array();
//单击暂停
var xi0,yi0,xf,yf;
var Time0,str0;
window.status='pause';
function document.onclick(){
if(window.status=='pause'){
window.status=0;
nest.style.left=xi0;
nest.style.top=yi0;
food.style.left=xf;
food.style.top=yf;
//测试初始化时间用
Time0=(new Date()).getTime();
init(0);
}else{
window.status='pause';
}
}
//窗口大小调整后刷新页面以调整系统参数
function window.onresize(){
// window.location.href=document.location;
}
//初始化函数
function init(i){
if(window.status!='pause'&&i<Unit){
if(!life){
document.body.appendChild(life=document.createElement(str0));
x=xi0;
y=yi0;
r=Math.random();
v=1/Math.random();
dr=Kr*Math.random();
dv=Kv*Math.random();
}
Move(i);
window.status=i+1;
setTimeout('init('+(i+1)+')',i);
// }else{
// alert'生成耗时:'+((new Date()).getTime()-Time0)+'ms');
}
}
//运动函数
Total=Unit*Path;
P2=2*Math.PI;
function Move(i){
if(window.status!='pause'){
k=i%Unit;
X=x[k];
Y=y[k];
R=r[k];
V=v[k];
if(!life){
str='<div class="ant" style="left:'+X+';top:'+Y+';"></div>';
document.body.appendChild(life=document.createElement(str));
}
obj=life;
R+=dr[k]*(2*Math.random()-1);
V+=dv[k]*(2*Math.random()-1);
X+=Math.sin(P2*R)*V;
Y+=Math.cos(P2*R)*V;
//遇到食物原路返回并减小角度变化
distance=(X-xf)*(X-xf)+(Y-yf)*(Y-yf);
if(distance<R_2){
R+=0.5;
r/=2;
v*=2;
}
distance=(X-xi0)*(X-xi0)+(Y-yi0)*(Y-yi0);
if(distance<R_2){
R+=0.5;
r/=2;
v*=2;
}
/*----------------------------------
/*================================*/
//碰撞边界反弹
R=(X<x0||X>xM)?-R:R;
R=(Y<y0||Y>yM)?0.5-R:R;
X=x[k]+Math.sin(P2*R)*V;
Y=y[k]+Math.cos(P2*R)*V;
/*================================*/
//溢出边界重生(类似流星效果)
if(X<x0||X>xM||Y<y0||Y>yM){
X=xi0;
Y=yi0;
}
/*----------------------------------
/*================================*/
//边界限制
x[k]=X=(X<x0)?x0:(X>xM)?xM-2:X;
y[k]=Y=(Y<y0)?y0:(Y>yM)?yM-2:Y;
r[k]=R>1?R-1:R<0?R+1:R;
v[k]=V=(V<v0)?v0:((V<vM)?V:vM);
/*================================*/
obj.style.left=x[k]=X;
obj.style.top=y[k]=Y;
setTimeout('Move('+(i+Unit)%Total+')',Unit);
}
}
//根据浏览器自动加载动画
switch(navigator.appName.toLowerCase()){
case "netscape":
window.addEventListener("load",document.onclick,false);
break;
case "microsoft internet explorer":
default:
window.attachEvent("onload",document.onclick);
break;
}
</script>
</head>
<body scroll="no">
<div id="food" class="food"></div>
<div id="nest" class="nest"></div>
</body>
</html>
%蚁周模型,解决TSP问题
function AS()
%clc
%初始化
format short;
n=6; %n 城市数目
m=30; %m 蚂蚁数量
Nmax=100;%最大循环次数
%d(i,j) 城市i,j之间的距离,d is a n*n matrix
d=[inf,1,inf,inf,8,inf;1,inf,8,inf,4,5;inf,8,inf,3,6,7;inf,inf,3,inf,inf,10;8,4,6,inf,inf,9;inf,5,7,10,9,inf];
y=zeros(n,n);%y(i,j)=1/d(i,j) 在TSP问题中,启发信息
for i=1:n
for j=1:n
y(i,j)=1/d(i,j);
end
end
e=1;%信息启发因子
f=1;%期望启发因子
Q=20;%
S=ones(n,n);%(i,j)路段初始化起始信息素
for i=1:n
for j=1:n
if d(i,j)==inf
S(i,i)=0;
end
end
end
S1=zeros(n,n);%(i,j)路段信息素增量
s=zeros(n,n,m);%s(i,j,k) 蚂蚁k在路径i,j上残留的信息素
notallowed=ones(m,n);%禁忌表,0表示已经访问过
a=zeros(m,n);%蚂蚁循环一次的路径
for k=1:m
a(k,1)=1+round(rand*(n-1));%将蚂蚁随机放到n个城市上
end
for k=1:m % 将初始城市放入禁忌表中
notallowed(k,a(k,1))=0;
end
for N=1:Nmax %N 循环次数
t=2;
L=zeros(1,m);
while t<=n %重复直至禁忌表满为止
for k=1:m
%计算蚂蚁k转移的概率
i=a(k,t-1);
p=zeros(1,n);%p(j)蚂蚁k选择路径i,j的概率
for j=1:n
if notallowed(k,j)~=0
u=(S(i,j)^e)*(y(i,j)^f);
v=0;
for w=1:n
v=v+(S(i,w)^e)*(y(i,w)^f)*notallowed(k,w);
end
if v~=0
p(j)=u/v;
end
end
end
[pk,j]=max(p);
notallowed(k,j)=0;
L(k)=L(k)+d(i,j);
a(k,t)=j;
end
t=t+1;
end
for k=1:m
L(k)=L(k)+d(a(k,n),a(k,1));
end
%一次循环结束,回到起始位置
%更新
for k=1:m
for i=1:n-1
s(a(k,i),a(k,i+1),k)=Q/L(k);
end
s(a(k,n),a(k,1),k)=Q/L(k);
end
for i=1:n
for j=1:n
if d(i,j)~=inf
for k=1:m
S1(i,j)=S1(i,j)+s(i,j,k);
end
end
end
end
for i=1:n
for j=1:n
if d(i,j)~=inf
S(i,j)=(1-rand)*S(i,j)+S1(i,j);
end
end
end
for k=1:m %将禁忌表中除起始城市,全都置为未访问
for t=1:n
if t~=a(k,1)
notallowed(k,t)=1;
end
end
end
S1=zeros(n,n);%(i,j)路段信息素增量清零
s=zeros(n,n,m);%s(i,j,k) 蚂蚁k在路径i,j上残留的信息素清零
end %循环最大次数结束
[result,k]=min(L)
a(k,:)