当前位置:首页 » 操作系统 » 蚁周算法问题

蚁周算法问题

发布时间: 2022-09-04 01:28:29

❶ 蚁群算法求解TSP问题遇到“索引超出矩阵维度。”的问题跪求大神能解答

你检查一下坐标矩阵是否出现了重复数值。比如你给的例子中C矩阵的第二个和第三个数值就重复了。

❷ 蚁群算法求解TSP问题的源程序及简要说明

简单蚁群算法求解TSP的源程序(我帮你找的)

蚁群算法是新兴的仿生算法,最初是由意大利学者Dorigo M于1991年首次提出,由于具有较强的鲁棒性,优良的分布式计算机制和易于与其它方法结合等优点,成为人工智能领域的一个研究热点。本程序是实现简单的蚁群算法,TSP问题取的是att48,可从http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95获取,程序运行时间可能会比较长,在我的这台CPU 1.6G+内存256M的机器上运行时间大概是13分钟左右。我用的语言是MATLAB 7.1。此程序仅供学习所用,如有问题请反馈。谢谢。(注:程序没有计算最后一个城市回来起点城市的距离)

function [y,val]=QACS
tic
load att48 att48;
MAXIT=300; % 最大循环次数
NC=48; % 城市个数
tao=ones(48,48);% 初始时刻各边上的信息最为1
rho=0.2; % 挥发系数
alpha=1;
beta=2;
Q=100;
mant=20; % 蚂蚁数量
iter=0; % 记录迭代次数
for i=1:NC % 计算各城市间的距离
for j=1:NC
distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2);
end
end
bestroute=zeros(1,48); % 用来记录最优路径
routelength=inf; % 用来记录当前找到的最优路径长度
% for i=1:mant % 确定各蚂蚁初始的位置
% end
for ite=1:MAXIT
for ka=1:mant %考查第K只蚂蚁
deltatao=zeros(48,48); % 第K只蚂蚁移动前各边上的信息增量为零
[routek,lengthk]=travel(distance,tao,alpha,beta);
if lengthk<routelength % 找到一条更好的路径
routelength=lengthk;
bestroute=routek;
end
for i=1:NC-1 % 第K只蚂蚁在路径上释放的信息量
deltatao(routek(i),routek(i+1))=deltatao(routek(i),routek(i+1))+Q/lengthk;
end
deltatao(routek(48),1)=deltatao(routek(48),1)+Q/lengthk;
end
for i=1:NC-1
for j=i+1:NC
if deltatao(i,j)==0
deltatao(i,j)=deltatao(j,i);
end
end
end
tao=(1-rho).*tao+deltatao;
end
y=bestroute;
val=routelength;
toc

function [y,val]=travel(distance,tao,alpha,beta) % 某只蚂蚁找到的某条路径
[m,n]=size(distance);
p=fix(m*rand)+1;
val=0; % 初始路径长度设为 0
tabuk=[p]; % 假设该蚂蚁都是从第 p 个城市出发的
for i=1:m-1
np=tabuk(length(tabuk)); % 蚂蚁当前所在的城市号
p_sum=0;
for j=1:m
if isin(j,tabuk)
continue;
else
ada=1/distance(np,j);
p_sum=p_sum+tao(np,j)^alpha*ada^beta;
end
end
cp=zeros(1,m); % 转移概率
for j=1:m
if isin(j,tabuk)
continue;
else
ada=1/distance(np,j);
cp(j)=tao(np,j)^alpha*ada^beta/p_sum;
end
end
NextCity=pchoice(cp);
tabuk=[tabuk,NextCity];
val=val+distance(np,NextCity);
end
y=tabuk;

function y=isin(x,A) % 判断数 x 是否在向量 A 中,如在返回 1 ,否则返回 0
y=0;
for i=1:length(A)
if A(i)==x
y=1;
break;
end
end

function y=pchoice(A)
a=rand;
tempA=zeros(1,length(A)+1);
for i=1:length(A)
tempA(i+1)=tempA(i)+A(i);
end
for i=2:length(tempA)
if a<=tempA(i)
y=i-1;
break;
end
end

❸ 什么是蚁群算法

蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术。它由Marco Dorigo于1992年在他的博士论文中引入,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。
蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质.针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值.
蚁群算法是一种求解组合最优化问题的新型通用启发式方法,该方法具有正反馈、分布式计算和富于建设性的贪婪启发式搜索的特点。通过建立适当的数学模型,基于故障过电流的配电网故障定位变为一种非线性全局寻优问题。由柳洪平创建。
预期的结果:
各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物。当一只找到食物以后,它会向环境释放一种信息素,吸引其他的蚂蚁过来,这样越来越多的蚂蚁会找到食物!有些蚂蚁并没有象其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果令开辟的道路比原来的其他道路更短,那么,渐渐,更多的蚂蚁被吸引到这条较短的路上来。最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。
原理:
为什么小小的蚂蚁能够找到食物?他们具有智能么?设想,如果我们要为蚂蚁设计一个人工智能的程序,那么这个程序要多么复杂呢?首先,你要让蚂蚁能够避开障碍物,就必须根据适当的地形给它编进指令让他们能够巧妙的避开障碍物,其次,要让蚂蚁找到食物,就需要让他们遍历空间上的所有点;再次,如果要让蚂蚁找到最短的路径,那么需要计算所有可能的路径并且比较它们的大小,而且更重要的是,你要小心翼翼的编程,因为程序的错误也许会让你前功尽弃。这是多么不可思议的程序!太复杂了,恐怕没人能够完成这样繁琐冗余的程序。
然而,事实并没有你想得那么复杂,上面这个程序每个蚂蚁的核心程序编码不过100多行!为什么这么简单的程序会让蚂蚁干这样复杂的事情?答案是:简单规则的涌现。事实上,每只蚂蚁并不是像我们想象的需要知道整个世界的信息,他们其实只关心很小范围内的眼前信息,而且根据这些局部信息利用几条简单的规则进行决策,这样,在蚁群这个集体里,复杂性的行为就会凸现出来。这就是人工生命、复杂性科学解释的规律!那么,这些简单规则是什么呢?下面详细说明:
1、范围:
蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半径(一般是3),那么它能观察到的范围就是3*3个方格世界,并且能移动的距离也在这个范围之内。
2、环境:
蚂蚁所在的环境是一个虚拟的世界,其中有障碍物,有别的蚂蚁,还有信息素,信息素有两种,一种是找到食物的蚂蚁洒下的食物信息素,一种是找到窝的蚂蚁洒下的窝的信息素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让信息素消失。
3、觅食规则:
在每只蚂蚁能感知的范围内寻找是否有食物,如果有就直接过去。否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多,这样,它就朝信息素多的地方走,并且每只蚂蚁多会以小概率犯错误,从而并不是往信息素最多的点移动。蚂蚁找窝的规则和上面一样,只不过它对窝的信息素做出反应,而对食物信息素没反应。
4、移动规则:
每只蚂蚁都朝向信息素最多的方向移,并且,当周围没有信息素指引的时候,蚂蚁会按照自己原来运动的方向惯性的运动下去,并且,在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈,它会记住最近刚走过了哪些点,如果发现要走的下一点已经在最近走过了,它就会尽量避开。
5、避障规则:
如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有信息素指引的话,它会按照觅食的规则行为。
7、播撒信息素规则:
每只蚂蚁在刚找到食物或者窝的时候撒发的信息素最多,并随着它走远的距离,播撒的信息素越来越少。
根据这几条规则,蚂蚁之间并没有直接的关系,但是每只蚂蚁都和环境发生交互,而通过信息素这个纽带,实际上把各个蚂蚁之间关联起来了。比如,当一只蚂蚁找到了食物,它并没有直接告诉其它蚂蚁这儿有食物,而是向环境播撒信息素,当其它的蚂蚁经过它附近的时候,就会感觉到信息素的存在,进而根据信息素的指引找到了食物。
问题:
说了这么多,蚂蚁究竟是怎么找到食物的呢?
在没有蚂蚁找到食物的时候,环境没有有用的信息素,那么蚂蚁为什么会相对有效的找到食物呢?这要归功于蚂蚁的移动规则,尤其是在没有信息素时候的移动规则。首先,它要能尽量保持某种惯性,这样使得蚂蚁尽量向前方移动(开始,这个前方是随机固定的一个方向),而不是原地无谓的打转或者震动;其次,蚂蚁要有一定的随机性,虽然有了固定的方向,但它也不能像粒子一样直线运动下去,而是有一个随机的干扰。这样就使得蚂蚁运动起来具有了一定的目的性,尽量保持原来的方向,但又有新的试探,尤其当碰到障碍物的时候它会立即改变方向,这可以看成一种选择的过程,也就是环境的障碍物让蚂蚁的某个方向正确,而其他方向则不对。这就解释了为什么单个蚂蚁在复杂的诸如迷宫的地图中仍然能找到隐蔽得很好的食物。
当然,在有一只蚂蚁找到了食物的时候,其他蚂蚁会沿着信息素很快找到食物的。
蚂蚁如何找到最短路径的?这一是要归功于信息素,另外要归功于环境,具体说是计算机时钟。信息素多的地方显然经过这里的蚂蚁会多,因而会有更多的蚂蚁聚集过来。假设有两条路从窝通向食物,开始的时候,走这两条路的蚂蚁数量同样多(或者较长的路上蚂蚁多,这也无关紧要)。当蚂蚁沿着一条路到达终点以后会马上返回来,这样,短的路蚂蚁来回一次的时间就短,这也意味着重复的频率就快,因而在单位时间里走过的蚂蚁数目就多,洒下的信息素自然也会多,自然会有更多的蚂蚁被吸引过来,从而洒下更多的信息素……;而长的路正相反,因此,越来越多地蚂蚁聚集到较短的路径上来,最短的路径就近似找到了。也许有人会问局部最短路径和全局最短路的问题,实际上蚂蚁逐渐接近全局最短路的,为什么呢?这源于蚂蚁会犯错误,也就是它会按照一定的概率不往信息素高的地方走而另辟蹊径,这可以理解为一种创新,这种创新如果能缩短路途,那么根据刚才叙述的原理,更多的蚂蚁会被吸引过来。
引申
跟着蚂蚁的踪迹,你找到了什么?通过上面的原理叙述和实际操作,我们不难发现蚂蚁之所以具有智能行为,完全归功于它的简单行为规则,而这些规则综合起来具有下面两个方面的特点:
1、多样性
2、正反馈
多样性保证了蚂蚁在觅食的时候不置走进死胡同而无限循环,正反馈机制则保证了相对优良的信息能够被保存下来。我们可以把多样性看成是一种创造能力,而正反馈是一种学习强化能力。正反馈的力量也可以比喻成权威的意见,而多样性是打破权威体现的创造性,正是这两点小心翼翼的巧妙结合才使得智能行为涌现出来了。
引申来讲,大自然的进化,社会的进步、人类的创新实际上都离不开这两样东西,多样性保证了系统的创新能力,正反馈保证了优良特性能够得到强化,两者要恰到好处的结合。如果多样性过剩,也就是系统过于活跃,这相当于蚂蚁会过多的随机运动,它就会陷入混沌状态;而相反,多样性不够,正反馈机制过强,那么系统就好比一潭死水。这在蚁群中来讲就表现为,蚂蚁的行为过于僵硬,当环境变化了,蚂蚁群仍然不能适当的调整。
既然复杂性、智能行为是根据底层规则涌现的,既然底层规则具有多样性和正反馈特点,那么也许你会问这些规则是哪里来的?多样性和正反馈又是哪里来的?我本人的意见:规则来源于大自然的进化。而大自然的进化根据刚才讲的也体现为多样性和正反馈的巧妙结合。而这样的巧妙结合又是为什么呢?为什么在你眼前呈现的世界是如此栩栩如生呢?答案在于环境造就了这一切,之所以你看到栩栩如生的世界,是因为那些不能够适应环境的多样性与正反馈的结合都已经死掉了,被环境淘汰了!
参数说明:
最大信息素:蚂蚁在一开始拥有的信息素总量,越大表示程序在较长一段时间能够存在信息素。信息素消减的速度:随着时间的流逝,已经存在于世界上的信息素会消减,这个数值越大,那么消减的越快。
错误概率表示这个蚂蚁不往信息素最大的区域走的概率,越大则表示这个蚂蚁越有创新性。
速度半径表示蚂蚁一次能走的最大长度,也表示这个蚂蚁的感知范围。
记忆能力表示蚂蚁能记住多少个刚刚走过点的坐标,这个值避免了蚂蚁在本地打转,停滞不前。而这个值越大那么整个系统运行速度就慢,越小则蚂蚁越容易原地转圈。
蚁群算法的实现
下面的程序开始运行之后,蚂蚁们开始从窝里出动了,寻找食物;他们会顺着屏幕爬满整个画面,直到找到食物再返回窝。
其中,‘F’点表示食物,‘H’表示窝,白色块表示障碍物,‘+’就是蚂蚁了。
参数说明:
最大信息素:蚂蚁在一开始拥有的信息素总量,越大表示程序在较长一段时间能够存在信息素。信息素消减的速度:随着时间的流逝,已经存在于世界上的信息素会消减,这个数值越大,那么消减的越快。
错误概率表示这个蚂蚁不往信息素最大的区域走的概率,越大则表示这个蚂蚁越有创新性。
速度半径表示蚂蚁一次能走的最大长度,也表示这个蚂蚁的感知范围。
记忆能力表示蚂蚁能记住多少个刚刚走过点的坐标,这个值避免了蚂蚁在本地打转,停滞不前。而这个值越大那么整个系统运行速度就慢,越小则蚂蚁越容易原地转圈。

❹ 求带注释的蚁群算法

Sorry,没有注释!
放不下,网站上有!

下面就是实现如此复杂性的七条简单规则:
1、范围:
蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半径(一般是3),那么它能观察到的范围就是33个方格世界,并且能移动的距离也在这个范围之内。
2、环境:
蚂蚁所在的环境是一个虚拟的世界,其中有障碍物,有别的蚂蚁,还有信息素,信息素有两种,一种是找到食物的蚂蚁洒下的食物信息素,一种是找到窝的蚂蚁洒下的窝的信息素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让信息素消失。
3、觅食规则:
在每只蚂蚁能感知的范围内寻找是否有食物,如果有就直接过去。否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多,这样,它就朝信息素多的地方走,并且每只蚂蚁多会以小概率犯错误,从而并不是往信息素最多的点移动。蚂蚁找窝的规则和上面一样,只不过它对窝的信息素做出反应,而对食物信息素没反应。
4、移动规则:
每只蚂蚁都朝向信息素最多的方向移,并且,当周围没有信息素指引的时候,蚂蚁会按照自己原来运动的方向惯性的运动下去,并且,在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈,它会记住最近刚走过了哪些点,如果发现要走的下一点已经在最近走过了,它就会尽量避开。
5、避障规则:
如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有信息素指引的话,它会按照觅食的规则行为。
7、播撒信息素规则:
每只蚂蚁在刚找到食物或者窝的时候撒发的信息素最多,并随着它走远的距离,播撒的信息素越来越少。

下面的程序开始运行之后,蚂蚁们开始从窝里出动了,寻找食物;他们会顺着屏幕爬满整个画面,直到找到食物再返回窝。

其中,‘F’点表示食物,‘H’表示窝,白色块表示障碍物,‘+’就是蚂蚁了。

参数说明:
最大信息素:蚂蚁在一开始拥有的信息素总量,越大表示程序在较长一段时间能够存在信息素。信息素消减的速度:随着时间的流逝,已经存在于世界上的信息素会消减,这个数值越大,那么消减的越快。
错误概率表示这个蚂蚁不往信息素最大的区域走的概率,越大则表示这个蚂蚁越有创新性。
速度半径表示蚂蚁一次能走的最大长度,也表示这个蚂蚁的感知范围。
记忆能力表示蚂蚁能记住多少个刚刚走过点的坐标,这个值避免了蚂蚁在本地打转,停滞不前。而这个值越大那么整个系统运行速度就慢,越小则蚂蚁越容易原地转圈。

源代码如下:

ant.c

#define SPACE 0×20
#define ESC 0×1b
#define ANT_CHAR_EMPTY ‘+’
#define ANT_CHAR_FOOD 153
#define HOME_CHAR ‘H’
#define FOOD_CHAR ‘F’
#define FOOD_CHAR2 ‘f’
#define FOOD_HOME_COLOR 12
#define BLOCK_CHAR 177

#define MAX_ANT 50
#define INI_SPEED 3
#define MAXX 80
#define MAXY 23
#define MAX_FOOD 10000
#define TARGET_FOOD 200
#define MAX_SMELL 5000
#define SMELL_DROP_RATE 0.05
#define ANT_ERROR_RATE 0.02
#define ANT_EYESHOT 3
#define SMELL_GONE_SPEED 50
#define SMELL_GONE_RATE 0.05
#define TRACE_REMEMBER 50
#define MAX_BLOCK 100

#define NULL 0
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
#define SMELL_TYPE_FOOD 0
#define SMELL_TYPE_HOME 1

#include “stdio.h”
#include “conio.h”
#include “dos.h”
#include “stdlib.h”
#include “dos.h”
#include “process.h”
#include “ctype.h”
#include “math.h”

void WorldInitial(void);
void BlockInitial(void);
void CreatBlock(void);
void SaveBlock(void);
void LoadBlock(void);
void HomeFoodInitial(void);
void AntInitial(void);
void WorldChange(void);
void AntMove(void);
void AntOneStep(void);
void DealKey(char key);
void ClearSmellDisp(void);
void DispSmell(int type);
int AntNextDir(int xxx,int yyy,int ddir);
int GetMaxSmell(int type,int xxx,int yyy,int ddir);
int IsTrace(int xxx,int yyy);
int MaxLocation(int num1,int num2,int num3);
int CanGo(int xxx,int yyy,int ddir);
int JudgeCanGo(int xxx,int yyy);
int TurnLeft(int ddir);
int TurnRight(int ddir);
int TurnBack(int ddir);

int MainTimer(void);
char WaitForKey(int secnum);
void DispPlayTime(void);
int TimeUse(void);
void HideCur(void);
void ResetCur(void);

—————
struct HomeStruct
{
int xxx,yyy;
int amount;
int TargetFood;
}home;

struct FoodStruct
{
int xxx,yyy;
int amount;
}food;

struct AntStruct
{
int xxx,yyy;
int dir;
int speed;
int SpeedTimer;
int food;
int SmellAmount[2];
int tracex[TRACE_REMEMBER];
int tracey[TRACE_REMEMBER];
int TracePtr;
int IQ;
}ant[MAX_ANT];
int AntNow;
int timer10ms;
struct time starttime,endtime;
int Smell[2][MAXX+1][MAXY+1];
int block[MAXX+1][MAXY+1];
int SmellGoneTimer;
int SmellDispFlag;
int CanFindFood;
int HardtoFindPath;

—– Main ——–
void main(void)
{
char KeyPress;
int tu;

clrscr();
HideCur();
WorldInitial();
do
{
timer10ms = MainTimer();
if(timer10ms) AntMove();
if(timer10ms) WorldChange();
tu = TimeUse();
if(tu=60&&!CanFindFood)
{
gotoxy(1,MAXY+1);
printf(“Can not find food, maybe a block world.”);
WaitForKey(10);
WorldInitial();
}
if(tu=180&&home.amount100&&!HardtoFindPath)
{
gotoxy(1,MAXY+1);
printf(“God! it is so difficult to find a path.”);
if(WaitForKey(10)==0×0d) WorldInitial();
else
{
HardtoFindPath = 1;
gotoxy(1,MAXY+1);
printf(” “);
}
}
if(home.amount=home.TargetFood)
{
gettime(&endtime);
KeyPress = WaitForKey(60);
DispPlayTime();
WaitForKey(10);
WorldInitial();
}
else if(kbhit())
{
KeyPress = getch();
DealKey(KeyPress);
}
else KeyPress = NULL;
}
while(KeyPress!=ESC);
gettime(&endtime);
DispPlayTime();
WaitForKey(10);
clrscr();
ResetCur();
}

❺ 用matlab编写可靠性蚁群算法!急用!!

function [Shortest_Route,Shortest_Length]=anttsp(city,iter_max,m,Alpha,Beta,Rho,Q)
%本函数用的蚁周模型
%city输入城市的经纬度(n行2列)
%iter_max最大迭代次数
%m蚂蚁数目
%三个参数alpha,beta,rho。
%Q信息素强度
%有问题联系[email protected]

n=size(city,1);
d=zeros(n,n);
d=squareform(pdist(city));
Eta=1./d;
Tau=ones(n,n);
Tabu=zeros(m,n);
nC=1;
R_best=zeros(iter_max,n);
L_best=inf.*ones(iter_max,1);

while nC<=iter_max
route=[];
for i=1:ceil(m/n)
route=[route,randperm(n)];
end
Tabu(:,1)=(route(1,1:m))';
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1));
J=zeros(1,(n-j+1));
P=J;
Jc=1;
for k=1:n
if isempty(find(visited==k, 1))
J(Jc)=k;
Jc=Jc+1;
end
end
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));

Pcum=cumsum(P);
Select=find(Pcum>=rand);
if isempty(Select)
Tabu(i,j)=round(1+(n-1)*rand);
else
next_visit=J(Select(1));
Tabu(i,j)=next_visit;
end
end
end
if nC>=2
Tabu(1,:)=R_best(nC-1,:);
end

L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+d(R(j),R(j+1));
end
L(i)=L(i)+d(R(1),R(n));
end
L_best(nC)=min(L);
pos=find(L==L_best(nC));
R_best(nC,:)=Tabu(pos(1),:);
nC=nC+1;

Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
Tabu=zeros(m,n);
end
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:);
Shortest_Length=L_best(Pos(1));
end

❻ 急求蚁群算法解决 VRPTW问题的matlab代码,最好是ACS或者MMAS的!

function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%% ACATSP.m
%% Ant Colony Algorithm for Traveling Salesman Problem
%% ChengAihua,PLA Information Engineering University,ZhengZhou,China
%% Email:[email protected]
%% All rights reserved
%%-------------------------------------------------------------------------
%% 主要符号说明
%% C n个城市的坐标,n×2的矩阵
%% NC_max 最大迭代次数
%% m 蚂蚁个数
%% Alpha 表征信息素重要程度的参数
%% Beta 表征启发式因子重要程度的参数
%% Rho 信息素蒸发系数
%% Q 信息素增加强度系数
%% R_best 各代最佳路线
%% L_best 各代最佳路线的长度
%% 运行可能要很久,需要耐心等待
%%=========================================================================

n=length(C); %n 为市个数
for i=1:n %坐标矩阵转换为距离矩阵
for j=1:n
D(i,j)=sqrt((x(i,1)-x(j,1))^2+(x(i,2)-x(j,2))^2);
end
end
for i=1:n %Eta为启发因子,这里设为距离的倒数
for j=1:n %原文作者少考虑的当D=0是MATLAB提示出错
if i~=j
Eta(i,j)=1./D(i,j);
end
end
end
for i=1:n
Eta(i,i)=0;
end
Tau=ones(n,n); %Tau为信息素矩阵
Tabu=zeros(m,n); %存储并记录路径的生成
NC=1; %迭代计数器
R_best=zeros(NC_max,n); %各代最佳路线
L_best=inf.*ones(NC_max,1); %各代最佳路线的长度
L_ave=zeros(NC_max,1); %各代路线的平均长度

while NC<=NC_max %停止条件之一:达到最大迭代次数
%%第二步:将m只蚂蚁放到n个城市上
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';

%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1)); %已访问的城市
J=zeros(1,(n-j+1)); %待访问的城市
P=J; %待访问城市的选择概率分布
Jc=1;
for k=1:n
if length(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面计算待选城市的概率分布
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原则选取下一个城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
if NC>=2
Tabu(1,:)=R_best(NC-1,:);
end

%%第四步:记录本次迭代最佳路线
L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1;

%%第五步:更新信息素
Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;

%%第六步:禁忌表清零
Tabu=zeros(m,n);
end

%%第七步:输出结果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:);
Shortest_Length=L_best(Pos(1));
DrawRoute(C,Shortest_Route) %调用函数绘图

❼ 关于仿生学的文章

苍蝇-----小型气体分析仪。。
2。萤火虫-----人工冷光;
3。电鱼------伏特电池;
4。水母------水母耳风暴预测仪,
5。蛙眼------电子蛙眼
6。蝙蝠超声定位器的原理------探路仪”。
7。蓝藻-----光解水的装置,
8。人体骨胳肌肉系统和生物电控制的研究,——步行机。
9。动物的爪子------现代起重机的挂钩
10。动物的鳞甲------屋顶瓦楞
11。鱼的鳍------桨
12。螳螂臂,或锯齿草------锯子
13。苍耳属植物-------尼龙搭扣。
14。龙虾-------气味探测仪。
15。壁虎脚趾------粘性录音带
16。贝-----外科手术的缝合到补船等-
17。鲨鱼-----泳衣,
18。-鸟----飞机
19。鱼------潜水艇
动物仿生学

生物学家通过对蛛丝的研究制造出高级丝线,抗撕断裂降落伞与临时吊桥用的高强度缆索。船和潜艇来自人们对鱼类和海豚的模仿。

响尾蛇导弹等就是科学家模仿蛇的“热眼”功能和其舌上排列着一种似照相机装置的天然红外线感知能力的原理,研制开发出来的现代化武器。

火箭升空利用的是水母、墨鱼反冲原理。

科研人员通过研究变色龙的变色本领,为部队研制出了不少军事伪装装备。

科学家研究青蛙的眼睛,发明了电子蛙眼。

白蚁不仅使用胶粘剂建筑它们的土堆,还可以通过头部的小管向敌人喷射胶粘剂。于是人们按照同样的原理制造了工作的武器—一块干胶炮弹。

美国空军通过毒蛇的“热眼”功能,研究开发出了微型热传感器。

我国纺织科技人员利用仿生学原理,借鉴陆地动物的皮毛结构,设计出一种KEG保温面料,并具有防风和导湿的功能。

根据响尾蛇的颊窝能感觉到0.001℃的温度变化的原理,人类发明了跟踪追击的响尾蛇导弹。人类还利用蛙跳的原理设计了蛤蟆夯。人类模仿警犬的高灵敏嗅觉制成了用于侦缉的“电子警犬”。科学家根据野猪的鼻子测毒的奇特本领制成了世界上第一批防毒面具。
仿生学是人类一直使用的方法,如模仿海豚皮而构造的"海豚皮游泳衣"、科学家研究鲸鱼的皮肤时,发现其上有沟漕的结构,于是有个科学家就依照鲸鱼皮构造,造成一个薄膜蒙在飞机的表面,据实验可节约能源3%,若全国的飞机都蒙上这样的表面,每年可节约几十亿。又如有科学家研究蜘蛛,发现蜘蛛的腿上没有肌肉,有脚的动物会走,主要是靠肌肉的收缩,现在蜘蛛没有肌肉为什么会走路?经研究蜘蛛不是靠肌肉的收缩进行走路的,而是靠其中的"液压"的结构进行走路,据此人们发明了液压步行机……总之,从自然界得到启迪,模仿其结构进行发明创造.这就是仿生学. 这是我们向自然界学习的一个方面。

另一方面,我们还可以从自然的规律中得到启迪,利用其原理进行设计(包括设计算法),这就是智能计算的思想。

智能计算

智能计算,也有人称之为"软计算",就是借用自然界(生物界)规律的启迪,根据其原理,模仿设计求解问题的算法。如:人工神经网络技术、遗传算法、进化规划、模拟煺火技术和群集智能技术等。

群集智能(Swarm Intelligence)

群居昆虫以集体的力量,进行觅食、御敌、筑巢的能力。这种群体所表现出来的"智能",就称之为群体智能。如蜜蜂采蜜、筑巢、蚂蚁觅食、筑巢等。从群居昆虫互相合作进行工作中,得到启迪,研究其中的原理,以此原理来设计新的求解问题的算法。

蚂蚁算法

蚂蚁觅食时,在它走过的路上,留下外激素,这些外激素就象留下路标一样,留给后来"蚁"一个路径的标志。后面的蚂蚁,就会沿着有外激素的路径行走(外激素越多引诱蚂蚁的能力就越强)。科学家们对此进行过试验:用人造的外激素在纸上画上一条路径,对蚂蚁进行试验。结果蚂蚁果然都沿画有外激素的路径行走。

B

D

蚁穴 A

C 食物

蚂蚁寻食时,由蚁穴出发,可沿AC,也可沿ABC(见上图),设各蚂蚁寻到食物后沿原路回穴,并在路上留下外激素,那么因AC路径短,故当它们沿AC返回时,就在AC上留下两次外激素。而沿ABC返回者,因其路径长,仅回到D点,于是AD一段只留过一次外激素(即其上的外激素的浓度比AC上的浓度淡),故这时从蚁穴出来寻食者就会沿浓度大的路径AC行走……最后大多数的蚂蚁都会沿较短的路程进行寻食. 利用这个原理科学者们就设计了蚂蚁算法(进行求最短程)。

上面是个简单的原理,当然要设计出切实可行的算法,还要将模型进一步精确,如要计及外激素的挥发(即激素的浓度将随时间而逐步降低等等).

用蚂蚁算法求最短程

1.一群蚂蚁随机从出发点出发,遇到食物,衔住食物,沿原路返回

2. 蚂蚁在往返途中,在路上留下外激素标志

3. 外激素将随时间逐渐蒸发(一般可用负指数函数来描述,即乘上因子e-at)

4. 由蚁穴出发的蚂蚁,其选择路径的概率与各路径上的外激素浓度成正比

蚂蚁算法还可以应用于很多实际问题,例如用于重建通讯路由,管理公司的电话网,对用户记帐 收费等工作,任务分配问题等

不要停,继续思索

进一步,将每个蚂蚁看成是一个神经元,它们之间的通讯联络,看成是各神经元之间的连接,只不过这时的连接不是固定的,而是随机的。即用一个随机连接的神经网络来描述一个群体。这种神经网络所具有的性质,就是群体的智能
科学家们从蜻蜓翅膀末端的一块比周围略大一些的厚斑点得到了启示,从而解决了飞机机翼因剧烈抖动而破碎的现象。

蝴蝶
五彩的蝴蝶颜色粲然,如重月纹凤蝶、褐脉金斑蝶等,尤其是萤光翼凤蝶,其后翊在阳光下时而金黄,时而翠绿,有时还由紫变蓝。科学家通过对蝴蝶色彩的研究,为军事防御带来了极大的稗益。在二战期间,德军包围了列宁格勒,企图用轰炸机摧毁其军事目标和其他防御设施。苏联昆虫学家施万维奇根据当时人们对伪装缺乏认识的情况,提出利用蝴蝶的色彩在花丛中不易被发现的道理,在军事设施上覆盖蝴蝶花纹般的伪装。因此,尽管德军费尽心机,但列宁格勒的军事基地仍然无恙,为赢得最后的胜利奠定了坚实的基础。根据同样的原理,后来人们还生产出了迷彩服,大大减少了战斗中的伤亡。
人造卫星在太空中由于位置的不断变化可引起温度骤然变化,有时温差可高达两、三网络,严重影响许多仪器的正常工作。科学家们受蝴蝶身上的鳞片会随阳光的照射方向自动变换角度而调节体温的启发,将人造卫星的控温系统制成了叶片反两面辐射、散热能力相差很大的百叶窗样式,在每扇窗的转动位置安装有对温度敏感的金属丝,随温度变化可调节窗的开合,从而保持了人造卫星内部温度的恒定,解决了航天事业中的一大难题。

甲虫
甲虫自卫时,可喷射出具有恶臭的高温液体“炮弹”,以迷惑、刺激和惊吓敌害。科学家将其解剖后发现甲虫体内有3个小室,分别储有二元酚溶液、双氧水和生物酶。二元酚和双氧水流到第三小室与生物酶混合发生化学反应,瞬间就成为100℃的毒液,并迅速射出。这种原理目前已应用于军事技术中。二战期间,德国纳粹为了战争的需要,据此机理制造出了一种功率极大且性能安全可靠的新型发动机,安装在飞航式导弹上,使之飞行速度加快,安全稳定,命中率提高,英国伦敦在受其轰炸时损失惨重。美国军事专家受甲虫喷射原理的启发研制出了先进的二元化武器。这种武器将两种或多种能产生毒剂的化学物质分装在两个隔开的容器中,炮弹发射后隔膜破裂,两种毒剂中间体在弹体飞行的8—10秒内混合并发生反应,在到达目标的瞬间生成致命的毒剂以杀伤敌人。它们易于生产、储存、运输,安全且不易失效。萤火虫可将化学能直接转变成光能,且转化效率达100%,而普通电灯的发光效率只有6%。人们模仿萤火虫的发光原理制成的冷光源可将发光效率提高十几倍,大大节约了能量。另外,根据甲虫的视动反应机制研制成功的空对地速度计已成功地应用于航空事业中。

蜻蜓
蜻蜓通过翅膀振动可产生不同于周围大气的局部不稳定气流,并利用气流产生的涡流来使自己上升。蜻蜓能在很小的推力下翱翔,不但可向前飞行,还能向后和左右两侧飞行,其向前飞行速度可达72公里/小时。此外,蜻蜓的飞行行为简单,仅靠两对翅膀不停地拍打。科学家据此结构基础研制成功了直升飞机。飞机在高速飞行时,常会引起剧烈振动,甚至有时会折断机翼而引起飞机失事。蜻蜓依靠加重的翅膀在高速飞行时安然无恙,于是人们效仿蜻蜓在飞机的两翼加上了平衡重锤,解决了因高速飞行而引起振动这个令人棘手的问题。
为了研究滑翔飞行和碰撞的空气动力学以及其飞行的效率,一个四叶驱动,用远程水平仪控制的机动机翼(翅膀)模型被研制,并第一次在风洞内测试了各项飞行参数。
第二个模型试图安装一个以更快频率飞行的翅膀,达到每秒18次震动的速度。有特色的是,这个模型采用了可变可调节前后两对机翼之间相差的装置。
研究的中心和长远目标,是要研究使用“翅膀”驱动的飞机表现,以及与传统的螺旋推动器驱动的飞机效率的比较等等。

苍蝇
家蝇的特别之处在于它的快速的飞行技术,这使得它很难被人类抓住。即使在它的后面也很难接近它。它设想到了每一种情况,非常小心,并能快速移动。那么,它是怎么做到的呢?
昆虫学家研究发现,苍蝇的后翅退化成一对平衡棒。当它飞行时,平衡棒以一定的频率进行机械振动,可以调节翅膀的运动方向,是保持苍蝇身体平衡导航仪。科学家据此原理研制成一代新型导航仪——振动陀螺仪,大在改进了飞机的飞行性能,可使飞机自动停止危险的滚翻飞行,在机体强烈倾斜时还能自动恢复平衡,即使是飞机在最复杂的急转弯时也万无一失。苍蝇的复眼包含4000个可独立成像的单眼,能看清几乎360度范围内的物体。在蝇眼的启示下,人们制成了由1329块小透镜组成的一次可拍1329张高分辨率照片的蝇眼照像机,在军事、医学、航空、航天上被广泛应用。苍蝇的嗅觉特别灵敏并能对数十种气味进行快速分析且可立即作出反应。科学家根据苍蝇嗅觉器官的结构,把各种化学反应转变成电脉冲的方式,制成了十分灵敏的小型气体分析仪,目前已广泛应用于宇宙飞船、潜艇和矿井等场所来检测气体成分,使科研、生产的安全系数更为准确、可靠。

蜂类
蜂巢由一个个排列整齐的六棱柱形小蜂房组成,每个小蜂房的底部由3个相同的菱形组成,这些结构与近代数学家精确计算出来的——菱形钝角109○28’,锐角70○32’完全相同,是最节省材料的结构,且容量大、极坚固,令许多专家赞叹不止。人们仿其构造用各种材料制成蜂巢式夹层结构板,强度大、重量轻、不易传导声和热,是建筑及制造航天飞机、宇宙飞船、人造卫星等的理想材料。蜜蜂复眼的每个单眼中相邻地排列着对偏振光方向十分敏感的偏振片,可利用太阳准确定位。科学家据此原理研制成功了偏振光导航仪,被广泛用于航海事业中。

苍蝇、萤火虫、电鱼、水母,见下详述。
第五个:章鱼的吸盘~

仿生学是一门模仿生物的特殊本领,利用生物的结构和功能原理来研制机械或各种新技术的科学。据传说,我国古代着名工匠鲁班,上山伐树时,被丝矛草割破了手。他觉得奇怪,一棵小草怎么会这样厉害?经过仔细观察,他发现丝茅草叶子的边缘长着许多锋利的细齿。于是鲁班发明了木工用的锯子。据推测,古代木船的发明,是从鱼类的游泳得到了启示。在发明飞机的过程中,人们也从虫、鸟的飞行中学到了许多有用的知识。

现在,科学家们正带着定向、导航、探测、能量转换、信息处理、生物合成、结构力学和流体力学等众多的科学难题,到生物界中去寻找启示和答案。

苍蝇与宇宙飞船

令人讨厌的苍蝇,与宏伟的航天事业似乎风马牛不相及,但仿生学却把它们紧密地联系起来了。

苍蝇是声名狼藉的“逐臭之夫”,凡是腥臭污秽的地方,都有它们的踪迹。苍蝇的嗅觉特别灵敏,远在几千米外的气味也能嗅到。但是苍蝇并没有“鼻子”,它靠什么来充当嗅觉的呢? 原来,苍蝇的“鼻子”——嗅觉感受器分布在头部的一对触角上。

每个“鼻子”只有一个“鼻孔”与外界相通,内含上百个嗅觉神经细胞。若有气味进入“鼻孔”,这些神经立即把气味刺激转变成神经电脉冲,送往大脑。大脑根据不同气味物质所产生的神经电脉冲的不同,就可区别出不同气味的物质。因此,苍蝇的触角像是一台灵敏的气体分析仪。

仿生学家由此得到启发,根据苍蝇嗅觉器的结构和功能,仿制成功一种十分奇特的小型气体分析仪。这种仪器的“探头”不是金属,而是活的苍蝇。就是把非常纤细的微电极插到苍蝇的嗅觉神经上,将引导出来的神经电信号经电子线路放大后,送给分析器;分析器一经发现气味物质的信号,便能发出警报。这种仪器已经被安装在宇宙飞船的座舱里,用来检测舱内气体的成分。

这种小型气体分析仪,也可测量潜水艇和矿井里的有害气体。利用这种原理,还可用来改进计算机的输入装置和有关气体色层分析仪的结构原理中。

从萤火虫到人工冷光

自从人类发明了电灯,生活变得方便、丰富多了。但电灯只能将电能的很少一部分转变成可见光,其余大部分都以热能的形式浪费掉了,而且电灯的热射线有害于人眼。那么,有没有只发光不发热的光源呢? 人类又把目光投向了大自然。

在自然界中,有许多生物都能发光,如细菌、真菌、蠕虫、软体动物、甲壳动物、昆虫和鱼类等,而且这些动物发出的光都不产生热,所以又被称为“冷光”。

在众多的发光动物中,萤火虫是其中的一类。萤火虫约有1 500种,它们发出的冷光的颜色有黄绿色、橙色,光的亮度也各不相同。萤火虫发出冷光不仅具有很高的发光效率,而且发出的冷光一般都很柔和,很适合人类的眼睛,光的强度也比较高。因此,生物光是一种人类理想的光。

科学家研究发现,萤火虫的发光器位于腹部。这个发光器由发光层、透明层和反射层三部分组成。发光层拥有几千个发光细胞,它们都含有荧光素和荧光酶两种物质。在荧光酶的作用下,荧光素在细胞内水分的参与下,与氧化合便发出荧光。萤火虫的发光,实质上是把化学能转变成光能的过程。

早在40年代,人们根据对萤火虫的研究,创造了日光灯,使人类的照明光源发生了很大变化。近年来,科学家先是从萤火虫的发光器中分离出了纯荧光素,后来又分离出了荧光酶,接着,又用化学方法人工合成了荧光素。由荧光素、荧光酶、ATP(三磷酸腺苷)和水混合而成的生物光源,可在充满爆炸性瓦斯的矿井中当闪光灯。由于这种光没有电源,不会产生磁场,因而可以在生物光源的照明下,做清除磁性水雷等工作。

现在,人们已能用掺和某些化学物质的方法得到类似生物光的冷光,作为安全照明用。

电鱼与伏特电池

自然界中有许多生物都能产生电,仅仅是鱼类就有500余种 。人们将这些能放电的鱼,统称为“电鱼”。

各种电鱼放电的本领各不相同。放电能力最强的是电鳐、电鲶和电鳗。中等大小的电鳐能产生70伏左右的电压,而非洲电鳐能产生的电压高达220伏;非洲电鲶能产生350伏的电压;电鳗能产生500伏的电压,有一种南美洲电鳗竟能产生高达880伏的电压,称得上电击冠军,据说它能击毙像马那样的大动物。

电鱼放电的奥秘究竟在哪里?经过对电鱼的解剖研究, 终于发现在电鱼体内有一种奇特的发电器官。这些发电器是由许多叫电板或电盘的半透明的盘形细胞构成的。由于电鱼的种类不同,所以发电器的形状、位置、电板数都不一样。电鳗的发电器呈棱形,位于尾部脊椎两侧的肌肉中;电鳐的发电器形似扁平的肾脏,排列在身体中线两侧,共有200万块电板;电鲶的发电器起源于某种腺体,位于皮肤与肌肉之间,约有500万块电板。单个电板产生的电压很微弱,但由于电板很多,产生的电压就很大了。

电鱼这种非凡的本领,引起了人们极大的兴趣。19世纪初,意大利物理学家伏特,以电鱼发电器官为模型,设计出世界上最早的伏打电池。因为这种电池是根据电鱼的天然发电器设计的,所以把它叫做“人造电器官”。对电鱼的研究,还给人们这样的启示:如果能成功地模仿电鱼的发电器官,那么,船舶和潜水艇等的动力问题便能得到很好的解决。

水母的顺风耳

“燕子低飞行将雨,蝉鸣雨中天放晴。”生物的行为与天气的变化有一定关系。沿海渔民都知道,生活在沿岸的鱼和水母成批地游向大海,就预示着风暴即将来临。

水母,又叫海蜇,是一种古老的腔肠动物,早在5亿年前,它就漂浮在海洋里了。这种低等动物有预测风暴的本能,每当风暴来临前,它就游向大海避难去了。

原来,在蓝色的海洋上,由空气和波浪摩擦而产生的次声波 (频率为每秒8—13次),总是风暴来临的前奏曲。这种次声波人耳无法听到,小小的水母却很敏感。仿生学家发现,水母的耳朵的共振腔里长着一个细柄,柄上有个小球,球内有块小小的听石,当风暴前的次声波冲击水母耳中的听石时,听石就剌激球壁上的神经感受器,于是水母就听到了正在来临的风暴的隆隆声。

仿生学家仿照水母耳朵的结构和功能,设计了水母耳风暴预测仪,相当精确地模拟了水母感受次声波的器官。把这种仪器安装在舰船的前甲板上,当接受到风暴的次声波时,可令旋转360°的喇叭自行停止旋转,它所指的方向,就是风暴前进的方向;指示器上的读数即可告知风暴的强度。这种预测仪能提前15小时对风暴作出预报,对航海和渔业的安全都有重要帮助

❽ 求生物学 蚁群算法

蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质.针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。

下面详细说明:
1、范围:
蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半径(一般是3),那么它能观察到的范围就是3*3个方格世界,并且能移动的距离也在这个范围之内。
2、环境:
蚂蚁所在的环境是一个虚拟的世界,其中有障碍物,有别的蚂蚁,还有信息素,信息素有两种,一种是找到食物的蚂蚁洒下的食物信息素,一种是找到窝的蚂蚁洒下的窝的信息素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让信息素消失。
3、觅食规则:
在每只蚂蚁能感知的范围内寻找是否有食物,如果有就直接过去。否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多,这样,它就朝信息素多的地方走,并且每只蚂蚁都会以小概率犯错误,从而并不是往信息素最多的点移动。蚂蚁找窝的规则和上面一样,只不过它对窝的信息素做出反应,而对食物信息素没反应。
4、移动规则:
每只蚂蚁都朝向信息素最多的方向移,并且,当周围没有信息素指引的时候,蚂蚁会按照自己原来运动的方向惯性的运动下去,并且,在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈,它会记住最近刚走过了哪些点,如果发现要走的下一点已经在最近走过了,它就会尽量避开。
5、避障规则:
如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有信息素指引的话,它会按照觅食的规则行为。
6、播撒信息素规则:
每只蚂蚁在刚找到食物或者窝的时候撒发的信息素最多,并随着它走远的距离,播撒的信息素越来越少。
根据这几条规则,蚂蚁之间并没有直接的关系,但是每只蚂蚁都和环境发生交互,而通过信息素这个纽带,实际上把各个蚂蚁之间关联起来了。比如,当一只蚂蚁找到了食物,它并没有直接告诉其它蚂蚁这儿有食物,而是向环境播撒信息素,当其它的蚂蚁经过它附近的时候,就会感觉到信息素的存在,进而根据信息素的指引找到了食物。

❾ 遗传算法和蚁群算法在求解TSP问题上的对比分析

【原创】比遗传算法性能更好:蚁群算法TSP(旅行商问题)通用matlab程序
声明:本程序为本人原创,在研学论坛首次发表,本人保留一切权利,仅供学习交流用,如转载请注明原作者!

function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%% ACATSP.m
%% Ant Colony Algorithm for Traveling Salesman Problem
%% ChengAihua,PLA Information Engineering University,ZhengZhou,China
%% Email:[email protected]
%% All rights reserved
%%-------------------------------------------------------------------------
%% 主要符号说明
%% C n个城市的坐标,n×2的矩阵
%% NC_max 最大迭代次数
%% m 蚂蚁个数
%% Alpha 表征信息素重要程度的参数
%% Beta 表征启发式因子重要程度的参数
%% Rho 信息素蒸发系数
%% Q 信息素增加强度系数
%% R_best 各代最佳路线
%% L_best 各代最佳路线的长度
%%=========================================================================

%%第一步:变量初始化
n=size(C,1);%n表示问题的规模(城市个数)
D=zeros(n,n);%D表示完全图的赋权邻接矩阵
for i=1:n
for j=1:n
if i~=j
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
else
D(i,j)=eps;
end
D(j,i)=D(i,j);
end
end
Eta=1./D;%Eta为启发因子,这里设为距离的倒数
Tau=ones(n,n);%Tau为信息素矩阵
Tabu=zeros(m,n);%存储并记录路径的生成
NC=1;%迭代计数器
R_best=zeros(NC_max,n);%各代最佳路线
L_best=inf.*ones(NC_max,1);%各代最佳路线的长度
L_ave=zeros(NC_max,1);%各代路线的平均长度

while NC<=NC_max%停止条件之一:达到最大迭代次数
%%第二步:将m只蚂蚁放到n个城市上
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';

%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1));%已访问的城市
J=zeros(1,(n-j+1));%待访问的城市
P=J;%待访问城市的选择概率分布
Jc=1;
for k=1:n
if length(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面计算待选城市的概率分布
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原则选取下一个城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
if NC>=2
Tabu(1,:)=R_best(NC-1,:);
end

%%第四步:记录本次迭代最佳路线
L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1

%%第五步:更新信息素
Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;

%%第六步:禁忌表清零
Tabu=zeros(m,n);
end

%%第七步:输出结果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:)
Shortest_Length=L_best(Pos(1))
subplot(1,2,1)
DrawRoute(C,Shortest_Route)
subplot(1,2,2)
plot(L_best)
hold on
plot(L_ave)

function DrawRoute(C,R)
%%=========================================================================
%% DrawRoute.m
%% 画路线图的子函数
%%-------------------------------------------------------------------------
%% C Coordinate 节点坐标,由一个N×2的矩阵存储
%% R Route 路线
%%=========================================================================

N=length(R);
scatter(C(:,1),C(:,2));
hold on
plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)])
hold on
for ii=2:N
plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)])
hold on
end

设置初始参数如下:
m=31;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;
31城市坐标为:
1304 2312
3639 1315
4177 2244
3712 1399
3488 1535
3326 1556
3238 1229
4196 1004
4312 790
4386 570
3007 1970
2562 1756
2788 1491
2381 1676
1332 695
3715 1678
3918 2179
4061 2370
3780 2212
3676 2578
4029 2838
4263 2931
3429 1908
3507 2367
3394 2643
3439 3201
2935 3240
3140 3550
2545 2357
2778 2826
2370 2975

运行后得到15602的巡游路径,

❿ 蚁群算法,退火算法这些东西究竟属于什么,这些东西要从哪里才能系统学习

第1章绪论
1.1蚂蚁的基本习性
1.1.1蚂蚁的信息系统
1.1.2蚁群社会的遗传与进化
1.2蚁群觅食行为与觅食策略
1.2.1蚂蚁的觅食行为
1.2.2蚂蚁的觅食策略
1.3人工蚁群算法的基本思想
1.3.1人工蚁与真实蚂蚁的异同
1.3.2人工蚁群算法的实现过程
1.4蚁群优化算法的意义及应用
1.4.1蚁群优化算法的意义
l.4.2蚁群算法的应用
1.5蚁群算法的展望
第2章蚂蚁系统——蚁群算法的原型
2.1蚂蚁系统模型的建立
2.2蚁量系统和蚁密系统的模型
2.3蚁周系统模型
第3章改进的蚁群优化算法
3.1带精英策略的蚂蚁系统
3.2基于优化排序的蚂蚁系统
3.3蚁群系统
3.3.1蚁群系统状态转移规则
3.3.2蚁群系统全局更新规则
3.3.3蚁群系统局部更新规则
3.3.4候选集合策略
3.4最大一最小蚂蚁系统
3.4.1信息素轨迹更新
3.4.2信息素轨迹的限制
3.4.3信息素轨迹的初始化
3.4.4信息素轨迹的平滑化
3.5最优一最差蚂蚁系统
3.5.1最优一最差蚂蚁系统的基本思想
3.5.2最优一最差蚂蚁系统的工作过程
第4章蚁群优化算法的仿真研究
4.1蚂蚁系统三类模型的仿真研究
4.1.1三类模型性能的比较
4.2.2基于统计的参数优化
4.2基于蚁群系统模型的仿真研究
4.2.1局部优化算法的有效性
4.2.2蚁群系统与其他启发算法的比较
4.3最大一最小蚂蚁系统的仿真研究
4.3.1信息素轨迹初始化研究
4.3.2信息素轨迹量下限的作用
4.3.3蚁群算法的对比
4.4最优一最差蚂蚁系统的仿真研究
4.4.1参数ε的设置
4.4.2几种改进的蚁群算法比较
第5章蚁群算法与遗传、模拟退火算法的对比
5.1遗传算法
5.1.1遗传算法与自然选择
5.1.2遗传算法的基本步骤
5.1.3旅行商问题的遗传算法实现
5.2模拟退火算法
5.2.1物理退火过程和Metroplis准则
5.2.2模拟退火法的基本原理
5.3蚁群算法与遗传算法、模拟退火算法的比较
5.3.1三种算法的优化质量比较
5.3.2三种算法收敛速度比较
5.3.3三种算法的特点与比较分析
第6章蚁群算法与遗传、免疫算法的融合
6.1遗传算法与蚂蚁算法融合的GAAA算法
6.1.1遗传算法与蚂蚁算法融合的基本思想
……
第7章自适应蚁群算法
第8章并行蚁群算法
第9章蚁群算法的收敛性与蚁群行为模型
第10章蚁群算法在优化问题中的应用
附录
参考文献

热点内容
安卓手机哪个处理器是最好的 发布:2025-05-14 05:40:23 浏览:529
java语言实现 发布:2025-05-14 05:34:43 浏览:234
数控系统主轴配置参数有哪些 发布:2025-05-14 05:25:55 浏览:819
二级缓存微服务 发布:2025-05-14 05:13:55 浏览:101
sqlserverwhencase 发布:2025-05-14 05:11:35 浏览:434
安卓odd是什么意思 发布:2025-05-14 04:49:57 浏览:921
安卓哪个app能查询航班 发布:2025-05-14 04:49:04 浏览:558
linux定时shell脚本 发布:2025-05-14 04:49:00 浏览:684
审计需要什么配置 发布:2025-05-14 04:48:55 浏览:550
安卓软件为什么经常自启动 发布:2025-05-14 04:38:17 浏览:160