2020年4月11日土曜日

NetLogoに親しむ(Desktop版とWeb版)

【要旨】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

0 件のコメント:

コメントを投稿