臨界遷移

箱の中を生き物が動き回り、湧いてくる餌を食べ、出会うと繁殖する。 餌が十分あっても個体数がある値を下回ると絶滅する。繁殖には相手との出会いが要るからで、 これを生態学ではAllee効果という。 上には資源で決まる安定した個体数があり、下には絶滅がある。その間に不安定な境目がひとつ。

この構造が厄介なのは、死ぬ確率をじわじわ上げていったときに現れる。 個体数はしばらく滑らかに減るだけなのに、ある一点で突然崩壊する。 そして元の水準まで戻しても、個体群は戻ってこない

大きい丸が個体で、色は体力(明るいほど満腹、暗いほど飢えている)。 小さい点が。個体は餌に触れると食べ、体力が尽きると餓死する。

個体数と餌の推移 — 破線が理論から出したAllee閾値 A。 個体数がこれを割ると、餌がいくら余っていても回復しない。 個体数が増えると餌が食い尽くされて減り、餌が減ると個体数も落ちる、という追いかけっこが見える。

個体数
閾値 A
ステップ0
個体数 / 閾値 A
誕生 / 死滅(直近の平均)
死因のうち餓死

N₀ を 20 と 40 で比べてみる。餌の条件はまったく同じなのに、 20 は餌が余ったまま消えていき、40 は 200 匹まで増えて安定する。 初期値だけが結末を分ける。これが安定状態がふたつあるということ。

崩壊と回復のヒステリシス

死亡率 μ(捕獲圧だと思ってよい)をゆっくり上げ、上限まで行ったらゆっくり下げて戻す。 各点で平衡に落ち着かせてから個体数を記録するので、 行きと帰りで同じ線をたどるなら履歴に依存しないということになる。 実際には往路と復路が別の線を描く。崩壊した点まで捕獲圧を戻しても個体群は戻らず、 ずっと低いところまで下げてはじめて回復する。 このずれが臨界遷移(レジームシフト)の指紋で、 大西洋のタラ漁のような、獲りすぎたあと禁漁にしても戻らない現象と同じ形をしている。

未実行

アルゴリズムと実装

資源と消費者の個体ベースモデル。 平均場で書くと ṅ = r·n·(n/A − 1)·(1 − n/K) という、 Allee効果つきロジスティック式に対応する。 この式の3つの平衡点(0、不安定な A、安定な K)が、そのまま箱の中で起きていることになる。

規則

  • 一辺100の正方形。個体は半径 1.3 の円盤で、壁とも個体どうしとも完全弾性で跳ね返る。
  • は静止した点。毎ステップ S·(1 − 餌の数/300) 個の割合で湧く(空きに比例=ロジスティック再生)。
  • 体力は毎ステップ 1 減る。餌に触れると +100(上限250)。0 以下で餓死
  • 繁殖は個体どうしが衝突したとき。双方の体力が 100 以上なら確率 p で子を1個つくり、親が 50 ずつ出す。
  • は毎ステップ確率 μ で訪れる(齢によらない)。捕食者・病気・漁獲などをまとめた項。
  • 移入は毎ステップ確率 i で、外から1個体。

誕生が n²、死滅が n

繁殖には相手との出会いが要るので、誕生の回数は個体数の2乗に比例する(ペアの数)。 一方で死は各個体に独立に訪れるので1乗。ここに非対称があるから、 少数の個体群は餌が余っていても相手が見つからずに消える。 生態学でいう mate-finding Allee 効果で、 この箱ではそれを仮定として置くのではなく、円盤の衝突から出している。

資源が上限をつくる

個体が増えると餌の取り合いになり、体力が繁殖閾値に届かなくなって誕生が鈍り、やがて餓死が始まる。 上限はエネルギー収支で見積もれる。流入は S × 100、 流出は代謝 n × 1 と、死んだ個体が抱えていた体力の捨て分。 既定値(S=4)では流入 340(湧く量は餌が溜まると絞られるので供給いっぱいには届かない)に対し、 個体数 205・代謝 205 で釣り合っていた。

平衡での平均体力を測るとちょうど繁殖閾値の100に貼りつく。 これより豊かなら繁殖が進んで個体が増え、貧しければ餓死で減る。 個体群が自分で自分を「繁殖できるかどうかの境目」に押し込む。

Allee閾値の式

餌が余っている低密度側では、誕生は出会いの回数だけで決まる。2次元剛体円盤の衝突頻度から、

出会い/ステップ = n²·4r·(4v/π) / (2L²)

断面が 4r(衝突直径 2r の2倍)であるところが間違えやすい。 相手は進行方向の左右どちらに 2r ずれていても当たるので、掃く帯の幅は直径の2倍になる。 これを 2r と書くと閾値が2倍ずれる。

誕生 p × これ、死滅 n·μ と置いて釣り合わせると、

A = π·L²·μ / (8·p·r·v)

既定値で A = 23.6。実測(移入を切って初期個体数を変え、各12試行で生存率50%になる点)は 27.2 で、見積りより15%高い。 確率的な系では閾値を少し超えていても初期の偶然で消えることがあるので、 生存率50%の点は決定論的な境目より上に出る。向きも大きさも予想どおり。

μ に比例し、p・r・v に反比例する。 死にやすいほど閾値は上がり、繁殖力・体の大きさ・移動能力が高いほど下がる。 動き回る種ほど少数でも存続できる、という直感どおりの形になっている。

ヒステリシスの測り方

  • 上の枝で3000ステップ助走してから始める。
  • μ を 0.002 から 0.014 まで26点、上げきったら同じ点を逆順に下げる。
  • 各点で500ステップ回し、後半250ステップの平均を個体数として記録する。前半は前の点からの移行に使う。
  • 崩壊点・回復点は上の枝の1/4の高さを最初に横切った場所として読む。 中間(1/2)で読むと、折り返しの手前で上の枝が滑らかに下がっていくぶんを拾ってしまう (実際それで崩壊点を3割手前に読み違えた)。

掃引は平衡が追随できる速さでなければならない。速く振ると、 系がまだ移行し切っていないだけの遅れがヒステリシスに見えてしまう。 往路と復路で同じ滞在時間にしてあるので、 見かけの遅れなら幅は滞在時間を延ばすと縮む。真のヒステリシスは縮まない。

崩壊はなぜ往路だけ緩いのか

復路の回復は1点で跳ね上がるのに、往路の崩壊は数点にまたがってずるずる進む。 これは折り返しの近くで平衡へ戻る速さが遅くなるためで、 押しても戻る力が弱まっていく(不安定な枝が近づいて、両者が消える寸前になっている)。 500ステップの滞在では追随しきれず、崩壊が複数の点に散る。

この現象は臨界減速と呼ばれ、 崩壊が近いことを事前に知る手がかりとして実際に使われている。 個体数そのものを見ていても崩壊は予告なしに来るように見えるが、 擾乱からの回復が鈍っていること自体が警告になる。 隣り合う点の差がいちばん大きい場所を折り返しとみなす読み方だと、 この鈍りのせいで往路の崩壊を検出し損なう。

移入を入れた理由

移入が無いと絶滅は吸収状態になる。いちど0になったら、 捕獲圧をどれだけ下げても二度と戻らないので、往路と復路を比べる意味がなくなる。 毎ステップ確率 i で外から1個体入れると、下の枝が i/μ 程度の小さな正の値になり、折り返し分岐(サドルノード)としてきちんと閉じる。

生態学的にも自然な仮定で、周囲からの流入で細々と維持されている 吸い込み個体群にあたる。

回復点は解析的に出せる。誕生の係数を β = 8prv/(πL²)(つまり A = μ/β)と置くと、 低密度側の釣り合いは i + βn² − μn = 0。 下の枝と不安定な枝はこの2次方程式の2つの解で、判別式が0になったところで両者が衝突して消える

μ_回復 = 2√(β·i)

既定値で 0.0065。実測は3回の掃引で 0.0050/0.0052/0.0063 と、1〜2割低い (同じ3回の崩壊点は 0.0082〜0.0090 で、ループの幅は 1.4〜1.7 倍)。 低密度でも体力が繁殖閾値に届かない個体がいるぶん β が見積りより小さいためで、ずれの向きも合う。 ここを「移入で支えられる数 i/μ が A を上回ったとき」と考えると 0.0033 になって2倍ずれる。折り返しは片方の枝がもう片方に追いつくところではなく、 2つの枝が互いに歩み寄って出会うところである。

死因の内訳が状態を教える

同じ個体数でも、餓死が死因の何割かでどちらの機構で制限されているかが分かる。 上の枝(S=4、n≈205)では餓死が35%を占め、資源制限がはっきり効いている。 下の枝では餓死はほぼ0で、餌は余っていて出会えないだけ。 個体数のグラフだけを見ていると同じ「少ない」でも、 中身が飢餓なのか孤独なのかはまったく違う。

指数寿命にした理由

死を「齢が L に達したら」ではなく「毎ステップ確率 μ」にしてある。 決定論的な寿命にすると、同時に生まれた個体が同時に死ぬコホート振動が乗り、 平衡へ向かう挙動に本来のものでない揺れが混ざる。

さらに、決定論的寿命では最初に置く個体の齢の分布が結果を左右する。 全部を生まれたてにすると最初の1寿命ぶん誰も死なない猶予ができ、 しかもその長さは速さに反比例するので、 本来ないはずの速度依存が生まれる(この落とし穴には実際にはまった)。 指数分布は記憶を持たないので、齢を覚える必要がなく、この問題ごと消える。

衝突の処理

等質量の完全弾性衝突は、中心を結ぶ向きの単位ベクトル n と 相対速度の法線成分 v_n を使って v_i ← v_i + v_n·nv_j ← v_j − v_n·n。 法線成分が入れ替わり、接線成分は変わらない。

処理するのは v_n < 0、つまり近づいているときだけ。 離れつつある重なりを跳ね返すと2つが貼りついて震える。 この条件は「1回の接触を1回だけ数える」役目も兼ねていて、繁殖の抽選が二重に走るのを防ぐ。 離散時間なので食い込みが残る。重なり量を半分ずつ法線方向に押し戻して分離させている。

総当たりを避ける

箱を一辺 2r のセルに切り、個体と餌それぞれに連結リストを張る (head[セル]next[要素] の配列2本)。 個体どうしは自セルと隣接4方向だけを見る(8方向見ると同じペアを2度検査する)。 捕食は個体の周り3×3セルの餌を見る。セルの一辺 2r が捕食距離 r 以上なので取りこぼさない。

食べた餌はその場で配列から抜かず、印だけ付けて最後にまとめて詰める。 走査中に添字が動くと連結リストを張り替える羽目になり、そこがいちばんバグを生みやすい。

すり抜けとサブステップ

1ステップの移動量が直径を超えると相手をすり抜ける。 弾性衝突で速度分布が広がるので、毎ステップ最大速さを調べ、 移動量が 0.35r に収まるようステップを内部で分割している(最大8分割)。

配色について

体力は順序のある量なので単一色相の明度ランプで表す(明るいほど満腹)。 餌は個体と色相で分けて緑にしてある。 色だけに頼らずに済むよう、凡例に体力と色の対応を出し、 個体と餌は大きさでも区別できるようにしている。