魚の病気の拡散をシミュレーションしたい

※この記事は[note](https://note.com/ryota_nomura/n/n2c06a21113c2)で以前公開した、[UMITRONアドベントカレンダー](https://adventar.org/calendars/6652)18日目の記事の再掲になります。

こんにちは、[UMITRON](https://umitron.com/ja/index.html)の野村です。
[NetLogo](https://ccl.northwestern.edu/netlogo/)というオープンソースのソフトウェアを使って、魚に病気が広がる様子をシミュレーションしてみようと思います。

# はじめに
## 魚の病気は大問題
[農林水産省の統計](https://www.maff.go.jp/j//syouan/suisan/suisan_yobo/taisakusokusin/attach/pdf/kaigisiryou1-3.pdf)によると年間の養殖業の産出額の約3%（100億円程度）が病気によって損なわれている。
これらを予測することには経済的にも食料安全的にも有意義ということもあり研究対象となっている。
![農林水産省の統計](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391115/514c55ac-a231-b7a1-772d-e590f4124a05.png)

病気の広がり方には親から子に伝わる垂直伝播と、同時に飼われている魚同士などから感染する水平伝播がある。今回は生簀の中で起きる水平伝播に着目した。

## シミュレーション方法とツール
シミュレーションはこのような予測を行う手法のうちの一つ。
生簀単位でマクロに予測を行う手法や、魚の個体単位でミクロにシミュレーションを行うなど様々なアプローチがある。

今回は後者（Agent-based simulation）を[NetLogo](https://ccl.northwestern.edu/netlogo/)というツールを使って、[先行研究](https://ieeexplore.ieee.org/document/7576533)を参考にして実装してみる。NetLogoはシミュレーション用のモデルを簡単に作れるソフトウェアで、公開されているモデルもたくさんある。

下の動画は狼が羊を食べ、羊が草を食べるという環境下で、羊と草と狼の数の変化をシミュレーションしたもので、左のwindowにあるようなパラメタを変えるためのインターフェースなども簡単に実装できる。

<iframe width="560" height="500" src="https://www.youtube.com/embed/slWWNAR6F9I" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 魚の病気伝播モデル
大きく魚の回遊モデルと病気の伝播モデルに分けられる。

## 魚の回遊モデル
魚の回遊行動は[Boidモデル](https://www.cs.toronto.edu/~dt/siggraph97-course/cwr87/)で動かすことにした。
Boidとはbird-oid（鳥っぽいもの）を意味する単語で、以下の3つのルールを使って鳥の群れのような行動を記述することができる。

- 分離（Separation）
    - 周りの個体とぶつからないように離れる
- 整列（Alignment）
    - 周りの個体と同じ方向に飛ぶように合わせる
- 結合（Cohesion）
    - 周りの個体の中心方向へ向かうように向きを揃える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391115/5214be50-611f-54b5-bda1-df32bc035b1e.png)

正確にはこれらの3つの動作に対する重みづけや"周り"に含めるための半径などのパラメタが複数あり、これらを調整して目的とする群れの動きに近いものを実現することになる。パラメタを変えると色々な種類の群れを再現でき、[こちらの記事](https://recruit.gmo.jp/engineer/jisedai/blog/simulate_swarm/)などでも紹介されている。

今回は筆者の主観でこのパラメタの調整を行い、生簀の境界で入射角と同じ角度で反射するように条件の設定を行なった。
<iframe width="560" height="500" src="https://www.youtube.com/embed/DhLgNzbqTaI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 感染モデル
感染モデルは[先行研究](https://ieeexplore.ieee.org/document/7576533)に従って実装した。
魚と病原菌の二種類のエージェントが存在する。

魚は以下の3つの状態を遷移する。

1. 通常状態（<font color="Blue">Susceptible</font>）  
一定半径以内に病原菌がある場合に一定の確率で感染する → 感染状態   
2. 感染状態（<font color="Red">Infected</font>）  
一定の確率で病原菌を拡散する  
一定の確率で回復する → 免疫状態  
一定の確率で死ぬ
3. 免疫状態（<font color="Green">Recovered</font>）  
一定期間を過ぎると免疫がなくなる → 通常状態

病原菌は設定された水の流速と角度に従って移動し、一定期間を過ぎると死ぬ。

![スクリーンショット 2021-12-05 16.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391115/b4542670-0554-ad24-2623-9c217659b155.png)

# 結果
## シミュレーション例
青・赤・緑の魚がそれぞれ通常状態・感染状態・免疫状態に対応している。初期値として8:1:1でそれぞれの魚が投入されている。ちなみに魚用のワクチンを打った魚なども初期値は免疫状態として考えられる。

薄紫の点が病原菌を表していて、感染状態の魚から放出される様子や、水の流れにそって流れる様子が見られる。

左のwindowの折れ線グラフがそれぞれの状態の魚の数の遷移を表している。感染状態の山を迎えた後にそれらの魚が治って免疫状態の山が来て、最後は通常状態で落ち着く様子が見られる。今回のパラメタ設定だと最終的に約50%の魚が生き残っていることになる。
<iframe width="560" height="500" src="https://www.youtube.com/embed/mfGhPw_YjHM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 条件を変えて実験
NetLogoには[Behaviour space](http://www.u.tsukuba.ac.jp/~kurahashi.setsuya.gf/NetLogo-ja/behaviorspace.html)という機能があって、パラメタを変えながら網羅的にシミュレーションを回して結果を集計することができる。

**初期状態の魚の尾数**と**病原菌の寿命**が最終的に残っている魚の尾数（%）に与える影響を可視化したのがのグラフ。
各状況で10回シミュレーションした平均を採用しているのでノイズは乗ってしまっているけど傾向は見ることができる。

魚の尾数が増えるほど密になって病気が広がりやすくなり、生き残る割合が減る。
病原菌の寿命が伸びるほど生き残る割合が減ることが読み取れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391115/9d9eabad-6035-3b6e-0e4e-477fd9194c83.png)

# まとめ
今回作ったモデルは極端にシンプルにしてしまっている。

実際にはBoidモデルのみでは表せない動きがたくさんあったり、魚種によって回遊行動が違ったりするし、そもそもモデルに含まれていない水温とか溶存酸素量とかの環境条件によっても魚と病原菌の活動が大きく影響を受けたりするから現実世界で予測をするのは難しかったりする。

が、個体ごとのシミュレーションだからこそ説明できる現象とかが発見できたりする可能性もありそうで面白いなと思った。

# 最後に
[ウミトロン](https://umitron.com/ja/index.html)では一緒に働く仲間を募集しております。持続可能な水産養殖を地球に実装するというミッションの元で、私たちと一緒に水産養殖×テクノロジーに取り組みませんか？

https://umitron.com/ja/career.html


# 参考文献

- [Flocks, Herds, and Schools:
A Distributed Behavioral Model](https://www.cs.toronto.edu/~dt/siggraph97-course/cwr87/)
- [An Agent-Based Model to Simulate Infectious Disease Dynamics in an Aquaculture
Facility](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7576533)
- [魚病をめぐる現状](https://www.maff.go.jp/j//syouan/suisan/suisan_yobo/taisakusokusin/attach/pdf/kaigisiryou1-3.pdf)
- [マダイイリドウイルス病の発生条件と対策](http://nrifs.fra.affrc.go.jp/seika/h08/nrifs96114.html)
- [作って動かすALife](https://www.oreilly.co.jp/books/9784873118475/)
- [NetLogo](https://ccl.northwestern.edu/netlogo/)
- [群れっぽい動きをシミュレーションしてみた](https://recruit.gmo.jp/engineer/jisedai/blog/simulate_swarm/)