螞蟻個體極其簡單(核心邏輯約 100 行),無全域知識,僅依局部感知與簡單規則決策,群體層面卻涌現出:
方格世界,視野半徑 ANT_EYESHOT=3 → 7×7 區域(含自身),移動距離亦限於此範圍。
SMELL_GONE_RATE 自然揮發。ANT_ERROR_RATE 不跟隨最高濃度(探索/創新)。TRACE_REMEMBER=50 步 → 避免原地打轉。SMELL_DROP_RATE)。| 參數 | 效果 |
|---|---|
| MAX_SMELL | 信息素持久時間上限 |
| SMELL_GONE_RATE | 揮發速度,越大越快適應變化但越不穩定 |
| ANT_ERROR_RATE | 創新概率,過大陷入混沌,過小陷入局部最優 |
| ANT_EYESHOT | 感知/移動半徑,影響計算量與路徑平滑度 |
| TRACE_REMEMBER | 記憶長度,過大降低效能,過小易打轉 |
/* 常數定義 */
#define MAX_ANT 50, MAXX 80, MAXY 23, MAX_FOOD 10000
#define MAX_SMELL 5000, SMELL_DROP_RATE 0.05
#define ANT_ERROR_RATE 0.02, ANT_EYESHOT 3
#define SMELL_GONE_SPEED 50, SMELL_GONE_RATE 0.05
#define TRACE_REMEMBER 50, MAX_BLOCK 100
/* 方向與信息素類型 */
#define UP 1, DOWN 2, LEFT 3, RIGHT 4
#define SMELL_TYPE_FOOD 0, SMELL_TYPE_HOME 1
/* 資料結構 */
struct HomeStruct { int xxx, yyy, amount, TargetFood; } home;
struct FoodStruct { int xxx, yyy, amount; } food;
struct AntStruct {
int xxx, yyy, dir, speed, SpeedTimer, food;
int SmellAmount[2];
int tracex[TRACE_REMEMBER], tracey[TRACE_REMEMBER];
int TracePtr, IQ;
} ant[MAX_ANT];
/* 全域狀態 */
int AntNow, timer10ms, Smell[2][MAXX+1][MAXY+1];
int block[MAXX+1][MAXY+1], SmellGoneTimer, SmellDispFlag;
int CanFindFood, HardtoFindPath;
/* 主函數與核心流程 */
void main() { WorldInitial(); do { timer10ms=MainTimer(); if(timer10ms) AntMove(); if(timer10ms) WorldChange(); ... } while(KeyPress!=ESC); }
/* 子程序清單 */
WorldInitial, BlockInitial, CreatBlock, SaveBlock, LoadBlock,
HomeFoodInitial, AntInitial, WorldChange, AntMove, AntOneStep,
DealKey, ClearSmellDisp, DispSmell, AntNextDir, GetMaxSmell,
IsTrace, MaxLocation, CanGo, JudgeCanGo, TurnLeft, TurnRight, TurnBack,
MainTimer, WaitForKey, DispPlayTime, TimeUse, HideCur, ResetCur
conio.h, dos.h),適用 Turbo C / Borland C / VC6.0 控制台專案。timer10ms 驅動離散時間步進,kbhit() 處理鍵盤互動。gotoxy/putch 直接操作文字模式緩衝區。