趣味としての人工生命づくり 第6回 ホタルの同時明滅モデル<制作時間30分程度>
前回、生命現象の中で不思議に思われることをいくつか紹介しました。その中で、今回はホタルの同時明滅の現象を取り上げたいと思います。実際にNetLogoでシミュレーションを作成しながら様々な条件を試してみましょう。
ネットロゴのインストールについては、第1回を御覧ください。
ホタルは種類や生息場所によって発光のリズムをもっています。それぞれの個体が、それぞれのタイミングで発光するのですが、ホタルの種類によっては集団になるとその発光のタイミングが集団で同期して行く現象が知られています。指揮者のようなリーダーがいるわけでも元になるリズムが外にあるわけでもありません。ホタルの視力は0.01程度で近くの光しか捉えられないとおもわれます。
どのようにしてリズムを合わせることができるのでしょうか?
モデルのラフスケッチ
この問題を考えるにあたっていくつか仮説を立ててみたいと思います。
1、リズムは自律的
ホタルは一匹でも一定のリズムで点滅を繰り返すことから、心臓の拍動や呼吸のように一匹ずつ点滅のリズムを持っていると思われます。
2、他のホタルの光によってリズムが変化する
それぞれの蛍が完全に自律的に光るのであれば、群れの点滅のリズムが一致することはありません。ビックリして脈拍が早くなるのと同じように、他のホタルの点滅によってリズムが速くなったり遅くなったりすることが考えられます。
そこからモデルのラフスケッチを考えてみます。
この条件を満たすためには以下のようなプログラムが必要になります。
1、ホタルが飛行するためのプログラム
2,周期的に発光するためのプログラム
3,周囲のホタルの状態を調べて、発光しているホタルがいたら時計変数を増減させる。
●作ってみよう
ではこの仮説に基づいてモデルを作ってみたいと思います。
今回は、3Dで作成してみたいと思います。NetLogoには3Dのバージョンが一緒についているので、そちらを起動してください。
1、ホタルが飛行するためのプログラム
ホタルの飛行を再現するために、鳥の群れをシミュレートする「Boidモデル」を移植したサンプルプログラムを使用します。
ファイルメニューからモデルライブラリーのサンプルプログラムを開きます。
ファイルメニュー→モデルライブラリー→3D→Sample Models →Flocking 3D Alternate
・各ボタンやスライダーの意味は以下のようになっています。
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の設定を変更します。
これで飛行するプログラムができました。(ほとんど何もしていませんが)
setupボタンを押してからgoボタンを押してください。画面をドラッグすることで視点を変えることができます。
パラメーターを変えると飛び方がどう変わるのか色々試してみてください。
2,周期的に発光するためのプログラム
発光の周期を決めるスライダーを作成します。
アイテムの選択ボタンを押してスライダーを選びます。
十字カーソルを配置したい場所に合わせてクリックすると配置できます。
次にプログラムを変更するために「コード」タブに切り替えます。
最初の部分に変数を定義します。
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プロシージャーを以下のように変更します。
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
参考:ホタルの同時明滅についての記事
これまでの記事はこちらをごらんください。