見出し画像

趣味としての人工生命づくり 第7回 GPTに人工生命を作ってもらう③

前回は目から脳に位置関係を保ったまま神経が接続する仕組みをChatGPTに書いてもらったプログラムを元に作成してみました。

プログラムの概要としては、網膜の物質の濃度勾配を位置情報として、視神経の軸索が網膜上での位置に応じて固有の変数をもつことで、その変数と脳の位置情報の差が一番少ない場所に移動するというものです。

実際の生物では脳の視蓋におけるエフリンという物質の濃度が位置情報になり、視神経の軸索にあるエフリン受容体の密度の違いによってマッチングが行われるようです。

緑のグラデーションが位置情報を表す物質濃度、赤が視神経の持つ位置情報のグラデーション


そもそもこの位置情報を表す濃度勾配はどのように作られるのでしょうか?

その形成については様々な説があります。もともと発生生物学の基礎を築いたウォルパートはモルフォゲンという仮想物質が発生源とシンクの間に自然に拡散していく仕組みを考えていました。

しかし、生物は多様な外的環境の変化に耐えられるように、位置情報も動的に補完することが知られています。

たとえば下の図のように視蓋の半分を切り取ってしまうと、欠損した半分に接続するはずだった軸索が中央部分に密集します。しかしその後残った半分に均等に軸索が接続されます。


https://onlinelibrary.wiley.com/doi/10.1111/j.1440-169x.2004.00759.x#b16より

本田久夫先生はこのシミュレーションと同様のサーボモデルに加えて軸索同士の競争によって欠損が補完される仕組みを考えています。

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のソースで書くにはどうしたら良いですか

反応拡散方程式(Reaction-Diffusion Equation)は、化学反応と拡散のプロセスを数式で表現するもので、パターン形成などに使用されます。NetLogoで反応拡散システムをシミュレートする場合、通常は「グレイ-スコットモデル(Gray-Scott model)」や「Turingパターン(Turing patterns)」などの反応拡散モデルを使います。
以下は、NetLogoでの簡単な反応拡散モデルの実装例です。ここでは、グレイ-スコットモデルを使用して、2つの化学物質(AとB)が反応して新しいパターンを生成するシミュレーションを行います。

ChatGPT出力
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ボタン

ボタンを右クリックしてメニューからeditを選ぶ


●goボタンを設定

ボタンを右クリックしてメニューからeditを選ぶ

●dAスライダーを設定

上記の数値にセット

●dBスライダーを設定

上記の数値にセット

●feedスライダーを設定

上記の数値にセット

●killスライダーを設定

上記の数値にセット

画面(ワールド)の設定

マス目(パッチ)のサイズを小さくしてワールドのサイズを大きくすることで表示スペースを大きくします。

画面上で右クリックしてメニューを出しEditを選択


上の数値で設定

これでインターフェースができたので、コードタブに切り替えて以下のソースを貼り付けます。

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

パラメーターを色々変化させることで様々な模様を表示させることができます。


いいなと思ったら応援しよう!