版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
蟻群算法小程序(C/C++語言實現(xiàn))算法解釋:程序開始運行,螞蟻們開始從窩里出動了,尋找食物;他們會順著屏幕爬滿整個畫面,直到找到食物再返回窩。其中,‘F’點表示食物,‘H’表示窩,白色塊表示障礙物,‘+’就是螞蟻了。預(yù)期的結(jié)果:各個螞蟻在沒有事先告訴他們食物在什么地方的前提下開始尋找食物。當一只找到食物以后,它會向環(huán)境釋放一種信息素,吸引其他的螞蟻過來,這樣越來越多的螞蟻會找到食物!有些螞蟻并沒有象其它螞蟻一樣總重復(fù)同樣的路,他們會另辟蹊徑,如果令開辟的道路比原來的其他道路更短,那么,漸漸,更多的螞蟻被吸引到這條較短的路上來。最后,經(jīng)過一段時間運行,可能會出現(xiàn)一條最短的路徑被大多數(shù)螞蟻重復(fù)著。原理:為什么小小的螞蟻能夠找到食物?他們具有智能么?設(shè)想,如果我們要為螞蟻設(shè)計一個人工智能的程序,那么這個程序要多么復(fù)雜呢?首先,你要讓螞蟻能夠避開障礙物,就必須根據(jù)適當?shù)牡匦谓o它編進指令讓他們能夠巧妙的避開障礙物,其次,要讓螞蟻找到食物,就需要讓他們遍歷空間上的所有點;再次,如果要讓螞蟻找到最短的路徑,那么需要計算所有可能的路徑并且比較它們的大小,而且更重要的是,你要小心翼翼的編程,因為程序的錯誤也許會讓你前功盡棄。這是多么不可思議的程序!太復(fù)雜了,恐怕沒人能夠完成這樣繁瑣冗余的程序。然而,事實并沒有你想得那么復(fù)雜,上面這個程序每個螞蟻的核心程序編碼不過100多行!為什么這么簡單的程序會讓螞蟻干這樣復(fù)雜的事情?答案是:簡單規(guī)則的涌現(xiàn)。事實上,每只螞蟻并不是像我們想象的需要知道整個世界的信息,他們其實只關(guān)心很小范圍內(nèi)的眼前信息,而且根據(jù)這些局部信息利用幾條簡單的規(guī)則進行決策,這樣,在蟻群這個集體里,復(fù)雜性的行為就會凸現(xiàn)出來。這就是人工生命、復(fù)雜性科學(xué)解釋的規(guī)律!那么,這些簡單規(guī)則是什么呢?下面詳細說明:1、范圍:螞蟻觀察到的范圍是一個方格世界,螞蟻有一個參數(shù)為速度半徑(一般是3),那么它能觀察到的范圍就是3*3個方格世界,并且能移動的距離也在這個范圍之內(nèi)。2、環(huán)境:螞蟻所在的環(huán)境是一個虛擬的世界,其中有障礙物,有別的螞蟻,還有信息素,信息素有兩種,一種是找到食物的螞蟻灑下的食物信息素,一種是找到窩的螞蟻灑下的窩的信息素。每個螞蟻都僅僅能感知它范圍內(nèi)的環(huán)境信息。環(huán)境以一定的速率讓信息素消失。3、覓食規(guī)則:在每只螞蟻能感知的范圍內(nèi)尋找是否有食物,如果有就直接過去。否則看是否有信息素,并且比較在能感知的范圍內(nèi)哪一點的信息素最多,這樣,它就朝信息素多的地方走,并且每只螞蟻多會以小概率犯錯誤,從而并不是往信息素最多的點移動。螞蟻找窩的規(guī)則和上面一樣,只不過它對窩的信息素做出反應(yīng),而對食物信息素沒反應(yīng)。4、移動規(guī)則:每只螞蟻都朝向信息素最多的方向移,并且,當周圍沒有信息素指引的時候,螞蟻會按照自己原來運動的方向慣性的運動下去,并且,在運動的方向有一個隨機的小的擾動。為了防止螞蟻原地轉(zhuǎn)圈,它會記住最近剛走過了哪些點,如果發(fā)現(xiàn)要走的下一點已經(jīng)在最近走過了,它就會盡量避開。5、避障規(guī)則:如果螞蟻要移動的方向有障礙物擋住,它會隨機的選擇另一個方向,并且有信息素指引的話,它會按照覓食的規(guī)則行為。7、播撒信息素規(guī)則:每只螞蟻在剛找到食物或者窩的時候撒發(fā)的信息素最多,并隨著它走遠的距離,播撒的信息素越來越少。根據(jù)這幾條規(guī)則,螞蟻之間并沒有直接的關(guān)系,但是每只螞蟻都和環(huán)境發(fā)生交互,而通過信息素這個紐帶,實際上把各個螞蟻之間關(guān)聯(lián)起來了。比如,當一只螞蟻找到了食物,它并沒有直接告訴其它螞蟻這兒有食物,而是向環(huán)境播撒信息素,當其它的螞蟻經(jīng)過它附近的時候,就會感覺到信息素的存在,進而根據(jù)信息素的指引找到了食物。問題:說了這么多,螞蟻究竟是怎么找到食物的呢?在沒有螞蟻找到食物的時候,環(huán)境沒有有用的信息素,那么螞蟻為什么會相對有效的找到食物呢?這要歸功于螞蟻的移動規(guī)則,尤其是在沒有信息素時候的移動規(guī)則。首先,它要能盡量保持某種慣性,這樣使得螞蟻盡量向前方移動(開始,這個前方是隨機固定的一個方向),而不是原地?zé)o謂的打轉(zhuǎn)或者震動;其次,螞蟻要有一定的隨機性,雖然有了固定的方向,但它也不能像粒子一樣直線運動下去,而是有一個隨機的干擾。這樣就使得螞蟻運動起來具有了一定的目的性,盡量保持原來的方向,但又有新的試探,尤其當碰到障礙物的時候它會立即改變方向,這可以看成一種選擇的過程,也就是環(huán)境的障礙物讓螞蟻的某個方向正確,而其他方向則不對。這就解釋了為什么單個螞蟻在復(fù)雜的諸如迷宮的地圖中仍然能找到隱蔽得很好的食物。當然,在有一只螞蟻找到了食物的時候,其他螞蟻會沿著信息素很快找到食物的。螞蟻如何找到最短路徑的?這一是要歸功于信息素,另外要歸功于環(huán)境,具體說是計算機時鐘。信息素多的地方顯然經(jīng)過這里的螞蟻會多,因而會有更多的螞蟻聚集過來。假設(shè)有兩條路從窩通向食物,開始的時候,走這兩條路的螞蟻數(shù)量同樣多(或者較長的路上螞蟻多,這也無關(guān)緊要)。當螞蟻沿著一條路到達終點以后會馬上返回來,這樣,短的路螞蟻來回一次的時間就短,這也意味著重復(fù)的頻率就快,因而在單位時間里走過的螞蟻數(shù)目就多,灑下的信息素自然也會多,自然會有更多的螞蟻被吸引過來,從而灑下更多的信息素……;而長的路正相反,因此,越來越多地螞蟻聚集到較短的路徑上來,最短的路徑就近似找到了。也許有人會問局部最短路徑和全局最短路的問題,實際上螞蟻逐漸接近全局最短路的,為什么呢?這源于螞蟻會犯錯誤,也就是它會按照一定的概率不往信息素高的地方走而另辟蹊徑,這可以理解為一種創(chuàng)新,這種創(chuàng)新如果能縮短路途,那么根據(jù)剛才敘述的原理,更多的螞蟻會被吸引過來。引申跟著螞蟻的蹤跡,你找到了什么?通過上面的原理敘述和實際操作,我們不難發(fā)現(xiàn)螞蟻之所以具有智能行為,完全歸功于它的簡單行為規(guī)則,而這些規(guī)則綜合起來具有下面兩個方面的特點:1、多樣性2、正反饋多樣性保證了螞蟻在覓食的時候不置走進死胡同而無限循環(huán),正反饋機制則保證了相對優(yōu)良的信息能夠被保存下來。我們可以把多樣性看成是一種創(chuàng)造能力,而正反饋是一種學(xué)習(xí)強化能力。正反饋的力量也可以比喻成權(quán)威的意見,而多樣性是打破權(quán)威體現(xiàn)的創(chuàng)造性,正是這兩點小心翼翼的巧妙結(jié)合才使得智能行為涌現(xiàn)出來了。引申來講,大自然的進化,社會的進步、人類的創(chuàng)新實際上都離不開這兩樣?xùn)|西,多樣性保證了系統(tǒng)的創(chuàng)新能力,正反饋保證了優(yōu)良特性能夠得到強化,兩者要恰到好處的結(jié)合。如果多樣性過剩,也就是系統(tǒng)過于活躍,這相當于螞蟻會過多的隨機運動,它就會陷入混沌狀態(tài);而相反,多樣性不夠,正反饋機制過強,那么系統(tǒng)就好比一潭死水。這在蟻群中來講就表現(xiàn)為,螞蟻的行為過于僵硬,當環(huán)境變化了,螞蟻群仍然不能適當?shù)恼{(diào)整。既然復(fù)雜性、智能行為是根據(jù)底層規(guī)則涌現(xiàn)的,既然底層規(guī)則具有多樣性和正反饋特點,那么也許你會問這些規(guī)則是哪里來的?多樣性和正反饋又是哪里來的?我本人的意見:規(guī)則來源于大自然的進化。而大自然的進化根據(jù)剛才講的也體現(xiàn)為多樣性和正反饋的巧妙結(jié)合。而這樣的巧妙結(jié)合又是為什么呢?為什么在你眼前呈現(xiàn)的世界是如此栩栩如生呢?答案在于環(huán)境造就了這一切,之所以你看到栩栩如生的世界,是因為那些不能夠適應(yīng)環(huán)境的多樣性與正反饋的結(jié)合都已經(jīng)死掉了,被環(huán)境淘汰了!參數(shù)說明:最大信息素:螞蟻在一開始擁有的信息素總量,越大表示程序在較長一段時間能夠存在信息素。信息素消減的速度:隨著時間的流逝,已經(jīng)存在于世界上的信息素會消減,這個數(shù)值越大,那么消減的越快。錯誤概率表示這個螞蟻不往信息素最大的區(qū)域走的概率,越大則表示這個螞蟻越有創(chuàng)新性。速度半徑表示螞蟻一次能走的最大長度,也表示這個螞蟻的感知范圍。記憶能力表示螞蟻能記住多少個剛剛走過點的坐標,這個值避免了螞蟻在本地打轉(zhuǎn),停滯不前。而這個值越大那么整個系統(tǒng)運行速度就慢,越小則螞蟻越容易原地轉(zhuǎn)圈。源代碼如下:/*ant.c*/#defineSPACE0x20#defineESC0x1b#defineANT_CHAR_EMPTY'+'#defineANT_CHAR_FOOD153#defineHOME_CHAR'H'#defineFOOD_CHAR'F'#defineFOOD_CHAR2f#defineFOOD_HOME_COLOR12#defineBLOCK_CHAR177#defineMAX_ANT50#defineINI_SPEED3#defineMAXX80#defineMAXY23#defineMAX_FOOD10000#defineTARGET_FOOD200#defineMAX_SMELL5000#defineSMELL_DROP_RATE0.05#defineANT_ERROR_RATE0.02#defineANT_EYESHOT3#defineSMELL_GONE_SPEED50#defineSMELL_GONE_RATE0.05#defineTRACE_REMEMBER50#defineMAX_BLOCK100#defineNULL0#defineUP1#defineDOWN2#defineLEFT3#defineRIGHT4#defineSMELL_TYPE_FOOD0#defineSMELL_TYPE_HOME1#include"stdio.h"#include"conio.h"#include"dos.h"#include"stdlib.h"#include"dos.h"#include"process.h"#include"ctype.h"#include"math.h"voidWorldInitial(void);voidBlockInitial(void);voidCreatBlock(void);voidSaveBlock(void);voidLoadBlock(void);voidHomeFoodInitial(void);voidAntInitial(void);voidWorldChange(void);voidAntMove(void);voidAntOneStep(void);voidDealKey(charkey);voidClearSmellDisp(void);voidDispSmell(inttype);intAntNextDir(intxxx,intyyy,intddir);intGetMaxSmell(inttype,intxxx,intyyy,intddir);intIsTrace(intxxx,intyyy);intMaxLocation(intnum1,intnum2,intnum3);intCanGo(intxxx,intyyy,intddir);intJudgeCanGo(intxxx,intyyy);intTurnLeft(intddir);intTurnRight(intddir);intTurnBack(intddir);intMainTimer(void);charWaitForKey(intsecnum);voidDispPlayTime(void);intTimeUse(void);voidHideCur(void);voidResetCur(void);/**/structHomeStruct{intxxx,yyy;intamount;intTargetFood;}home;structFoodStruct{intxxx,yyy;intamount;}food;structAntStruct{intxxx,yyy;intdir;intspeed;intSpeedTimer;intfood;intSmellAmount[2];inttracex[TRACE_REMEMBER];inttracey[TRACE_REMEMBER];intTracePtr;intIQ;}ant[MAX_ANT];intAntNow;inttimer10ms;structtimestarttime,endtime;intSmell[2][MAXX+1][MAXY+1];intblock[MAXX+1][MAXY+1];intSmellGoneTimer;intSmellDispFlag;intCanFindFood;intHardtoFindPath;/*-----Main*/voidmain(void){charKeyPress;inttu;clrscr();HideCur();WorldInitial();do{timerlOms=MainTimer();if(timerlOms)AntMove();if(timerlOms)WorldChange();tu=TimeUse();if(tu>=60&&!CanFindFood){gotoxy(1,MAXY+1);printf("Cannotfindfood,maybeablockworld.");WaitForKey(lO);WorldInitial();}if(tu>=180&&home.amount<100&&!HardtoFindPath){gotoxy(1,MAXY+1);printf("God!itissodifficulttofindapath.");if(WaitForKey(10)==0x0d)WorldInitial();else{HardtoFindPath=1;gotoxy(1,MAXY+1);printf("");}}if(home.amount>=home.TargetFood){gettime(&endtime);KeyPress=WaitForKey(60);DispPlayTime();WaitForKey(10);WorldInitial();}elseif(kbhit()){KeyPress=getch();DealKey(KeyPress);}elseKeyPress=NULL;}while(KeyPress!=ESC);gettime(&endtime);DispPlayTime();WaitForKey(10);clrscr();ResetCur();}/*generalsubprocess*/intMainTimer(void)/*output:howmuch10mshavepassfromlasttimecallthisprocess*/{staticintoldhund,oldsec;structtimet;inttimeuse;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;}elsetimeuse=0;return(timeuse);}charWaitForKey(intsecnum)/*funtion:ifhavekeyin,exitimmediately,elsewait'secnum'sencondsthenexitinput:secnum--waitthissenconds,must<3600(1hour)output:keychar,ifnokeyin(exitwhentimeout),returnNULL*/{intsecin,secnow;intminin,minnow;inthourin,hournow;intsecuse;structtimet;gettime(&t);secin=t.ti_sec;minin=t.ti_min;hourin=t.ti_hour;do{if(kbhit())return(getch());gettime(&t);secnow=t.ti_sec;minnow=t.ti_min;hournow=t.ti_hour;if(hournow!=hourin)minnow+=60;if(minnow>minin)secuse=(minnow-1-minin)+(secnow+60-secin);elsesecuse=secnow-secin;/*countingerrorcheck*/if(secuse<0){gotoxy(1,MAXY+1);printf("Timeconutingerror,anykeytoexit...");getch();exit(3);}}while(secuse<=secnum);return(NULL);}voidDispPlayTime(void){intph,pm,ps;ph=endtime.ti_hour-starttime.ti_hour;pm=endtime.ti_min-starttime.ti_min;ps=endtime.ti_sec-starttime.ti_sec;if(ph<0)ph+=24;if(pm<0)(ph--;pm+=60;}if(ps<0)(pm--;ps+=60;}gotoxy(1,MAXY+1);printf("Timeuse:%dhour-%dmin-%dsec",ph,pm,ps);}intTimeUse(void){intph,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(ph<0)ph+=24;if(pm<0){ph--;pm+=60;}if(ps<0){pm--;ps+=60;}return(ps+(60*(pm+60*ph)));}voidHideCur(void){unionREGSregs0;regs0.h.ah=1;regs0.h.ch=0x30;regs0.h.cl=0x31;int86(0x10,®s0,®s0);}voidResetCur(void){unionREGSregs0;regs0.h.ah=1;regs0.h.ch=0x06;regs0.h.cl=0x07;int86(0x10,®s0,®s0);/*mainANTprograme*/voidWorldInitial(void){intk,i,j;randomize();clrscr();HomeFoodInitial();for(AntNow=0;AntNow<MAX_ANT;AntNow++){AntInitial();}/*offorAntNow*/;BlockInitial();for(k=0;k<=1;k++)/*SMELLTYPEFOODandHOME*/for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++)Smell[k][i][j]=0;SmellGoneTimer=0;gettime(&starttime);SmellDispFlag=0;CanFindFood=0;HardtoFindPath=0;}voidBlockInitial(void){inti,j;intbn;for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++)block[i][j]=0;bn=1+MAX_BLOCK/2+random(MAX_BLOCK/2);for(i=0;i<=bn;i++)CreatBlock();}voidCreatBlock(void){intx1,y1,x2,y2;intdx,dy;inti,j;x1=random(MAXX)+1;y1=random(MAXY)+1;dx=random(MAXX/10)+1;dy=random(MAXY/10)+1;x2=x1+dx;y2=y1+dy;if(x2>MAXX)x2=MAXX;if(y2>MAXY)y2=MAXY;if(food.xxx>=x1&&food.xxx<=x2&&food.yyy>=y1&&food.yyy<=y2)return;if(home.xxx>=x1&&home.xxx<=x2&&home.yyy>=y1&&home.yyy<=y2)return;for(i=x1;i<=x2;i++)for(j=y1;j<=y2;j++){block[i][j]=1;gotoxy(i,j);putch(BLOCK_CHAR);}}voidSaveBlock(void){FILE*fp_block;charFileNameBlock[20];inti,j;gotoxy(1,MAXY+1);printf("");gotoxy(1,MAXY+1);printf("Savetofile...”,FileNameBlock);gets(FileNameBlock);if(FileNameBlock[0]==0)strcpy(FileNameBlock,"Ant.ant");elsestrcat(FileNameBlock,”.ant");if((fp_block=fopen(FileNameBlock,"wb"))==NULL){gotoxy(1,MAXY+1);printf("Creatfile%sfail...",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(block[i][j],fp_block);fclose(fp_block);}voidLoadBlock(void){FILE*fp_block;charFileNameBlock[20];inti,j,k;gotoxy(1,MAXY+1);printf("");gotoxy(1,MAXY+1);printf("Loadfile...”,FileNameBlock);gets(FileNameBlock);if(FileNameBlock[0]==0)strcpy(FileNameBlock,"Ant.ant");elsestrcat(FileNameBlock,”.ant");if((fp_block=fopen(FileNameBlock,"rb"))==NULL){gotoxy(1,MAXY+1);printf("Openfile%sfail...",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.amount<TARGET_FOOD)?food.amount:TARGET_FOOD;for(AntNow=0;AntNow<MAX_ANT;AntNow++){AntInitial();}/*offorAntNow*/;for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++){block[i][j]=fgetc(fp_block);if(block[i][j]){gotoxy(i,j);putch(BLOCK_CHAR);}}for(k=0;k<=1;k++)/*SMELLTYPEFOODandHOME*/for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++)Smell[k][i][j]=0;SmellGoneTimer=0;gettime(&starttime);SmellDispFlag=0;CanFindFood=0;HardtoFindPath=0;fclose(fp_block);}voidHomeFoodlnitial(void){intrandnum;inthomeplace;/*1--homeatleft-up,foodatright-down--homeatleft-down,foodatright-up--homeatright-up,foodatleft-down--homeatright-down,foodatleft-up*/randnum=random(100);if(randnum<25)homeplace=1;elseif(randnum>=25&&randnum<50)homeplace=2;elseif(randnum>=50&&randnum<75)homeplace=3;elsehomeplace=4;switch(homeplace){case1: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;case2: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;case3: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;case4: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.amount<TARGET_FOOD)?food.amount:TARGET_FOOD;/*datacorrectnesscheck*/if(home.xxxv=0llhome.xxx>MAXXIIhome.yyy<=0llhome.yyy>MAXYIIfood.xxxv=0IIfood.xxx>MAXXIIfood.yyy<=0IIfood.yyy>MAXYIIfood.amount<=0){gotoxy(1,MAXY+1);printf("Worldinitialfail,anykeytoexit...”);getch();exit(2);gotoxy(home.xxx,home.yyy);putch(HOME_CHAR);gotoxy(food.xxx,food.yyy);putch(FOOD_CHAR);}voidAntInitial(void)/*initialant[AntNow]*/{intrandnum;inti;ant[AntNow].xxx=home.xxx;ant[AntNow].yyy=home.yyy;randnum=random(100);if(randnum<25)ant[AntNow].dir=UP;elseif(randnum>=25&&randnum<50)ant[AntNow].dir=DOWN;elseif(randnum>=50&&randnum<75)ant[AntNow].dir=LEFT;elseant[AntNow].dir=RIGHT;ant[AntNow].speed=2*(random(INI_SPEED/2)+1);ant[AntNow].SpeedTimer=0;ant[AntNow].food=0;ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]=0;ant[AntNow].SmellAmount[SMELL_TYPE_HOME]=MAX_SMELL;ant[AntNow].IQ=1;for(i=0;i<TRACE_REMEMBER;i++){ant[AntNow].tracex[i]=0;ant[AntNow].tracey[i]=0;}ant[AntNow].TracePtr=0;/*asepecailant*/if(AntNow==0)ant[AntNow].speed=INI_SPEED;}voidWorldChange(void){intk,i,j;intsmelldisp;SmellGoneTimer+=timer10ms;if(SmellGoneTimer>=SMELL_GONE_SPEED){SmellGoneTimer=0;for(k=0;k<=1;k++)/*SMELLTYPEFOODandHOME*/for(i=1;i<=MAXX;i++)for(j=1;j<=MAXY;j++){if(Smell[k][i][j]){smelldisp1+((10*Smell[k][i][j])/(MAX_SMELL*SMELL_DROP_RATE));if(smelldisp>=30000llsmelldisp<0)smelldisp=30000;if(SmellDispFlag){gotoxy(i,j);if((i==food.xxx&&j==food.yyy)ll(i==home.xxx&&j==home.yyy))/*don'toverwriteFoodandHome*/;else{if(smelldisp>9)putch('#');elseputch(smelldisp+'0');}}Smell[k][i][j]-=1+(Smell[k][i][j]*SMELL_GONE_RATE);if(Smell[k][i][j]<0)Smell[k][i][j]=0;if(SmellDispFlag){if(Smell[k][i][j]<=2){gotoxy(i,j);putch(SPACE);}}}}/*ofonelocation*/}/*oftimetochangetheworld*/}/*ofworldchange*/voidAntMove(void){intantx,anty;intsmelltodrop,smellnow;for(AntNow=0;AntNow<MAX_ANT;AntNow++){ant[AntNow].SpeedTimer+=timer10ms;if(ant[AntNow].SpeedTimer>=ant[AntNow].speed){ant[AntNow].SpeedTimer=0;gotoxy(ant[AntNow].xxx,ant[AntNow].yyy);putch(SPACE);AntOneStep();gotoxy(ant[AntNow].xxx,ant[AntNow].yyy);/*ant0isasepecailant,usedifferentcolor*/if(AntNow==0)textcolor(0xd);if(ant[AntNow].food)putch(ANT_CHAR_FOOD);elseputch(ANT_CHAR_EMPTY);if(AntNow==0)textcolor(0x7);/*remembertrace*/ant[AntNow].tracex[ant[AntNow].TracePtr]=ant[AntNow].xxx;ant[AntNow].tracey[ant[AntNow].TracePtr]=ant[AntNow].yyy;if(++(ant[AntNow].TracePtr)>=TRACE_REMEMBER)ant[AntNow].TracePtr=0;/*dropsmell*/antx=ant[AntNow].xxx;anty=ant[AntNow].yyy;if(ant[AntNow].food)/*havefood,lookingforhome*/{if(ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]){smellnow=Smell[SMELL_TYPE_FOOD][antx][anty];smelltodrop=ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]*SMELL_DROP_RATE;if(smelltodrop>smellnow)Smell[SMELL_TYPE_FOOD][antx][anty]=smelltodrop;/*elseSmell[...]=smellnow*/ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]-=smelltodrop;if(ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]<0)ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]=0;}/*ofhavesmelltodrop*/}/*ofhavefood*/else/*nofood,lookingforfood*/{if(ant[AntNow].SmellAmount[SMELL_TYPE_HOME]){smellnow=Smell[SMELL_TYPE_HOME][antx][anty];smelltodrop=ant[AntNow].SmellAmount[SMELL_TYPE_HOME]*SMELL_DROP_RATE;if(smelltodrop>smellnow)Smell[SMELL_TYPE_HOME][antx][anty]=smelltodrop;/*elseSmell[...]=smellnow*/ant[AntNow].SmellAmount[SMELL_TYPE_HOME]-=smelltodrop;if(ant[AntNow].SmellAmount[SMELL_TYPE_HOME]<0)ant[AntNow].SmellAmount[SMELL_TYPE_HOME]=0;}/*ofhavesmelltodrop*/}}/*oftimetogo*//*elsenotgo*/}/*offorAntNow*/textcolor(FOOD_HOME_COLOR);gotoxy(home.xxx,home.yyy);putch(HOME_CHAR);gotoxy(food.xxx,food.yyy);if(food.amount>0)putch(FOOD_CHAR);elseputch(FOOD_CHAR2);textcolor(7);gotoxy(1,MAXY+1);printf("Food%d,Home%d”,food.amount,home.amount);}voidAntOneStep(void){intddir,tttx,ttty;inti;ddir=ant[AntNow].dir;tttx=ant[AntNow].xxx;ttty=ant[AntNow].yyy;ddir=AntNextDir(tttx,ttty,ddir);switch(ddir){caseUP:ttty--;break;caseDOWN:ttty++;break;caseLEFT:tttx--;break;caseRIGHT:tttx++;break;default:break;}/*ofswitchdir*/ant[AntNow].dir=ddir;ant[AntNow].xxx=tttx;ant[AntNow].yyy=ttty;if(ant[AntNow].food)/*thisantcarrywithfood,searchforhome*/{if(tttx==home.xxx&&ttty==home.yyy){home.amount++;AntInitial();}if(tttx==food.xxx&&ttty==food.yyy)ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]=MAX_SMELL;}/*ofsearchforhome*/else/*thisantisempty,searchforfood*/{if(tttx==food.xxx&&ttty==food.yyy){if(food.amount>0){ant[AntNow].food=1;food.amount--;ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]=MAX_SMELL;ant[AntNow].SmellAmount[SMELL_TYPE_HOME]=0;ant[AntNow].dir=TurnBack(ant[AntNow].dir);for(i=0;i<TRACE_REMEMBER;i++){ant[AntNow].tracex[i]=0;ant[AntNow].tracey[i]=0;}ant[AntNow].TracePtr=0;CanFindFood=1;}/*ofstillhavefood*/}if(tttx==home.xxx&&ttty==home.yyy)ant[AntNow].SmellAmount[SMELL_TYPE_HOME]=MAX_SMELL;}/*ofsearchforfood*/}voidDealKey(charkey){inti;switch(key){case'p':gettime(&endtime);DispPlayTime();getch();gotoxy(1,MAXY+1);for(i=1;i<=MAXX-1;i++)putch(SPACE);break;case't':if(SmellDispFlag){SmellDispFlag=0;ClearSmellDisp();}elseSmellDispFlag=1;break;case'1':DispSmell(SMELL_TYPE_FOOD);getch();ClearSmellDisp();break;case'2':DispSmell(SMELL_TYPE_HOME);getch();ClearSmellDisp();break;case'3':DispSmell(2);getch();ClearSmellDisp();break;case's':SaveBlock();break;case'l':LoadBlock();break;default:gotoxy(1,MAXY+1);for(i=1;i<=MAXX-1;i++)putch(SPACE);}/*ofswitch*/}voidClearSmellDisp(void){intk,i,j;for(k=0;k<=1;k++)/*SMELLTYPEFOODandHOME*/for(i=1;i<=MAXX;i++)for(j=1;j<=MAXY;j++){if(Smell[k][i][j]){gotoxy(i,j);putch(SPACE);}}/*ofonelocation*/}voidDispSmell(inttype)/*input:0--Onlydisplayfoodsmell--Onlydisplayhomesmell--Displaybothfoodandhomesmell*/{intk,i,j;intfromk,tok;intsmelldisp;switch(type){case0:fromk=0;tok=0;break;case1:fromk=1;tok=1;break;case2:fromk=0;tok=1;break;default:fromk=0;tok=1;break;SmellGoneTimer=0;for(k=fromk;k<=tok;k++)/*SMELLTYPEFOODandHOME*/for(i=1;i<=MAXX;i++)for(j=1;j<=MAXY;j++){if(Smell[k][i][j]){smelldisp1+((10*Smell[k][i][j])/(MAX_SMELL*SMELL_DROP_RATE));if(smelldisp>=30000||smelldisp<0)smelldisp=30000;gotoxy(i,j);if(i!=food.xxx||j!=food.yyy){if((i==food.xxx&&j==food.yyy)||(i==home.xxx&&j==home.yyy))/*don'toverwriteFoodandHome*/;else{if(smelldisp>9)putch('#');elseputch(smelldisp+'0');}}}}/*ofonelocation*/}intAntNextDir(intxxx,intyyy,intddir){intrandnum;inttestdir;intCanGoState;intcangof,cangol,cangor;intmsf,msl,msr,maxms;inttype;CanGoState=CanGo(xxx,yyy,ddir);if(CanGoState==0||CanGoState==2||CanGoState==3||CanGoState==6)cangof=1;elsecangof=0;if(CanGoState==0||CanGoState==1||CanGoState==3||CanGoState==5)cangol=1;elsecangol=0;if(CanGoState==0||CanGoState==1||CanGoState==2||CanGoState==4)cangor=1;elsecangor=0;if(ant[AntNow].food)type=SMELL_TYPE_HOME;elsetype=SMELL_TYPE_FOOD;msf=GetMaxSmell(type,xxx,yyy,ddir);msl=GetMaxSmell(type,xxx,yyy,TurnLeft(ddir));msr=GetMaxSmell(type,xxx,yyy,TurnRight(ddir));maxms=MaxLocation(msf,msl,msr);/*maxms-1-msfisMAX-mslisMAX-msrisMAX0-all3numberis0*/testdir=NULL;switch(maxms){case0:/*allis0,keeptestdir=NULL,randomselectdir*/break;case1:if(cangof)testdir=ddir;elseif(msl>msr)if(cangol)testdir=TurnLeft(ddir);elseif(cangor)testdir=TurnRight(ddir);break;case2:if(cangol)testdir=TurnLeft(ddir);elseif(msf>msr)if(cangof)testdir=ddir;elseif(cangor)testdir=TurnRight(ddir);break;case3:if(cangor)testdir=TurnRight(ddir);elseif(msf>msl)if(cangof)testdir=ddir;elseif(cangol)testdir=TurnLeft(ddir);break;default:break;}/*ofmaxms*/randnum=random(1000);if(randnum<SMELL_DROP_RATE*1000lltestdir==NULL)/*1.iftestdir=NULL,meanscannotfindthemaxsmellorthedirtomaxsmellcannotgothenrandomselectdir2.ifanterror,don'tfollowthesmell,randomselectdir*/{randnum=random(100);switch(CanGoState){case0:if(randnum<90)testdir=ddir;elseif(randnum>=90&&randnum<95)testdir=TurnLeft(ddir);elsetestdir=TurnRight(ddir);break;case1:if(randnum<50)testdir=TurnLeft(ddir);elsetestdir=TurnRight(ddir);break;case2:if(randnum<90)testdir=ddir;elsetestdir=TurnRight(ddir);break;case3:if(randnum<90)testdir=ddir;elsetestdir=TurnLeft(ddir);break;case4:testdir=TurnRight(ddir);break;case5:testdir=TurnLeft(ddir);break;case6:testdir=ddir;break;case7:testdir=TurnBack(ddir);break;default:testdir=TurnBack(ddir);}/*ofcangostate*/}return(testdir);}intGetMaxSmell(inttype,intxxx,intyyy,intddir){inti,j;intms;/*MAXsmell*/ms=0;switch(ddir){caseUP:for(i=xxx-ANT_EYESHOT;i<=xxx+ANT_EYESHOT;i++)
for(j=yyy-ANT_EYESHOT;j<yyy;j++)
if(!JudgeCanGo(i,j))continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)ll(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms=MAX_SMELL;break;}if(IsTrace(i,j))continue;if(Smell[type][i][j]>ms)ms=Smell[type][i][j];}break;caseDOWN:for(i=xxx-ANT_EYESHOT;i<=xxx+ANT_EYESHOT;i++)for(j=yyy+1;j<=yyy+ANT_EYESHOT;j++){if(!JudgeCanGo(i,j))continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)||(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms=MAX_SMELL;break;}if(IsTrace(i,j))continue;if(Smell[type][i][j]>ms)ms=Smell[type][i][j];}break;caseLEFT:for(i=xxx-ANT_EYESHOT;i<xxx;i++)for(j=yyy-ANT_EYESHOT;j<=yyy+ANT_EYESHOT;j++){if(!JudgeCanGo(i,j))continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)||(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms=MAX_SMELL;break;}if(IsTrace(i,j))continue;if(Smell[type][i][j]>ms)ms=Smell[type][i][j];}break;caseRIGHT:for(i=xxx+1;i<=xxx+ANT_EYESHOT;i++)for(j=yyy-ANT_EYESHOT;j<=yyy+ANT_EYESHOT;j++){if(!JudgeCanGo(i,j))continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)ll(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms=MAX_S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)內(nèi)部培訓(xùn)管理系統(tǒng)方案
- 汽車電氣設(shè)備構(gòu)造維修教學(xué)電子教案
- 小學(xué)一年級美術(shù)下冊我們的獎牌滬教版教案
- 幼兒園中班健康教案運磚含反思
- 幼兒園小班語言游戲《小白兔小黑兔》教案
- 無限愛心無悔耕耘縣教育網(wǎng)公開課教案教學(xué)設(shè)計(2025-2026學(xué)年)
- 物業(yè)保潔員入職培訓(xùn)講課教案
- 九年級語文詩經(jīng)蘇教版教案
- 關(guān)于小班六教案
- 減數(shù)分裂說課講解教案
- 科研誠信和倫理管理制度(3篇)
- 肝硬化的康復(fù)護理
- 2025年淮北市交通投資控股集團有限公司及下屬子公司面向社會招聘工作人員4名筆試考試參考試題及答案解析
- 露營旅游營地運營與配套服務(wù)升級方案2026年
- 四川省涼山彝族自治州2024-2025學(xué)年七年級上學(xué)期語文期末試卷(含答案)
- 基礎(chǔ)染料知識培訓(xùn)課件
- 關(guān)節(jié)鏡肘關(guān)節(jié)檢查法
- 生化講座犬貓血液常規(guī)檢驗項目及正常值
- 山茶油知識普及課件
- 心腦血管疾病的預(yù)防及治療課件
- (完整版)新版新概念英語第一冊課文PDF
評論
0/150
提交評論