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

蟻群演算法 C/C++ 實作解析(三):信息素更新與螞蟻單步邏輯

     編輯:關於C++

概覽

本文為系列第三部分,涵蓋世界狀態更新(信息素揮發)、螞蟻單步移動 AntOneStep、按鍵處理 DealKey、信息素顯示 DispSmell/ClearSmellDisp、下一步方向決策 AntNextDir 核心邏輯。

核心模組詳解

1. WorldChange:信息素時空動態

  • 全域計時器 SmellGoneTimer 累積 timer10ms,達 SMELL_GONE_SPEED 觸發一次揮發週期。
  • 雙層信息素(食物/巢穴)獨立揮發:Smell[k][i][j] -= 1 + Smell[k][i][j] * SMELL_GONE_RATE(基礎衰減 + 比例衰減)。
  • 濃度歸零截斷;開啟顯示旗標 SmellDispFlag 時同步更新螢幕字符(數字 0-9、# 代表高濃度)。
  • 不覆蓋食物 F、巢穴 H 字符。

2. AntMove:螞蟻併發移動調度

  • 遍歷 MAX_ANT 隻螞蟻,各自獨立計時器 SpeedTimer 依 speed 決定移動頻率。
  • 移動前清除舊位置字符,呼叫 AntOneStep 計算新位置,繪製新位置(攜帶食物顯示不同字符)。
  • 軌跡記憶:環狀緩衝區 tracex[]/tracey[] 記錄最近 TRACE_REMEMBER 步座標。
  • 信息素釋放邏輯:
// 攜帶食物 → 尋找巢穴,釋放食物信息素
if (ant[AntNow].food) {
    if (SmellAmount[FOOD] > 0) {
        drop = SmellAmount[FOOD] * SMELL_DROP_RATE;
        if (drop > current_cell_smell) update_cell(drop);
        SmellAmount[FOOD] -= drop;
    }
}
// 空身 → 尋找食物,釋放巢穴信息素
else {
    if (SmellAmount[HOME] > 0) { ...同理... }
}
  • 到達巢穴/食物時,對應信息素量重置為 MAX_SMELL(強化源頭濃度)。

3. AntOneStep:單步狀態機

  1. 呼叫 AntNextDir 決定下一步方向。
  2. 根據方向更新座標 (xxx, yyy)。
  3. 攜帶食物狀態:
    • 到達巢穴 → home.amount++、重置螞蟻 AntInitial()。
    • 路過食物點 → 重置食物信息素量 MAX_SMELL。
  4. 空身狀態:
    • 到達食物點且食物量 > 0 → 撿起食物 food=1、food.amount--、食物信息素量 MAX_SMELL、巢穴信息素量歸零、掉頭 TurnBack、清空軌跡記憶、設定 CanFindFood=1。
    • 路過巢穴 → 重置巢穴信息素量 MAX_SMELL。

4. AntNextDir:核心決策演算法

輸入:當前座標 (xxx, yyy)、當前朝向 ddir。輸出:下一步朝向 testdir。

  1. 通行性分析:CanGoState = CanGo(xxx, yyy, ddir) → 解碼出 cangof, cangol, cangor 三布林值。
  2. 信息素類型選擇:攜帶食物 → 尋巢穴信息素 (HOME);空身 → 尋食物信息素 (FOOD)。
  3. 三方向最大信息素:msf, msl, msr = GetMaxSmell(type, xxx, yyy, 當前/左/右方向)。
  4. 最大值方向:maxms = MaxLocation(msf, msl, msr)。
  5. 候選方向選擇(優先跟隨最大信息素,受通行性約束):
    • maxms=0(無信息素)→ testdir=NULL,進入隨機選擇。
    • maxms=1(前方最大)→ 若可通行選前方,否則比較左右較大者。
    • maxms=2(左最大)→ 若可通行選左,否則比較前/右。
    • maxms=3(右最大)→ 若可通行選右,否則比較前/左。
  6. 隨機擾動/錯誤機制:
    • 機率 SMELL_DROP_RATE 或 testdir==NULL 觸發隨機選擇。
    • 根據 CanGoState 以不同權重隨機:
      如 State=0(全通):90% 直行、5% 左、5% 右。
      State=1(前阻):50% 左、50% 右。
      State=7(死胡同):100% 掉頭。

5. 互動與除錯功能

  • DealKey:p 暫停顯示耗時、t 切換信息素顯示、1/2/3 顯示食物/巢穴/雙重信息素、s/l 存檔/讀檔地圖。
  • DispSmell:將信息素濃度映射為字符(0-9、#),支援單一/雙重類型顯示。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved