首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Lotka-Volterra 捕食者-獵物模型:C# 非遞歸高效實現

     編輯:程式設計綜合問答

模型公式

兔子 (H) 與狐狸 (L) 種群動態:

H[n+1] = H[n] * (1 + a1 - a2 * L[n])
L[n+1] = L[n] * (1 - b1 + b2 * H[n])

參數:a1=0.1, a2=0.01, b1=0.01, b2=0.00002。初始 H[0]=300, L[0]=20。

遞歸陷阱

直接遞歸實現會導致指數級重複計算:getPopH(n) 調用 getPopL(n-1),後者又調用 getPopH(n-2)... 計算第 100 期耗時極長。

非遞歸迭代方案(O(n))

public class LotkaVolterra {
    private const double A1 = 0.1, A2 = 0.01, B1 = 0.01, B2 = 0.00002;
    private const double H0 = 300, L0 = 20;

    public static void Simulate(int periods) {
        double h = H0, l = L0;
        for (int i = 1; i <= periods; i++) {
            double nextH = h * (1 + A1 - A2 * l);
            double nextL = l * (1 - B1 + B2 * h);
            h = nextH;
            l = nextL;
        }
        Console.WriteLine($"Period {periods}: H={h:F2}, L={l:F2}");
    }
}

// 調用
LotkaVolterra.Simulate(200); // 瞬間完成

關鍵優化點

  1. 狀態保存:僅保留上一期值,空間複雜度 O(1)。
  2. 避免重複計算:單次循環同時更新 H 和 L,利用上一期已知值。
  3. 數值穩定性:使用 double 保留小數,長期模擬可考慮 decimal 或對數坐標變換。

擴展應用

  • 輸出完整時間序列供圖表繪製(如 Chart.js、OxyPlot)。
  • 引入環境容納力、隨機擾動等擴展模型。
  • 參數敏感性分析:批量掃描參數空間,繪製分岔圖。

驗證結果

PeriodH (兔子)L (狐狸)
1270.0019.92
2243.2219.83
2047.1517.28
1008.447.89
200903.173.91

結果與題目示例完全一致,證明算法正確。

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