見出し画像

趣味としての人工生命づくり 第6回 ホタルの同時明滅モデル<制作時間30分程度>

前回、生命現象の中で不思議に思われることをいくつか紹介しました。その中で、今回はホタルの同時明滅の現象を取り上げたいと思います。実際にNetLogoでシミュレーションを作成しながら様々な条件を試してみましょう。

ネットロゴのインストールについては、第1回を御覧ください。

ホタルは種類や生息場所によって発光のリズムをもっています。それぞれの個体が、それぞれのタイミングで発光するのですが、ホタルの種類によっては集団になるとその発光のタイミングが集団で同期して行く現象が知られています。指揮者のようなリーダーがいるわけでも元になるリズムが外にあるわけでもありません。ホタルの視力は0.01程度で近くの光しか捉えられないとおもわれます。
どのようにしてリズムを合わせることができるのでしょうか?


モデルのラフスケッチ


この問題を考えるにあたっていくつか仮説を立ててみたいと思います。

1、リズムは自律的
ホタルは一匹でも一定のリズムで点滅を繰り返すことから、心臓の拍動や呼吸のように一匹ずつ点滅のリズムを持っていると思われます。

2、他のホタルの光によってリズムが変化する
それぞれの蛍が完全に自律的に光るのであれば、群れの点滅のリズムが一致することはありません。ビックリして脈拍が早くなるのと同じように、他のホタルの点滅によってリズムが速くなったり遅くなったりすることが考えられます。

そこからモデルのラフスケッチを考えてみます。

ホタルは自由に飛び回って、周期的に発光する。
そのために、それぞれの蛍には時計変数があり、発光すると変数がリセットされる。
スタート時にはランダムに時計変数をセットする。
一定距離内に発光したホタルがいた場合には時計変数が減る(または増える)

この条件を満たすためには以下のようなプログラムが必要になります。

1、ホタルが飛行するためのプログラム
2,周期的に発光するためのプログラム
3,周囲のホタルの状態を調べて、発光しているホタルがいたら時計変数を増減させる。

●作ってみよう


ではこの仮説に基づいてモデルを作ってみたいと思います。

今回は、3Dで作成してみたいと思います。NetLogoには3Dのバージョンが一緒についているので、そちらを起動してください。



3Dがついている方を起動します。

1、ホタルが飛行するためのプログラム

ホタルの飛行を再現するために、鳥の群れをシミュレートする「Boidモデル」を移植したサンプルプログラムを使用します。
ファイルメニューからモデルライブラリーのサンプルプログラムを開きます。

ファイルメニュー→モデルライブラリー→3D→Sample Models →Flocking 3D Alternate


Flocking 3D Alternateを選んで開きます。

Boidはアメリカのクレイグ・ラングトン氏が3Dアニメーションを作成するために考えだしたプログラムです。それまで鳥の群れなどはリーダーの鳥がいて他の鳥を率いていると思われていました。ラングトン氏は鳥の群れを3つの因子で説明してシミュレートしました。

分離(Separation)ぶつからないように距離をとる。
整列(Alignment)同じ方向に飛ぶように速度と方向を合わせる。
結合(Cohesion)群れの中心方向へ向かうように方向を変える
現在も3Dアニメーションでは、このモデルを発展させたプログラムが使われています。

NetLogoではJon Klein氏がこのモデルを移植してFlockingという名称になっています。

各パラメーターを変えることができます

・各ボタンやスライダーの意味は以下のようになっています。

POPULATION     スライダーで鳥の数を選ぶ。
SETUP        鳥を作成する。
GO         ボタンを押してシミュレーションを開始する。
BUILD-CUBES    ランダムに浮き球の障害物をワールド全体に配置。
BUILD-WALL     ランダムに壁を配置。
VISION        鳥が周囲を見渡せる距離を設定。
MAX-VELOCITY    鳥が進むことができる最高速度、
MAX-ACCELERATION 鳥が加速することができる最高速度。
CRUISE-DISTANCE  鳥が快適に感じる近くの鳥との最小距離。

鳥の動きを決める衝動:
CENTER-CONSTANT -  群れの中心に向かって移動する衝動 
VELOCITY-CONSTANT - 群れの仲間の方向と速度を合わせる衝動 
SPACING-CONSTANT -  他の鳥からCRUISE-DISTANCEより近づかないようにする衝動 
AVOIDANCE-CONSTANT - 障害物との衝突を避ける衝動 
WORLD-CENTER-CONSTANT - 世界の端を避ける衝動 
WANDER-CONSTANT - ランダムに移動する衝動

元のモデルでは鳥の数が200までですが、もう少し増やしたいのでpopulationの設定を変更します。

populationのスライダーを右クロックしてEditを選びます。
最大値を200から1000に変えます。

これで飛行するプログラムができました。(ほとんど何もしていませんが)
setupボタンを押してからgoボタンを押してください。画面をドラッグすることで視点を変えることができます。
パラメーターを変えると飛び方がどう変わるのか色々試してみてください。

2,周期的に発光するためのプログラム

発光の周期を決めるスライダーを作成します。
アイテムの選択ボタンを押してスライダーを選びます。

十字カーソルを配置したい場所に合わせてクリックすると配置できます。

cycle-lengthと変数の名前をつけます。

次にプログラムを変更するために「コード」タブに切り替えます。


コードをクリックして切り替えます。

最初の部分に変数を定義します。
3行目以降の鳥の変数を定義する部分の最後にclockを追加します。

birds-own [
  flockmates         ;; agentset of nearby turtles
  nearest-neighbor   ;; closest one of our flockmates
  velocity           ;; vector with x y and z components it is determined by the previous velocity
                     ;; and the current acceleration at each step
  acceleration       ;; vector with x y and z components, determined by the six urges
  clock ;;これを追加
]

次に、セットアップする時に「clock」変数にランダムな数値を入れます。


to setup
clear-all
setxyz 0 -30 0
create-birds population
[
place-bird
set size 0.75
set velocity [ 0 0 0 ]
set acceleration [ 0 0 0 ]
set color yellow + 2 - random-float 6
set flockmates no-turtles
set clock random cycle-length ;;これを追加
]

”set clock random cycle-length”
は0からcycle-lengthの値までの間のランダムな整数をclockに設定するという意味です。

次に点滅するためのプログラムを作ります。
コードの一番最後に以下を追加してください。

to flash ;;flashプロシージャー(手順)を定義する
set clock clock + 1  ;;クロック変数を一つ増やす
if clock < cycle-length ;;clock変数がcycle-lengthよりも少ない時[ ]内を実行
[set color gray + random-floaat 6]  ;;色をグレーのグラデーションにする
  if clock = cycle-length ;;clock変数がcycle-lengthと同じ時[ ]内を実行
[
set color yellow ;; 色を黄色にする。
set clock 0 ;;clock変数を0にする。
]
end

このflashプロシージャが実行されるように「flash」の文字を鳥の飛行プログラムに追加します。
鳥の飛行についてのプログラムは中程にあるto flockにかかれています。

to flock  ;; bird procedure
  ;; look for birds in my vicinity
  find-flockmates
   
〜略〜

let nxcor xcor + ( item 0 velocity )
let nycor ycor + ( item 1 velocity )
let nzcor zcor + ( item 2 velocity )
facexyz nxcor nycor nzcor
fd 0.1 * magnitude velocity
flash ;;これを追加
end

上から順番に一行ずつ実行されていってflashの行にくると先程のflashプロシージャが実行されます。

これで点滅するプログラムができました。
「インターフェース」タブをクリックしてsetup、goを順番に押してプログラムを動かしてみます。

それぞれのホタルが黄色に点滅するようになったと思います。cycle-lengthスライダーを動かすと点滅の周期を変えることができます。

3,周囲のホタルの状態を調べて、発光しているホタルがいたら時計変数を増減させる。

cycle-lengthスライダーの下にflash-lengthとeyesightスライダーを追加します。最大値と値は画像を参考に設定します。

先程と同じようにスライダーを追加します。
光る長さを設定するflash-lengthスライダー
視力変数eyesightのスライダーを作成

「コード」タブに切り替えて先程のflashプロシージャーを以下のように変更します。

to flash ;;flashプロシージャー(手順)を定義する
set clock clock + 1   ;;クロック変数を一つ増やす
if clock < cycle-length ;;clock変数がcycle-lengthよりも少ない時[ ]内を実行
[
set color gray + random-float 6 ;;色をグレーのグラデーションにする
if count other birds in-radius eyesight with [color = yellow] > 1 
  ;;eyesightの範囲に色が黄色のホタルが1匹以上いる時[ ]内を実行する。

[set clock clock - 1] ;;clock変数を−1減らす。
]
  if clock = cycle-length
[
  repeat flash-length ;;flash-lengthの回数だけ[]内を繰り返す。
    [set color yellow]
set clock 0 ;;clock変数を0にする。
]
end

普通のプログラミング言語では、周囲のホタルの状態を調べるためには色々と考えなくてはいけないことが多いのですがNetLogoでは直感的に定義することができます。
周りのホタルを調べて、光っているホタルがいたら自分のclock変数を一つ戻すという手順が以下のようにわずか2行で記述することができました。

if count other birds in-radius eyesight with [color = yellow] > 1   
;;eyesightの範囲に色が黄色のホタルが1匹以上いる時[ ]内を実行する。
[set clock clock - 1] ;;clock変数を−1減らす。

次に光っているのホタルの数をグラフにするようにしてみます。
プロットのアイテムを選択して画面の右下に設置します。

プロットを選択

プロット名:glowing
色:黄色
ペン更新コマンド:plot count turtles with [color = Yellow] 

と設定します。

光っているホタルの数

setupしてgoボタンを押すとグラフが自動で描かれます。

しかし、これで点滅の同期ができるか動かしてみるとなかなか同期しません。

生物の刺激に対する反応には不応期というものがあることが多くあります。不応期とは刺激の直後や活動中には次の刺激に反応しないというものです。

そこで自分が発光したあとに刺激に反応しない期間を作ってみることにします。

intervalスライダーを作成してください。
最大値:10
値:3

コードのflashプロシージャの3行目

if clock < cycle-length

if clock + interval < cycle-length 

に変更します。

これで動かしてみます。

ちゃんと同期しています。

いろいろと条件を変えて、よりホタルに近いものを作ってみてください。パラメーターを変化させると、光の波が移動するようなパターンも作ることができます。

最後に

このモデルは、観察や実験によって現実のホタルの反応から導いたものではなく、同じような現象を再現する一つの仮説として作成したものです。20年ぐらい前にこの現象を知って、思いつきで同様のモデルをNetLogoで作ったことがあります。事前の研究なども知らずに作ったのですが、意外と簡単に同期したので驚いた覚えがあります。

数学的な知識もなく、素人がこのようなモデルをつくる事ができるのがNetLogoの魅力です。ホタルの同時明滅は50年ほど前から同様な仮説が考えられていたようですが、専門家の研究と同様のモデルを素人が思いつきで作れるというのがすごいことです。

まだわかっていないような問題についても、NetLogoを使ってあなたが発見できるチャンスがあるかもしれません。

よりリアルなモデルを作成するには、以下のような論文を参考にしてみてください。

日本応用数理学会論文誌 Vol. 29, No. 3, 2019, pp. 250~293
実験事実に忠実なホタルの集団同期明滅モデルと その進行波形成条件の解析
中川 正基 ∗ 田中 久陽 ∗ ∗ 電気通信大学大学院情報理工学研究科

https://www.jstage.jst.go.jp/article/jsiamt/29/3/29_250/_pdf


参考:ホタルの同時明滅についての記事

これまでの記事はこちらをごらんください。


この記事が参加している募集

つくってみた

この記事が気に入ったらサポートをしてみませんか?