蚁群算法C程序代码_第1页
蚁群算法C程序代码_第2页
蚁群算法C程序代码_第3页
蚁群算法C程序代码_第4页
蚁群算法C程序代码_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#define SPACE 0x20#define ESC 0x1b#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.hvoid 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 SmellAmount2; int tracexTRACE_REMEMBER; int traceyTRACE_REMEMBER; int TracePtr; int IQ;antMAX_ANT;int AntNow;int timer10ms;struct time starttime,endtime;int Smell2MAXX+1MAXY+1;int blockMAXX+1MAXY+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.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(); /* - general sub process - */int MainTimer(void)/* output: how much 10ms have pass from last time call this process */ static int oldhund,oldsec; struct time t; int timeuse; gettime(&t); timeuse = 0; if(t.ti_hund!=oldhund) if(t.ti_sec!=oldsec) timeuse+=100; oldsec = t.ti_sec; timeuse+=t.ti_hund-oldhund; oldhund = t.ti_hund; else timeuse = 0; return (timeuse);char WaitForKey(int secnum)/* funtion: if have key in, exit immediately, else wait secnum senconds then exit input: secnum - wait this senconds, must minin) secuse = (minnow-1-minin) + (secnow+60-secin); else secuse = secnow - secin; /* counting error check */ if(secuse0) gotoxy(1,MAXY+1); printf(Time conuting error, any keyto exit.); getch(); exit(3); while(secuse=secnum); return (NULL);void DispPlayTime(void) int ph,pm,ps; ph = endtime.ti_hour - starttime.ti_hour; pm = endtime.ti_min - starttime.ti_min; ps = endtime.ti_sec - starttime.ti_sec; if(ph0) ph+=24; if(pm0) ph-; pm+=60; if(ps0) pm-; ps+=60; gotoxy(1,MAXY+1); printf(Time use: %d hour- %d min- %d sec ,ph,pm,ps);int TimeUse(void) int ph,pm,ps; gettime(&endtime); ph = endtime.ti_hour - starttime.ti_hour; pm = endtime.ti_min - starttime.ti_min; ps = endtime.ti_sec - starttime.ti_sec; if(ph0) ph+=24; if(pm0) ph-; pm+=60; if(ps0) pm-; ps+=60; return(ps+(60*(pm+60*ph);void HideCur(void) union REGS regs0; regs0.h.ah=1; regs0.h.ch=0x30; regs0.h.cl=0x31; int86(0x10,®s0,®s0);void ResetCur(void) union REGS regs0; regs0.h.ah=1; regs0.h.ch=0x06; regs0.h.cl=0x07; int86(0x10,®s0,®s0);/* - main ANT programe - */void WorldInitial(void) int k,i,j; randomize(); clrscr(); HomeFoodInitial(); for(AntNow=0;AntNowMAX_ANT;AntNow+) AntInitial(); /* of for AntNow */; BlockInitial(); for(k=0;k=1;k+) /* SMELL TYPE FOOD and HOME */ for(i=0;i=MAXX;i+) for(j=0;j=MAXY;j+) Smellkij = 0; SmellGoneTimer = 0; gettime(&starttime); SmellDispFlag = 0; CanFindFood = 0; HardtoFindPath = 0;void BlockInitial(void) int i,j; int bn; for(i=0;i=MAXX;i+) for(j=0;j=MAXY;j+) blockij = 0; bn = 1+ MAX_BLOCK/2 + random(MAX_BLOCK/2); for(i=0;iMAXX) x2 = MAXX; if(y2MAXY) y2 = MAXY; if(food.xxx=x1&food.xxx=y1&food.yyy=x1&home.xxx=y1&home.yyy=y2) return; for(i=x1;i=x2;i+) for(j=y1;j=y2;j+) blockij = 1; gotoxy(i,j); putch(BLOCK_CHAR); void SaveBlock(void)FILE *fp_block;char FileNameBlock20;int i,j;gotoxy(1,MAXY+1); printf( ); gotoxy(1,MAXY+1);printf(Save to file.,FileNameBlock);gets(FileNameBlock);if(FileNameBlock0=0) strcpy(FileNameBlock,Ant.ant);else strcat(FileNameBlock,.ant);if (fp_block = fopen(FileNameBlock, wb) = NULL)gotoxy(1,MAXY+1); printf(Creat file %s fail.,FileNameBlock);getch();exit(2);gotoxy(1,MAXY+1); printf( ); fputc(home.xxx,fp_block);fputc(home.yyy,fp_block);fputc(food.xxx,fp_block);fputc(food.yyy,fp_block);for(i=0;i=MAXX;i+) for(j=0;j=MAXY;j+) fputc(blockij,fp_block); fclose(fp_block);void LoadBlock(void)FILE *fp_block;char FileNameBlock20;int i,j,k;gotoxy(1,MAXY+1); printf( ); gotoxy(1,MAXY+1);printf(Load file.,FileNameBlock);gets(FileNameBlock);if(FileNameBlock0=0) strcpy(FileNameBlock,Ant.ant);else strcat(FileNameBlock,.ant);if (fp_block = fopen(FileNameBlock, rb) = NULL)gotoxy(1,MAXY+1); printf(Open file %s fail.,FileNameBlock);getch();exit(2);clrscr();home.xxx = fgetc(fp_block);home.yyy = fgetc(fp_block);food.xxx = fgetc(fp_block);food.yyy = fgetc(fp_block);gotoxy(home.xxx,home.yyy); putch(HOME_CHAR); gotoxy(food.xxx,food.yyy); putch(FOOD_CHAR); food.amount = random(MAX_FOOD/3)+2*MAX_FOOD/3+1; /* food.amount = MAX_FOOD; */ home.amount = 0; home.TargetFood = (food.amountTARGET_FOOD)?food.amount:TARGET_FOOD;for(AntNow=0;AntNowMAX_ANT;AntNow+) AntInitial(); /* of for AntNow */; for(i=0;i=MAXX;i+) for(j=0;j=MAXY;j+) blockij = fgetc(fp_block); if(blockij) gotoxy(i,j); putch(BLOCK_CHAR); for(k=0;k=1;k+) /* SMELL TYPE FOOD and HOME */ for(i=0;i=MAXX;i+) for(j=0;j=MAXY;j+) Smellkij = 0; SmellGoneTimer = 0; gettime(&starttime); SmellDispFlag = 0; CanFindFood = 0; HardtoFindPath = 0; fclose(fp_block);void HomeFoodInitial(void) int randnum; int homeplace; /* 1 - home at left-up, food at right-down 2 - home at left-down, food at right-up 3 - home at right-up, food at left-down 4 - home at right-down, food at left-up */ randnum = random(100); if(randnum=25&randnum=50&randnum75) homeplace = 3; else homeplace = 4; switch(homeplace) case 1: home.xxx = random(MAXX/3)+1; home.yyy = random(MAXY/3)+1; food.xxx = random(MAXX/3)+2*MAXX/3+1; food.yyy = random(MAXY/3)+2*MAXY/3+1; break; case 2: home.xxx = random(MAXX/3)+1; home.yyy = random(MAXY/3)+2*MAXY/3+1; food.xxx = random(MAXX/3)+2*MAXX/3+1; food.yyy = random(MAXY/3)+1; break; case 3: home.xxx = random(MAXX/3)+2*MAXX/3+1; home.yyy = random(MAXY/3)+1; food.xxx = random(MAXX/3)+1; food.yyy = random(MAXY/3)+2*MAXY/3+1; break; case 4: home.xxx = random(MAXX/3)+2*MAXX/3+1; home.yyy = random(MAXY/3)+2*MAXY/3+1; food.xxx = random(MAXX/3)+1; food.yyy = random(MAXY/3)+1; break; food.amount = random(MAX_FOOD/3)+2*MAX_FOOD/3+1; /* food.amount = MAX_FOOD; */ home.amount = 0; home.TargetFood = (food.amountTARGET_FOOD)?food.amount:TARGET_FOOD; /* data correctness check */ if(home.xxxMAXX|home.yyyMAXY| food.xxxMAXX|food.yyyMAXY| food.amount=0) gotoxy(1,MAXY+1); printf(World initial fail, any key to exit.); getch(); exit(2); gotoxy(home.xxx,home.yyy); putch(HOME_CHAR); gotoxy(food.xxx,food.yyy); putch(FOOD_CHAR);void AntInitial(void)/* initial antAntNow */ int randnum; int i; antAntNow.xxx = home.xxx; antAntNow.yyy = home.yyy; randnum = random(100); if(randnum=25&randnum=50&randnum75) antAntNow.dir = LEFT; else antAntNow.dir = RIGHT; antAntNow.speed = 2*(random(INI_SPEED/2)+1); antAntNow.SpeedTimer = 0; antAntNow.food = 0; antAntNow.SmellAmountSMELL_TYPE_FOOD = 0; antAntNow.SmellAmountSMELL_TYPE_HOME = MAX_SMELL; antAntNow.IQ = 1; for(i=0;i=SMELL_GONE_SPEED) SmellGoneTimer = 0; for(k=0;k=1;k+) /* SMELL TYPE FOOD and HOME */ for(i=1;i=MAXX;i+) for(j=1;j=30000|smelldisp9) putch(#); else putch(smelldisp+0); Smellkij-= 1+(Smellkij*SMELL_GONE_RATE); if(Smellkij0) Smellkij = 0; if(SmellDispFlag) if(Smellkij=2) gotoxy(i,j); putch(SPACE); /* of one location */ /* of time to change the world */ /* of world change */void AntMove(void) int antx,anty; int smelltodrop,smellnow; for(AntNow=0;AntNow=antAntNow.speed) antAntNow.SpeedTimer = 0; gotoxy(antAntNow.xxx,antAntNow.yyy); putch(SPACE); AntOneStep(); gotoxy(antAntNow.xxx,antAntNow.yyy); /* ant0 is a sepecail ant, use different color */ if(AntNow=0) textcolor(0xd); if(antAntNow.food) putch(ANT_CHAR_FOOD); else putch(ANT_CHAR_EMPTY); if(AntNow=0) textcolor(0x7); /* remember trace */ antAntNow.tracexantAntNow.TracePtr = antAntNow.xxx; antAntNow.traceyantAntNow.TracePtr = antAntNow.yyy; if(+(antAntNow.TracePtr)=TRACE_REMEMBER) antAntNow.TracePtr = 0; /* drop smell */ antx = antAntNow.xxx; anty = antAntNow.yyy; if(antAntNow.food) /* have food, looking for home */ if(antAntNow.SmellAmountSMELL_TYPE_FOOD) smellnow = SmellSMELL_TYPE_FOODantxanty; smelltodrop = antAntNow.SmellAmountSMELL_TYPE_FOOD*SMELL_DROP_RATE; if(smelltodropsmellnow) SmellSMELL_TYPE_FOODantxanty = smelltodrop; /* else Smell. = smellnow */ antAntNow.SmellAmountSMELL_TYPE_FOOD-= smelltodrop; if(antAntNow.SmellAmountSMELL_TYPE_FOODsmellnow) SmellSMELL_TYPE_HOMEantxanty = smelltodrop; /* else Smell. = smellnow */ antAntNow.SmellAmountSMELL_TYPE_HOME-= smelltodrop; if(antAntNow.SmellAmountSMELL_TYPE_HOME0) putch(FOOD_CHAR); else putch(FOOD_CHAR2); textcolor(7); gotoxy(1,MAXY+1); printf(Food %d, Home %d ,food.amount,home.amount);void AntOneStep(void) int ddir,tttx,ttty; int i; ddir = antAntNow.dir; tttx = antAntNow.xxx; ttty = antAntNow.yyy; ddir = AntNextDir(tttx,ttty,ddir); switch(ddir) case UP: ttty-; break; case DOWN: ttty+; brea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论