蚁群算法的模拟——动画演示

本文介绍了蚁群算法的基本原理,模拟了蚂蚁寻找食物和窝的过程,详细阐述了算法中的关键步骤,包括信息素挥发、蚂蚁行为规则等。通过C语言实现了蚁群算法,程序以动画形式展示了蚂蚁的移动和信息素分布,展示了算法的收敛效果。
摘要由CSDN通过智能技术生成

一、蚁群算法介绍 

        蚁群算法是一种在图中寻找最优路径的机率型算法。因为其算法的依据是局部的最优通过迭代形成全局最优,由于中间过程随机性因素比较多,因此称为机率型算法。算法的设计思想是模拟蚂蚁找食物,然后运回家的过程。百度百科对此过程做了一个比较好的描述:各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物。当一只找到食物以后,它会向环境释放一种挥发性分泌物pheromone (称为信息素,该物质随着时间的推移会逐渐挥发消失,信息素浓度的大小表征路径的远近)来实现的,吸引其他的蚂蚁过来,这样越来越多的蚂蚁会找到食物。有些蚂蚁并没有像其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果另开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上来。最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。

       因此该算法主要包括这几个方面的模拟:

1模拟的图场景中包含了两种信息素,一种表示家,一种表示食物的地点,并且这两种信息素都在以一定的速率进行挥发。

2 每个蚂蚁只能感知它周围的小部分地方的信息。蚂蚁在寻找食物的时候,如果在感知范围内,就可以直接过去,如果不在感知范围内,就要朝着信息素多的地方走,蚂蚁可以有一个小概率不往信息素多的地方走,而另辟蹊径,这个小概率事件很重要,代表了一种找路的创新,对于找到更优的解很重要。

3、蚂蚁找窝的规则与找食物的规则相同

4、蚂蚁在移动时候首先会根据信息素的指引,如果没有信息素的指引,会按照自己的移动方向惯性走下去,但也有一定的机率改变方向,蚂蚁还可以记住已经走过的路,避免重复走一个地方。

5、蚂蚁在找到食物是留下的信息素最多,然后距离食物越远的地方留下的信息素越少。找到窝的信息素留下的量的规则跟食物相同。

     通过上述规则,我们可以发现在蚁群算法中很多不确定的因素和随机因素,比如信息素的留下量与距离食物距离的关系,信息素挥发的速率,蚂蚁随机偏离信息素大的地方的概率。这些因素都会影响到算法的收敛速度已经结果。很可能某些参数设置不合理导致最终收敛结果不正确。理论的分析是可以得到全局最优解的,并且最优解是稳定的,但是由于实际的设计中不确定因素,导致往往达不到理论的结果,因此有很多优化了的蚁群算法,以加快算法收敛的素的。而我模拟蚁群算法的程序,是基本的蚁群算法,各参数和随机因子的设置也是我自己大致设置的,因此结果当然是达不到理想状态,但是整个模拟过程是按照蚁群算法的规则来了,最终程序也可以达到收敛状态,只是收敛状态不是我们想要的!!哈哈。

二、程序代码设计

      将每个蚂蚁定义为一个结构体变量,由一个坐标表示位置,然后有一些表示蚂蚁状态的变量,比如home=0表示蚂蚁还没有发现窝。每个蚂蚁首先去找食物,然后找到食物后就去找窝,沿途会留下信息素,并且信息素定期挥发更新。int GoNext();函数表示判断蚂蚁下一步该往哪个方向走。int ManagePheromone();函数用于管理整个场景的信息素,程序通过动画的形式显示每个蚂蚁的位置。程序中初始化了200只蚂蚁随机分布在场景内。通过程序的后几张动画截图,可以看见大量蚂蚁聚集在某些地方,表示那些地方的信息素比较多。也就是算法的收敛效果体现。后两幅图是第二次运行结果的收敛情况图。可以看见食物和窝的位置不同(黄色点表示食物,红色点表示窝)。

三、程序源代码

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include <graphics.h> 
typedef struct ants
{
int x;
int y;
int nextstep;
int home;
int food;
int destination;
double infof;
double infoh;
int p[360000][2];
int distance;
}ANT;
#define rooml 600
#define roomw 600
#define looseSpeed 0.956
double pheromone[rooml][roomw][2];
int antNum=200,hx=15,hy=20,fx=400,fy=400;
ANT *ant=NULL;
int GoNext();
int initSystem();
int ManagePheromone();
int CommonMove(int i,int info);
int toFood(int i);
int toHome(int i);
int draw();
int isPass(int anti,int i,int j);


int main()
{
initgraph(600,600);
BeginBatchDraw();
srand(time(0));
ant=(ANT*)malloc(antNum*sizeof(ANT));
initSystem();
while(1)
{
GoNext();
draw();
Sleep(1);
}


return 0;
}


int initSystem()
{
int i=0,j=0;
for(i=0; i<antNum; ++i)
{
ant[i].x=rand()%600;
ant[i].y=rand()%600;
ant[i].nextstep=rand();//8
ant[i].home=0;  //没有发现窝
ant[i].food=0;  //没有发现食物
ant[i].destination=1;  //目标找食物
ant[i].infof=100;   //信息素的量
ant[i].infoh=100;   //信息素的量
ant[i].distance=0;
}

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值