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

蟻群演算法 C/C++ 實作解析(二):世界初始化與障礙物管理

     編輯:關於C++

概覽

本文為系列第二部分,涵蓋地圖區塊儲存/載入、巢穴與食物隨機配置、螞蟻初始化、世界狀態更新主循環、螞蟻移動調度與信息素釋放邏輯。

核心模組詳解

1. SaveBlock / LoadBlock:地圖持久化

  • 二進制檔案格式:
    home.xxx, home.yyy, food.xxx, food.yyy(各 1 byte)
    緊接 block[MAXX+1][MAXY+1] 逐字節寫入/讀出。
  • 載入後重新初始化:食物量隨機化、螞蟻群重置、信息素陣列歸零、計時器重置。
  • 檔名預設 Ant.ant,使用者可自訂。

2. HomeFoodInitial:巢穴與食物對角隨機配置

四象限對角佈局確保距離最遠:

案例巢穴區域食物區域
1左上 (1..MAXX/3, 1..MAXY/3)右下 (2MAXX/3..MAXX, 2MAXY/3..MAXY)
2左下右上
3右上左下
4右下

食物量 2/3 MAX_FOOD .. MAX_FOOD,目標食物量 min(food.amount, TARGET_FOOD)。座標合法性檢查失敗直接退出程式。

3. AntInitial:螞蟻屬性初始化

  • 起始位置 = 巢穴座標。
  • 初始方向:四方向等概率隨機。
  • 速度:2 * (random(INI_SPEED/2) + 1)(偶數,2, 4, 6...),螞蟻 0 固定 INI_SPEED(特殊螞蟻)。
  • 狀態:food=0(空身)、SmellAmount[FOOD]=0、SmellAmount[HOME]=MAX_SMELL(滿巢穴信息素)、IQ=1、軌跡陣列歸零。

4. WorldChange:信息素揮發(同系列三補充)

參見上一文 WorldChange 詳細邏輯。

5. AntMove:移動調度與信息素釋放

  • 逐隻螞蟻檢查 SpeedTimer,到期執行 AntOneStep。
  • 繪製更新:清除舊位、呼叫 AntOneStep、繪製新位(螞蟻 0 特殊顏色、攜帶食物不同字符)。
  • 軌跡記憶更新(環狀緩衝區)。
  • 信息素釋放核心:
antx = ant[AntNow].xxx; anty = ant[AntNow].yyy;

if (ant[AntNow].food) {  // 攜帶食物 → 釋放食物信息素
    if (SmellAmount[FOOD] > 0) {
        drop = SmellAmount[FOOD] * SMELL_DROP_RATE;
        if (drop > Smell[FOOD][antx][anty]) Smell[FOOD][antx][anty] = drop;
        SmellAmount[FOOD] -= drop; if (SmellAmount[FOOD] < 0) = 0;
    }
} else {  // 空身 → 釋放巢穴信息素
    if (SmellAmount[HOME] > 0) {
        drop = SmellAmount[HOME] * SMELL_DROP_RATE;
        if (drop > Smell[HOME][antx][anty]) Smell[HOME][antx][anty] = drop;
        SmellAmount[HOME] -= drop; if (SmellAmount[HOME] < 0) = 0;
    }
}

關鍵機制:信息素量隨距離遞減(每步釋放當前攜帶量的固定比例),形成濃度梯度引導其他螞蟻。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved