首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

蟻群演算法 C/C++ 實作解析(一):原理、規則與完整源碼架構

     編輯:關於C++

演算法核心思想:簡單規則的涌現智能

螞蟻個體極其簡單(核心邏輯約 100 行),無全域知識,僅依局部感知與簡單規則決策,群體層面卻涌現出:

  • 無先驗知識下高效尋食
  • 自動發現並收斂至最短路徑
  • 動態適應環境變化(障礙物、食物耗盡)

五大行為規則

1. 感知範圍

方格世界,視野半徑 ANT_EYESHOT=3 → 7×7 區域(含自身),移動距離亦限於此範圍。

2. 環境互動

  • 障礙物、其他螞蟻、雙重信息素(食物/巢穴)。
  • 信息素以固定速率 SMELL_GONE_RATE 自然揮發。

3. 尋食/歸巢規則

  • 視野內有目標 → 直線移動。
  • 否則比較視野內信息素濃度,朝最高濃度方向移動。
  • 小概率 ANT_ERROR_RATE 不跟隨最高濃度(探索/創新)。

4. 移動規則

  • 有信息素 → 跟隨梯度。
  • 無信息素 → 慣性延續原方向 + 小隨機擾動。
  • 軌跡記憶 TRACE_REMEMBER=50 步 → 避免原地打轉。

5. 避障與信息素釋放

  • 前方受阻 → 隨機選擇可行方向(若有信息素引導則優先跟隨)。
  • 剛到達食物/巢穴 → 釋放最大濃度信息素;隨遠離釋放量遞減(比例 SMELL_DROP_RATE)。

為何能找到最短路徑?

  1. 短路徑往返週期短 → 單位時間經過螞蟻更多 → 信息素累積更快。
  2. 正回饋:濃度高吸引更多螞蟻 → 釋放更多信息素 → 更高濃度。
  3. 多樣性(錯誤率):螞蟻嘗試新路徑 → 若更短 → 正回饋接管 → 群體遷移至新最短路徑。

參數關鍵影響

參數效果
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

編譯與執行

  • 標準 C(含 conio.h, dos.h),適用 Turbo C / Borland C / VC6.0 控制台專案。
  • 主迴圈以 timer10ms 驅動離散時間步進,kbhit() 處理鍵盤互動。
  • 螢幕輸出使用 gotoxy/putch 直接操作文字模式緩衝區。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved