publish
This commit is contained in:
parent
01204dfa2f
commit
f5fc9b76ce
73 changed files with 32628 additions and 376 deletions
|
|
@ -1,65 +1,98 @@
|
|||
# 実装記録 — v41
|
||||
# 実装記録 — v45 free movement
|
||||
|
||||
## v45 モジュール整合性修正
|
||||
|
||||
- `engine.js` が要求する `fieldResourceIntakeKgPerDay` は `ecology/feeding.js` に実在する。
|
||||
- v44 は entry module だけに版クエリが付き、依存モジュールが無版指定だったため、ブラウザキャッシュで旧 `feeding.js` と新 `engine.js` が混在し得た。
|
||||
- v45 は production の相対 `.js` import と Worker URL をすべて `?v=45` に統一した。
|
||||
- 回帰テストは 58 行のスモークテストへ縮小し、モジュール契約・自由移動・水域編集・短期出生・削除済み機能の再混入だけを確認する。長期較正や文献式の確認は `VALIDATION.md` に分離する。
|
||||
|
||||
## 目的
|
||||
|
||||
v38 の描画・空間探索・水域/岩編集・Web Worker を維持しつつ、生態学コアを実単位ベースへ置換する。ユーザー指定により水深と人為的攪乱は実装しない。初期水域は厳密面積探索を使わず概ね2倍とし、ユーザー編集水域には倍率を掛けない。
|
||||
v43 で残っていた以下の移動不具合を、スポーン地点への拘束や症状検出型補正を使わずに修正する。
|
||||
|
||||
v41 では追加要求により、実験用 API と詳細診断出力を削除した。
|
||||
- 個体がほとんどスポーン地点から離れない
|
||||
- 微動だにしない個体が多い
|
||||
- 岸線や資源目標付近で往復振動する
|
||||
- home-range を完全に削除する
|
||||
|
||||
## v41 で削除したもの
|
||||
## 1. home-range の完全削除
|
||||
|
||||
- Worker: `set-interactions`
|
||||
- Worker: `set-climate`
|
||||
- Worker: `run-batch`
|
||||
- batch progress/result/error 出力
|
||||
- `benchmark.mjs`
|
||||
- runtime interaction graph 置換機能
|
||||
- `consumptionFlux`
|
||||
- `assimilationFlux`
|
||||
- `respirationLoss`
|
||||
- `trophicFlux`
|
||||
- `populationByGroup`
|
||||
- `biomassByGroup`
|
||||
- `meanBodyMass`
|
||||
- `occupiedArea`
|
||||
- `resourceTurnover`
|
||||
- これらのためだけに存在した production/consumption counters
|
||||
削除した状態/処理:
|
||||
|
||||
`worker.js` の state message は Canvas/UI の描画に必要な内部通信なので残す。`stats()` は `time / temp / population / plant / species / generation` のみ返す。
|
||||
- home point (`homeX`, `homeY`)
|
||||
- home radius
|
||||
- profile別 home-range multiplier
|
||||
- スポーン地点へ戻す steering
|
||||
- home-range を用いた daily movement 計算
|
||||
|
||||
## 生態ロジック
|
||||
動物は現在位置から自由移動 waypoint を生成する。複数 waypoint を経由するため、開始地点を中心とする空間拘束はない。
|
||||
|
||||
## 2. 初期配置
|
||||
|
||||
非両棲個体は、指定された生成中心が不適切でも単に岸線ぎりぎりへ押し出さない。
|
||||
|
||||
`make()` は個体半径を考慮した岸線 clearance を満たす有効 habitat を探索して初期位置を決める。これにより、開始直後から habitat boundary clipping を繰り返す条件を除去した。
|
||||
|
||||
## 3. 岸線での連続 steering
|
||||
|
||||
左右の候補角を交互に試す方式は使用しない。
|
||||
|
||||
岸線近傍では signed-distance field の勾配から legal habitat 側の法線を求め、希望進行方向のうち禁止 habitat へ向かう成分だけを除く。残った接線成分で岸に沿って進む。
|
||||
|
||||
この方式は「振動を検出して止める」のではなく、禁止方向へ向かう速度成分を幾何学的に除去する。
|
||||
|
||||
## 4. persistent free-roaming waypoint
|
||||
|
||||
短いランダム微動ではなく、daily movement capacity から距離を抽選した waypoint を保持する。
|
||||
|
||||
- waypoint は現在位置から生成
|
||||
- habitat を横切る直線経路は候補から除外
|
||||
- 到達すると次 waypoint を生成
|
||||
- 移動不能になった waypoint は破棄して再計画
|
||||
- world edge 到達時も再計画
|
||||
|
||||
開始地点を記憶していないため、徘徊範囲は日ごとに空間上を移動できる。
|
||||
|
||||
## 5. producer / zooplankton 目標の往復除去
|
||||
|
||||
continuous field の資源点は実在する個体ではない。到達後も同じ仮想点を追跡すると、roaming と資源点追跡が切り替わり往復する。
|
||||
|
||||
v45 は feeding envelope に入った時点で仮想 target を破棄し、field density から摂食しながら roaming を続ける。
|
||||
|
||||
## 6. stamina
|
||||
|
||||
旧方式では sprint 消費と回復の単位スケールが釣り合わず、数日規模の休息が発生し得た。
|
||||
|
||||
v45:
|
||||
|
||||
- routine movement: sprint stamina を消費しない
|
||||
- chase / escape: stamina capacity に対する割合で消費
|
||||
- rest: capacity に対する割合で回復
|
||||
- 通常活動中も少量回復
|
||||
|
||||
これにより大きな stamina pool を持つ個体だけ回復に極端に長時間かかることを避ける。
|
||||
|
||||
## 7. 群れ制御
|
||||
|
||||
social steering は位置のみを入力とする。
|
||||
|
||||
- separation
|
||||
- 弱い centroid cohesion
|
||||
|
||||
近隣個体の速度 alignment は使わない。回転指数、角運動量、逆トルク等を production runtime で検出・補正する処理もない。
|
||||
|
||||
## 8. 維持した仕様
|
||||
|
||||
- day / m / kg / kJ
|
||||
- `DT = 1/24 day`
|
||||
- producer: grid biomass field
|
||||
- zooplankton: grid cohort biomass
|
||||
- consumers: individual agents
|
||||
- interaction graph: `ecology/feeding.js` の固定 sparse graph
|
||||
- feeding: Holling denominator + Rall allometric/temperature scaling
|
||||
- predation event: continuous rate → `1-exp(-rate*dt)`
|
||||
- metabolism: `M^0.75` + ectotherm Arrhenius response
|
||||
- reproduction: parent survives birth
|
||||
- mortality: background / starvation / thermal / predation / lifespan
|
||||
- movement: Hirt maximum-speed fit + behaviour-specific speed + daily budget + home range + dispersal
|
||||
- growth: structural mass と reserve energy を分離し、juvenile growth は余剰 energy から支払う
|
||||
- 水深なし
|
||||
- 人為的攪乱なし
|
||||
- experiment/batch API なし
|
||||
- 詳細診断出力なし
|
||||
- user-edited water geometry はそのまま
|
||||
- 初期 procedural water のみ `radius × sqrt(2)`
|
||||
- 厳密2倍化アルゴリズムなし
|
||||
- 通常表示 `×1` target = 1 simulated day / real second
|
||||
|
||||
## v41 監査中の修正
|
||||
|
||||
追加監査で、陸上 producer の light field が既に shade を含むのに growth 側でも shade を掛けていた二重適用を発見し、growth 側では light を一度だけ使うよう修正した。
|
||||
|
||||
v40 では aquatic producer growth に dissolved oxygen multiplier を掛けていたが、元仕様の式は
|
||||
|
||||
`mu = muMax(T) * min(fN, fP) * fLight`
|
||||
|
||||
であり DO は phytoplankton growth の直接因子として指定されていなかった。v41 では DO multiplier を producer growth から削除した。
|
||||
|
||||
また、年齢だけで `biomass()` を決めていた処理を廃止し、`structuralMassKg` を個体状態として保持するよう変更した。成長は reserve floor を超えた energy だけを使用し、成長コストは provenance に較正値として明記した。
|
||||
|
||||
## 水域
|
||||
|
||||
初期 procedural water の半径だけ `sqrt(2)` 倍する。重なりのため union 面積は厳密2倍にはならない。面積を計測して二分探索するコードはない。
|
||||
|
||||
ユーザー編集では `setWater()` が渡された円群を clone してそのまま採用する。既定追加半径は 170 m のまま。
|
||||
|
||||
## 文献値と較正値
|
||||
|
||||
Hirt / Rall / Bissinger 等から直接採用した係数と、simulator calibration を `PARAMETER-PROVENANCE.json` で区別する。routine movement、home range、life history、resource K、zooplankton cohort 係数などは普遍的な実測定数とは主張しない。
|
||||
検査結果は `VALIDATION.md` に記録する。
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue