趣味としての人工生命づくり 第7回 GPTに人工生命を作ってもらう③
前回は目から脳に位置関係を保ったまま神経が接続する仕組みをChatGPTに書いてもらったプログラムを元に作成してみました。
プログラムの概要としては、網膜の物質の濃度勾配を位置情報として、視神経の軸索が網膜上での位置に応じて固有の変数をもつことで、その変数と脳の位置情報の差が一番少ない場所に移動するというものです。
実際の生物では脳の視蓋におけるエフリンという物質の濃度が位置情報になり、視神経の軸索にあるエフリン受容体の密度の違いによってマッチングが行われるようです。
そもそもこの位置情報を表す濃度勾配はどのように作られるのでしょうか?
その形成については様々な説があります。もともと発生生物学の基礎を築いたウォルパートはモルフォゲンという仮想物質が発生源とシンクの間に自然に拡散していく仕組みを考えていました。
しかし、生物は多様な外的環境の変化に耐えられるように、位置情報も動的に補完することが知られています。
たとえば下の図のように視蓋の半分を切り取ってしまうと、欠損した半分に接続するはずだった軸索が中央部分に密集します。しかしその後残った半分に均等に軸索が接続されます。
本田久夫先生はこのシミュレーションと同様のサーボモデルに加えて軸索同士の競争によって欠損が補完される仕組みを考えています。
https://onlinelibrary.wiley.com/doi/10.1111/j.1440-169x.2004.00759.x#b16
チューリングの反応拡散方程式による形態形成の仮説を実際の生物で発見した近藤滋先生は位置情報の形成についても反応拡散方程式の仕組みが使われているのではないかと提唱しています。
https://www.fbs.osaka-u.ac.jp/labs/skondo/download_files/PNE.pdf
ここでは、欠損を補う仕組みとして反応拡散の仕組みを使ってみたいと思います。
まず反応拡散のシミュレーションをChatGPTに作ってもらいます。
反応拡散方程式をnetlogoのソースで書くにはどうしたら良いですか
globals [dA dB feed kill]
patches-own [A B]
to setup
clear-all
set dA 1.0 ; 拡散速度A
set dB 0.5 ; 拡散速度B
set feed 0.04 ; 補給率 (調整)
set kill 0.06 ; 除去率 (調整)
ask patches [
set A 1
set B 0
if random-float 1 < 0.2 [set B random-float 1] ; ランダムにBを初期化
]
reset-ticks
end
to go
diffuse A dA
diffuse B dB
ask patches [
let reaction A * B * B
set A A + (feed * (1 - A) - reaction) * 0.1
set B B + (reaction - (kill + feed) * B) * 0.1
; 数値の範囲を広げて自然な変化を許容
set A max list 0 A
set B max list 0 B
set pcolor scale-color blue B 0 1
]
tick
end
エラーを伝えて動くものができましたが、パラメーターがうまくいかないようなので、スライダーで変更できるようにします。
インターフェースタブを開いて設定
●setupボタン
●goボタンを設定
●dAスライダーを設定
●dBスライダーを設定
●feedスライダーを設定
●killスライダーを設定
画面(ワールド)の設定
マス目(パッチ)のサイズを小さくしてワールドのサイズを大きくすることで表示スペースを大きくします。
これでインターフェースができたので、コードタブに切り替えて以下のソースを貼り付けます。
patches-own [A B]
to setup
clear-all
ask patches [
set A 1
set B 0
if random-float 1 < 0.2 [set B random-float 1] ; ランダムにBを初期化
]
reset-ticks
end
to go
diffuse A dA
diffuse B dB
ask patches [
let reaction A * B * B
set A A + (feed * (1 - A) - reaction) * 0.1
set B B + (reaction - (kill + feed) * B) * 0.1
; 数値の範囲を広げて自然な変化を許容
set A max list 0 A
set B max list 0 B
set pcolor scale-color blue B 0 1
]
tick
end
パラメーターを色々変化させることで様々な模様を表示させることができます。