www.pudn.com > algorithms.rar > 蚁群算法-matlab.txt, change:2011-03-23,size:8992b


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(); 
}  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//shaoweixiugaiban,cuowutingduo. 
 
 
 
 
#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; 
 
   
  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.amount==100&&!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(); 
}