【要旨】NetLogoによるマルチエージェントモデリングを、ひとつの簡単な例題で説明するチュートリアルです。ただし、NetLogoの基礎知識は前提としています。通常のDesktop版に加えて、Web版のNetLogoについても小生の体験を記します。
■ NetLogo(通常のDesktop版)を使った基本的な例題
まず、基本的な例題をひとつ示します。「朱に交われば赤くなる」といった感じのシミュレーションです。具体的な説明は、下記のNetLogoソースの先頭や、各ステートメントのコメントをご覧下さい。人々の交流で各人の特性(ここではそれを色で表現)が次第に均一化する状況を示しています。特性(色)の平均や標準偏差の推移も表示しています。
初期状態(左上:人の色の度数分布、右側:多様な色の人々)
反復(epoch)93回後の状態(色の度数分布がそれらしい形に)
反復(epoch)267回後の状態(ほとんど全員が同じ色に)
人々の色の標準偏差が非常に小さくなった( 反復267回)後に停止しています。このプログラムの完全なリストを以下に示します。40行程度の小さなプログラムです。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetLogoソースプログラムリスト;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;【他人に染まれ!】 Fujio Yamamoto, 2020-4-9
;; 各タートルは、ふらふら動き回っています。行く先々で、近隣の
;; タートルの色の平均値を少しだけ取り入れ、自分の色を少し変更します。
;; 各タートルの色は、最終的にどんな色になるでしょうか
globals [color-mean color-sd fr] ;; 大域変数
to setup ;; 初期設置
ca ;; エージェントをクリア
random-seed seed ;; 乱数のseed
crt population [ ;; タートルを指定個数生成。各タートルに対して、
set shape "person" ;; タートルの図柄を設定
set label who ;; タートル番号を表示
set label-color black ;; ラベルの色
setxy random-xcor random-ycor ;;ランダムな位置に配置
]
ask patches [set pcolor 119 - random 2] ;; パッチの模様
color-stat ;; タートルの色に関する統計
reset-ticks ;; 時計をリセット
end
to go ;; ボタンを押すたびに実行される
clear-links ;; 結線を消す
color-stat ;; タートルの色に関する統計
ask turtles[ ;; 各タートルに対して以下を実行する
rt random 30 + random -30 ;; 少しふらふらさせる
fd 0.1 ;; その方向へ0.1歩前進する
ifelse N4? ;; 「近隣」の選択
[ set fr turtles-on neighbors] ;; 近隣東西南北4カ所のタートル達
[ set fr turtles-on patches in-cone 3 60];; コーン内のタートル達
if count fr != 0 ;; その個数が0でないならば、
;; それらのタートル達の色の平均値の5%を取り入れて、自分の色を変更する
[ set color 0.95 * color + (0.05 * sum [color] of fr) / (count fr)
create-links-with other fr [set color black] ;;交流関係を示す結線
]
]
tick ;; 時計を進める
if color-sd < 0.2 [ clear-links stop] ;; 色の標準偏差が十分小さくなるまで
end
to go-once
go
end
to color-stat ;; タートルの色に関する統計
set color-mean mean [color] of turtles ;; 色の平均
set color-sd standard-deviation [color] of turtles ;; 色の標準偏差
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
■ 上記プログラムの簡単な説明
人々は少しづつ動き回りますが、その先々で近隣の人々と交流します。その「近隣」の定義は、以下に示すとおり、東西南北か、またはコーン状の範囲で決めるかを選択できます。
ifelse N4? ;; N4?はスイッチの値。frは、近隣の人々の集合(リスト)
[ set fr turtles-on neighbors] ;; 近隣東西南北4カ所のタートル達
[ set fr turtles-on patches in-cone 3 60];; コーン内のタートル達
ここで、"neighbors"は、東西南北のパッチ上にいる人々のセット"fr"の取得のために、また、"in-cone 3 60"は、距離3で前方60度の範囲のパッチ上の人々のセット"fr"を取得のために使います。次に、交流関係を示すため、自分自身とこれらの人々を黒線で結びます。後者のセット"fr"には自分自身が含まれているので、これを除くため、"create-links-with other fr"を使っています。
人々の「交流の効果」は、以下のように、自分の色(color)に反映させています。
set color 0.95 * color + (0.05 * sum [color] of fr) / (count fr)
;; それらのタートル達 fr の色の平均値の5%を取り入れて、自分の色を変更する
色の平均と標準偏差は、それぞれ、"mean"、”standard-deviation”で得られます。そして、各色(色の値は0〜140)の度数分布グラフは、"histogram"で描くことができます。具体的には、以下のとおりです。
set-plot-x-range 0 140 ;;x軸の範囲
set-plot-y-range 0 count turtles ;; y軸の範囲
set-histogram-num-bars 35 ;; ヒスとグラムの棒の数を35とする
histogram [color] of turtles ;; 色のヒストグラムの描画
■ ブラウザで利用できるNetLogo Web(ここにあります)
これまでのNetLogoは、パソコン(Windows, Mac, Linux等)のアプリケーションとして動きますが、例えば、スマートフォンでは使えませんでした。しかし、web版(NetLogo Web)が公開されているので、スマホのブラウザからも使うことができます。早速、上記の例題をNetLogo Webで動かしてみました。その結果は下図のとおりです。
iPad miniのSafari上でのNetLogo Web(上記例題は完全に動作した)
このWeb版はまだ機能不足と言われていますが、上記例題に関しては完全に動作しました。素晴らしい!スマホでは、ボタンやスライダーは非常に小さくなってしまい(拡大はできるものの)使い難いですが、完全に動作します。また、上図右上に(この図ではみえにくいですが)、「
export HTML」というボタンがあります。これを押すと、このプログラム全体を、単一のHTML/JavaScriptファイルとしてダウンロードできます。これを、自分でwebサーバに配置すれば、他のJavaScriptプログラム等から呼び出すことができて、応用が広がりそうです。
■ ファイル入出力の違い(Desktop版とWeb版)
今後NetLogo Webを使って行くにあたり、外部とのやりとりのためのファイル入出力(テキストファイルに限りますが)についても少し調べました。いくつかの理由から、Desktop版とWeb版には以下に述べるような違いがあります。
【Desktop版】テキストファイルの入出力例
file-open "input.txt"
while [not file-at-end?]
[show file-read show file-read show file-read]
file-close
file-open "output.txt"
file-write 3.14 file-write "pi"
file-close
【Web版】テキストファイルの入出力例
●extensionを2つ宣言する。
extensions [fetch send-to]
こう書くと、自動的にextensionsが取り込まれる。最初はプロンプトが出るが。
●ファイル入力
非同期 asyncなので、ファイル入力が終わる前に、次のコマンドへ行ってしまうので注意して使う!
test-fetch-user-file-async
to test-fetch-user-file-async
fetch:user-file-async show
end
file名は、プログラムには書けない!上記のように書くと、file chooserが出現するので、そこで入力ファイルを選択する。「fetch:user-file-async」がファイル入力コマンドである。その後ろの「show」は、コールバック関数として指定したもの。つまり、ファイルが読み込まれた後、「show」の所に、処理すべきコマンドを書けばよい。
●ファイル出力
以下のように書く。ただし、出力ファイル”out.txt”はダウンロードされてしまうようである。
test-send-to-user-file
to test-send-to-user-file
send-to:file "out.txt" "result"
end
Thanks