マルチエージェントのための行動科学：実験経済学からのアプローチ〜付録資料〜
西野成昭 花木伸行

2021 年 3 月

目

次

A

z-Tree チュートリアル

A.1

z-Tree と は . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

A.2

z-Tree のインストールと経済実験を行うための PC 環境 . . . . . . . . . . . . . . . . . . . . . .

2

A.3

動かしてみる . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

A.3.1

必要な人数と PC を準備して実施 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

A.3.2

1 台の PC 内で事前に動作チェックする方法 . . . . . . . . . . . . . . . . . . . . . . . . .

3z-Tree の仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

A.4.1

画 面 の 見 方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

A.4.2

クライアント (z-Leaf) 上で画面の推移 . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

A.4.3

実験中のサーバー (z-Tree) による参加者の管理 . . . . . . . . . . . . . . . . . . . . . . .

6

Stage

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

A.5.1

Stage の 進 行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

A.5.2

Stage に Box を配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

A.5.3

Box に Item と Button を追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

A.5.4

Program による計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

A.5.5

Program で使える構文など . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

A.5.6

Stage へ参加するかどうかの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14z-Tree における Table の概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

A.6.1

Subjects Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

A.6.2

Table

数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

A.6.3

その他の Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

A.6.4

異なる Table から Table 関数を用いる場合 . . . . . . . . . . . . . . . . . . . . . . . . .

19

付録

A.4

A.5

A.6

関

様々なタイプの Box. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

A.7.1

Standard box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

A.7.2

Grid box. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

A.7.3

Container box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

A.7.4

History box. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

A.7.5

Box の配置位置の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

A.8

Contract Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

A.9

参加者の画面表示に関する Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

A.7

目次

iii
A.9.1

Item の Layout 設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

A.9.2

Item の Label 部分で変数を表示する . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

実行時に指定するオプション：コマンドラインオプション. . . . . . . . . . . . . . . . . . . . .

25

A.10.1 設 定 の 仕 方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

A.10.2 コマンドラインオプション一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

そ他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

A.11.1 日本語設定で作成するために . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

A.11.2 Parameter Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

A.11.3 チャット機能やグラフィック表示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

A.12

マニュアル等の有用な情報源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

BNetLogo チュートリアル

B.1

NetLogo とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

B.2

NetLogo の基本構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

B.2.1

インターフェース画面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

B.2.2

情 報

面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

B.2.3

コード作成画面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

NetLogo におけるシミュレーションの仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

B.3.1

シミュレーションの実行の仕方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

B.3.2

NetLogo 世界の構成要素: turtle, patch, link, observer . . . . . . . . . . . . . . . . . .

33

B.3.3

描 画

34

A.10

A.11

付録

B.3

B.4

B.5

B.6

の

画

画

面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

変数の定義や代入など
変. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

B.4.1

global数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

B.4.2

ローカル変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

B.4.3

エージェント変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

B.4.4

変 数 の 代 入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

B.4.5

四則演算、and/or 等のオペレータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

B.4.6

リ

ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

ask 文とエージェントへの命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

B.5.1

ask 文の仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

B.5.2

observer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

B.5.3

エージェント集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

B.5.4

具体的なサンプル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

B.5.5

エージェントが持つ変数一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

基本的な構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

ス

B.6.1

if/ifelse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

B.6.2

while

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

目次

iv

B.7

B.6.3

repeat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

B.6.4

foreach. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

B.6.5

loop

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43procedure の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

B.7.1

to〜end. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

B.7.2

to-report〜end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

B.7.3

引数をとる procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

その他の要素、よく使う命令など. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

B.8.1

create-turtles, hatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

B.8.2

random. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

B.8.3

周辺の patch を取得する命令など . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

B.8.4

any?

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

B.8.5

with, of. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

B.8.6

max-one-of, min-one-of, one-of, other などの命令 . . . . . . . . . . . . . . . . . . . . .

46

B.8.7

stop

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

B.9

インタフェース画面での変数の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

B.10

グラフの描画 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

B.11

コマンドセンター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

B.12

そ

他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

B.12.1 turtle の 形 状 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

B.12.2 演算子の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

B.12.3 コメントアウト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

B.12.4 色定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

B.12.5 ビ ュ ー の 更 新 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

マニュアル等の有用な情報源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

B.8

B.13

の

の

設

1

付録

A z-Tree チュートリアル

本付録では、z-Tree のプログラミングについて概説する。なお、プログラムの仕方など、細かいことは後回しで、ともかく実験を実施したいという人は、A.3 節まで読めば、実験自体は行うことができるだろう。

A.1

z-Tree と は

z-Tree (Zurich Toolbox for Readymade Economic Experiments) は、経済実験をコンピュータ上で実施するためのソフトウェアであり、実験経済学者の Fischbacher を中心に作成された。プログラミング知識の少ない人でも簡単に実験のプログラムと実施環境を構築できるのが特徴で、様々なタイプの実験を、視覚的に分かりやすい GUI で操作しながら、僅かなプログラム言語の記述を加えるだけで完成することができる。もちろん、細かなプログラムなどを実装すれば、もっと複雑なものも実現できる。利用するにはチューリッヒ大へ登スライド A.1

実験を行うための PC 環境構築

付録 A

2

z-Tree チュートリアル

録申請が必要であるが、フリーで配布されており、誰でも利用することが出来る*1 。

A.2

z-Tree のインストールと経済実験を行うための PC 環境

z-Tree は Windows 環境でのみ動作し、特に高いスペックの PC ではなくても充分快適に動く。ただし、参加者間の通信が必要なため、ネットワークに繋がった環境が必須である。ただし、外部へのインターネット接続は必要とせず、プライベート LAN 等のローカルなネットワーク内でも動作する。

z-Tree.exe と z-Leaf.exe の 2 つのファイルからなり、サーバー・クライアント方式で動作する。z-Tree.exe
がサーバーで z-Leaf.exe がクライアント側のプログラムである。実験者は z-Tree 上で実行したい実験内容をプログラミングし、完成したら z-Leaf を各参加者の PC で実行し、z-Tree にネットワークを介して接続する。

z-Tree 上で参加者の情報を管理し、実験開始などの操作を行う。
それでは、実際にインストールしてみよう。スライド A.1 に示しているように、サーバー PC は 1 台、クライアント PC は実験に参加する人数分だけ用意する。サーバー PC に zTree.exe をコピーし、各クライアント

PC に z-Leaf.exe をコピーし、各 PC はネットワークに繋がった状態にする。
各クライアント PC では、スライド A.2 に示すように、z-Leaf のショートカットを作成し、そのプロパ

スライド A.2

z-Leaf のプロパティ画面*1 利用に関しては、チューリッヒ大のウェブサイトを参照されたい。https://www.ztree.uzh.ch/A.3 動かしてみる
ティを開き、リンク先と書かれた部分の最後に、「/name xxx /language jp /server xx.xx.xx.xx /fontface”ＭＳ Ｐゴシック” /buttonfontface ”ＭＳ Ｐゴシック” /fontsize 16」と入力しておこう。なお、/name のxxx には参加者を識別するための名前であり、それぞれのクライアント毎に異なる名前を付ける。/server のxx.xx.xx.xx には、サーバー PC の IP アドレスを入力する*2 。これらのオプションの詳細については、A.10
節で説明する。z-Leaf の実行時は、z-Leaf.exe 自体ではなく、この設定を行ったショートカットでプログラムを起動させる。

A.3

動かしてみるPC 環境のセットアップが終了すれば、実際に実験できるかどうか動かしてみよう。z-Tree の動作のさせ方
は 2 つある。1 つは、前節で説明した通り、実際の実験環境そのもので、その方法について A.3.1 節で説明する。もう 1 つは、準備のために 1 台の PC 内で仮想的に参加者の人数分だけ z-Leaf を立ち上げ、正しく動作するか確認するための、言わば準備モードである。このやり方は、A.3.2 節で説明する。

A.3.1 必要な人数と PC を準備して実施
まずは、本書の 6 章で扱った「美人投票ゲーム」を動かしてみよう。ファイルは Chap6-exp1-beauty-

contest.ztt を使おう*3 。
z-Tree を起動し、Chap6-exp1-beauty-contest.ztt のファイルを開けば、スライド A.3 の左図のような画面になっているはずである。そこで、「Background」と書かれたアイコンをダブルクリックすれば、スライド右側のようなウィンドウが表示される。最上部の参加者人数の欄で、参加者数に合わせてセットしよう。
次に、参加する人数分だけクライアント PC 上で、先ほど作成した z-Leaf のショートカットから z-Leaf を起動する。そうすれば、開始までの準備が全て整った。なお、クライアント PC からサーバー PC へ接続でトラブルがあった場合には、クライアント PC でエラーメッセージが出る。サーバーの IP アドレスなど、正しく設定できているか確認しよう。
ここまでできれば、あとは z-Tree のメニューの「Run」の「Start Treatment」を押すだけである。そうす
れば、クライアント PC の画面が自動的に変わり、実験が開始される。あとは、実験が終了するまで、z-Tree
側では特に何も操作をする必要はない。なお、Chap6-exp1-beauty-contest.ztt は参加者が 1 回だけ意思決定を行う（数値を入力する）だけであるので、全員が意思決定が終われば、自動的に結果が参加者に表示される。
どのような実験であっても、基本的に、以上のような手順で実験を実施する。

A.3.2 1 台の PC 内で事前に動作チェックする方法
自分自身で z-Tree のプログラムを作成する場合、実際の実験を行う前に、チェックは必要不可欠である。その場合に、必要な数だけクライアント PC を立ち上げ、動作するかどうかを 1 人で確認するのは、非常に骨の折れる無駄な作業である。そのため、プログラム作成時点で容易に動作チェックできるように、1 台の PC 内
*2 通常は Windows のファイル共有を用いるのが標準的であり、z-Tree のサイトにあるマニュアルにもそのような指示がある。その場合には、z-Tree.exe と z-Leaf.exe を同じフォルダに置き、そのフォルダを参加者からファイル共有で見えるようにする。そうすることで、IP アドレスの設定などが不要となり自動的に z-Tree に接続することができ、インストール作業も簡単になる。ただし、OS が Windows Server でなければ、ファイル共有ができる人数が制限されたりするので、IP アドレスを設定した方が良い
場合が多い。
*3 コロナ社の本書の Web サイトからダウンロード可能である。

3

付録 A

4

スライド A.3

z-Tree チュートリアル

実験の開始方法

で z-Leaf を動かす方法が用意されている。

1 台の PC の中で、参加者の人数分 z-Leaf を動かすことは非常に簡単で、z-Tree がインストールされた PC
で、z-Leaf のショートカットを人数分作成し、前節で説明したのと同様に、プロパティで /name のところをそれぞれ別の名前に設定するだけで良い。そして、そのショートカットをそれぞれ起動すれば、人数分の z-Leafが起動し、z-Tree につながった状態になる。あとの手順は全く同じで、z-Tree のメニューの「Run」の「Start

Treatment」を押せば実験がスタートする。
なお、たくさんのショートカットを作るのは面倒なので、この作業はバッチファイルを作って一気に必要な数だけ z-Leaf を立ち上げると良いだろう。それを行うためには、テキストエディタ等で以下のような内容のファイルを作成し、拡張子を.bat として保存しよう。なお、下記の start zleaf.bat のバッチファイルは、4 人
分の z-Leaf を立ち上げる場合の例である。/name のあとの名前の部分を異なるものにしておけば、自動的に別の z-Leaf としてみなしてくれる。
このような手順で、1 台の PC 内で動作チェックを行うと良いだろう。

start zleaf.bat の内容:
start zleaf.exe /language jp /name subject1
start zleaf.exe /language jp /name subject2
start zleaf.exe /language jp /name subject3
start zleaf.exe /language jp /name subject4

A.4 z-Tree の仕組み

A.4

5z-Tree の仕組み

本節では、z-Tree の基本的な仕組みについて、先ほどの美人投票ゲーム（Chap6-exp1-beauty-contest.ztt）を使って説明する。

A.4.1 画 面 の 見 方
具体的なサンプルを使って、z-Tree の構造を見てみよう。Chap6-exp1-beauty-contest.ztt のファイルを開くと、スライド A.4 に示すような画面が表示されるだろう。一番上に、Background と書かれた木のアイコンがあり、それに様々なアイコンが木構造となってぶら下がっている。Background で参加人数や繰り返し回数などの全体の設定を行うことができる。さらに、それに緑色の Stage と呼ばれるアイコンが、下の方に 2 つ連なっているの見えるだろう。この Stage が参加者が実際に意思決定を行う画面に対応しており、各 Stage で意
思決定に必要な情報や選択肢などを追加していく。このように、z-Tree では Stage を繋げて、実験用のプログ
ラムを作成する。
このプログラムでは、Input と Result という 2 つの Stage から成っている。美人投票ゲームなので、（本書の設定では）0〜100 までの任意の数値を入力するという意思決定であり、それが Input の stage で記述されている。また、参加者全員の入力が終われば、その数値を集約し、ターゲットとなる値が計算され、誰が勝者となったかを表示する画面が Result の Stage である。この実験では、1 ショットのゲームなので、ここで実スライド A.4

z-Tree の構造

付録 A

6

スライド A.5

z-Tree チュートリアル

参加者の画面

験は終了する。Background で繰り返し数（Paying periods）を設定すれば、再び Input の Stage に戻り、同じプロセスが設定された回数だけ繰り返される。

A.4.2 クライアント (z-Leaf ) 上で画面の推移
スライド A.5 に参加者のクライアント PC に表示される画面の推移を表している。まず、参加者が z-Leaf
を起動すると左上の初期画面が表示される。z-Tree 上で実験開始の操作がされると、右上の意思決定画面に移り、数値の入力が求められる画面に切り替わる。z-Tree は基本的に同期を取りながら進むため*4 、自身の意思決定が済んでいても、他の参加者が意思決定がまだ行われていない場合は、右下の待ち画面が表示される。全員が意思決定が終了した後、左下の結果表示画面が表示される。

A.4.3 実験中のサーバー (z-Tree) による参加者の管理
スライド A.6 にサーバー PC の画面 (実行中の z-Tree の画面) が示されている。すべの処理は z-Tree のソ
フトウェア上で行われる。Stage で表されているメインウィンドウに加えて、メニューから Client Table やSubjects Table を選択すれば、スライドのように各ウィンドウが表示される。これらのテーブルによって、リアルタイムで参加者の現在の状況や行動結果などを参照することができる。

*4 設定により、待たずに次の Stage へ行けるようにすることも出来る。

A.4 z-Tree の仕組み

7

スライド A.6

サーバー PC (z-Tree) の画面

Clients’ Table
スライド A.6 に Clients’ Table が 1 つのウィンドウとして表示されているのが分かる。Client Table は接続している全ての参加者の状態を確認できるテーブルであり、実験開始する前には、まずこのテーブルで必要な人数だけ参加者が正しく接続されているかを確認する。テーブル自体は 3 列の表であり、左から参加者の名
前*5 、真ん中が現在の Stage、右が Stage での残り時間を表している。ただし、この美人投票ゲームでは、時間設定をしていないので、この欄に数値が示されていない。このテーブルを参照することで、各参加者が今どの Stage の意思決定を行っているのか、その経過時間なども確認できる。

Subjects Table
スライド A.6 には、同様に Subjects Table も 1 つのウィンドウとして表示されている。これは、各参加者の実際の行動結果が示されている。テーブルの概念の詳細については後述するが、Subjects Table 内に定義された全ての変数の値をリアルタイムで確認することができる。このサンプルプログラムの場合では、左からPeriod、Subject、Group、Proﬁt、TotalProﬁt、Participate、・・・・と変数が並んでおり、一行が一人の参加者が持っている Subjects Table のデータ（1 つのレコード）に相当する。なお、Period から Participate ま*5 クライアント PC で設定した/name の項目の名称がここに表示される。もし/name を設定していない場合にはクライアント PCの IP アドレスが表示される。

付録 A

8

z-Tree チュートリアル

での変数は、z-Tree 内で予め定義されており、実験の実施する上ですべて重要な変数である。

グループ分けこのサンプルプログラムでは、Clients’ Table からも分かるように、全部で 5 人が参加している。5 人全員で1 つのグループで実験を行っているため、Group の変数には全て 1 が入っている。グループ毎に別れて実験することも可能である。グループの割り当てについても、z-Tree は簡単に行うことができる。具体的には、メニューの Treatment → Matching から適切な項目を選択するだけで良い。選択できる項目と具体的なマッチ
ング方法は以下の通りである。

• Partner: Subject 1 と 2 が Group 1、Subject 3 と 4 が Group 2 という要領で、Background で設定した人数とグループ数に基づき順番に設定され、さらに、それが Period 間で同じ固定したグループとなる。

• As First Selected Period: ピリオド 1 のグループで以降のピリオドも設定される。
• Stranger: ピリオド毎にランダムにグループが割り当てられる。
• Absolute Stranger: 一度同じグループになった相手とは同じグループにならないよう割り当てられる。
この項目の選択によって、プログラム上では Group という変数にグループ番号を割り振る操作が行われている。Group の変数に同じ値が入った参加者は、同じグループとして処理される。

データの保存全ての参加者が決められたピリオド数だけ意思決定を終了すれば実験は終了である*6 。適切に終了すれば、サーバー PC 側には自動的に結果を格納したエクセルファイルが出力される。関連する幾つかのファイルが出力されているが、重要なのは以下の 2 つのファイルである。

• xxxxx.xls• xxxxx.sbj
xxxxx はファイル名で、日付と時間とその他アルファベットの組み合わせで、実験毎に異なる名前が自動的に付けられる。.xls ファイルに全てのデータが格納されている。.sbj ファイルは実験内の Subject 変数に付与されている番号と、クライアント PC 側で設定された名前 (/name で設定した名称) の対応関係を記録したファイルである*7*6 実験終了後にアンケートも実施できる仕様になっており、予め questionnare ファイルを作成しておけば引き続き、各参加者にアンケートを答えてもらうことも簡単にできる。
*7 実験経済学では参加者に対して現金報酬を支払うが、その計算結果が書かれたファイルを同時に出力させることも可能である。ただし、その場合実験後にアンケートまで実行する必要がある。

A.5 Stage

9

スライド A.7

A.5

Stage 進行のパターン

Stage

前節までで、z-Tree と z-Leaf の全体的な構造が分かったので、以降、細かい要素について説明していく。まず、本節では、z-Tree の基本単位である Stage についてである。
メニューの「Treatment」の「New Stage」を選択すれば、新しく Stage を作成することができる。作成された Stage は Active screen と Waiting screen の 2 つの要素からなっているのが分かるだろう。Active screenが意思決定を行う画面であり、Waiting screen は自分が意思決定が終了し他の参加者の行動を待っている時などに表示される画面である。なお、Waiting screen も自由にレイアウトしたり、情報を提示したりすることができる。

A.5.1 Stage の進行
経済実験のステージの進行の仕方は、ほとんどの場合でスライド A.7 に示すような３パターンのどれか、
あるいは、その組み合わせで作られる。新しい Stage が追加されると、スライド A.8 に示すようなウィンド
ウが表示される。他の参加者の行動を待たず先のステージに進めるような個人意思決定であれば、「Start if

possible」を選択すると良い。また、参加者間で同期を取りながら同じステージ進行させたい場合には、「Wait
for all」を選択しておけば良い。時間が来れば強制的に次のステージに進めたい場合には、「Leave stage after
timeout」で「Yes」を選択しよう。その際、このステージに必要な時間は「Timeout」の欄にセットすれば良

付録 A

10

スライド A.8

z-Tree チュートリアル

Stage 進行の設定方法

い。なお、このウィンドウは、Stage をダブルクリックすればいつでも表示させることができる。

A.5.2 Stage に Box を配置

Stage の進行方向が決まれば、次は Stage に Box を配置して、参加者の提示される画面内容のレイアウトを定める。作成した Stage の下にくっついている Active screen をクリックし、選択した状態にしてから、メニューの「Treatment」から「New Box」→「Standard box」を選ぼう。そうすると、新しい Box が Stage
に追加される。Standard box が最もベーシックで良く用いられるものである。いろんなタイプの Box が用意されているが、特に理由がなければ、Standard box で良いだろう。

Box は単なる入れ物であり、そこにボタンなどの様々なコンポーネントを追加することで、参加者が意思決定を行うことができる画面を作れる。スライド A.9 には、美人投票ゲームの Input stage の構造について図示した。美人投票ゲームは、単に数値を入力するだけの意思決定であり、Stage に Standard box を追加し、その上に Item と Button を追加して、スライド左図のような画面を作っているのである。Item 等のコンポーネントは次節で説明する。
位置の設定は、追加時に現れるウィンドウで設定できる。また、Box に Box を追加し、入れ子構造にする
こともできる。入れ子にするとより複雑な配置や細やかな設定が可能である。状況に応じてうまく使いこなそう。その他にも、様々な機能を有した Box が用意されており、詳細については、改めて A.7 節で説明する。

A.5 Stage

11

スライド A.9

Box にコンポーネントを配置して Stage の中身を作る

スライド A.10

Item と Button の配置

付録 A

12

z-Tree チュートリアル

A.5.3 Box に Item と Button を追加

Standard box が配置できたら、美人投票ゲームの Input stage と同じものを練習で作ってみよう。Standard
box をクリックして選択状態にしてから、メニューの「Treatment」の「New Item」を押せば、スライド A.10の左図のようなウィンドウが表示されるだろう。図と同じように入力してみよう。入力が出来たら OK を押し完了させる。さらに、同じく「Treatment」から今度は「New Button」を選択しよう。スライド A.10 右側のようなウィンドウが出るので、今回はそのまま OK を押そう。そうすれば、z-Tree はスライド右下のようになるはずで、そうなっていれば OK である。ひとまずは美人投票ゲームの入力画面は完成である。
一方、美人投票ゲームの Result ステージは、結果を表示するだけなので、同じく Item を使い input のチェックを入れずに、必要な情報を提示するだけで十分である。Chap6-exp1-Beauty-Contest.ztt のファイルを参考に、Result stage も自分で作ってみよう。完成すれば、z-Tree は図 A.1 のような構造になるはずである。

図 A.1 美人投票ゲームの Result stage

このような手順で、実験の内容に応じて Stage の内容をそれぞれ作れば、様々なタイプの実験を作ることができる。
さて、図 A.1 では Active screen の前に「globals.do {...}」や「subjects.do {...}」などの部分が含まれていることに気づくだろう。これは、z-Tree で「Program」と呼ばれているもので、ここで各参加者が入力した数値を集約し、結果などを計算しているのである。この計算結果を Item を使って表示させている。この詳細については、次節で説明しよう。

A.5.4 Program による計算

Program は名前の通り、四則演算を始め、様々な計算を行うことが可能である。また、if 文のような通常のプログラミング言語で用いられるような構文も、一部利用可能である。必要に応じて、様々な場所に追加して、

A.5 Stage

13

スライド A.11

公共財ゲームの例

計算をすることができる。一般的な使い方は、美人投票ゲームで見たように、Stage の最初に追加する方法であり、その結果を同じ Stage 内で表示させると良いだろう。
図 A.1 のように、美人投票ゲームの Chap6-exp1-Beauty-Contest.ztt では、Result stage の最初に、様々な Program を追加して、複雑な処理をしていることが分かる。そこでは、グループ毎に集約した数値を保存するために新しい Table を作成し、平均値 ×2/3 のターゲットとなる数値を保持させている。初学者が参考にする例としては相応しく無いだろう。そこで、本書の 7 章で扱った公共財ゲームを使って、この Program の利用方法について説明しよう。
スライド A.11 に、7 章の公共財ゲームの実験 1（Chap7-exp1-Public-goods-a=1.6.ztt）の z-Tree の構造を示している。これは、同期を取りながら Stage が進んでいくタイプの実験であり、Contribution Entry とProﬁt Display と Finish の 3 つの Stage から構成されている。Contribution Entry で、公共財への投資額を入力させ、Proﬁt Display で結果表示する。また、7 章で説明した通り、これは繰り返し公共財ゲームである
ので、この投資額入力と結果表示が、Background で設定した Period 数だけ繰り返される。なお、Finish のStage は最後に合計利得を表示させるものであり、最後の Period だけこの Stage 表示させるために Programが追加されており、そこで Stage 参加のための処理の記述がなされている。この Stage への参加処理については次節で説明する。
さて、Finish stage を除いた 2 つの Program について見ていこう。1 つ目の Program は、Background に

付録 A

14

z-Tree チュートリアル

追加されており、単に EﬃciencyFactor と Endowment に値を代入しているだけである。この変数は、ゲームを通して変わることが無い変数なので、Background に追加している。このように、値を設定する場合だけでも、Program が使われる。
次に、2 つ目の Program を見よう。ここでは、公共財からの便益を計算し、各参加者の利得を計算している。具体的には、グループ内で投資された額の合計を計算し、それに EﬃciencyFactor を乗じて、グループ人数で割り、それを利得に加えている。もちろん、自分の投資額は初期の保有額から減じている。ここで、見慣れない処理が含まれていることに気づくだろう。具体的には以下の部分である。

SumC = sum( same( Group ), Contribution);
N = count( same( Group ) );ここで、sum と count は Table 関数と呼ばれるものであり、この部分が z-Tree 特有な部分で、かつ、このおかげで、様々な処理を非常に勘弁に行うことができる。上記の例では、sum は同じグループ内の参加者が入力した Contribution の値を合計している。count では、同じグループに含まれる参加者の人数をカウントしている。なお、この処理を正しく理解にするには z-Tree で用いられている Table の概念をしっかり理解する必要がある。それについては、A.6 節で説明する。

A.5.5 Program で使える構文など
ここでは、Program 内部で使える基本的な構文や関数などを一部紹介しよう。

四則演算
通常のプログラミング言語と同様、+, -, *, / はそのまま問題なく使用可能である。

比較演算子
数値等の比較には、<, <=, ==,!=, >=, > を通常の感覚でそのまま用いることができる。

論理演算子
論理演算子としては、&, | を用いる。and や or は使えないので注意すること。また、他のプログラミング言語で使用するような、&& や || も使えない。
基本的な構文
基本的な構文を表 A.1 にまとめた。その他の構文は z-Tree の Web サイトのマニュアルを参照のこと。

A.5.6 Stage へ参加するかどうかの処理
スライド A.11 の 3 つ目の赤枠の部分が、Stage へ参加するかどうかの処理を行っている部分である。この処理も Program を使って行う。スライドに示されているが、以下のように、Participate という z-Tree で用意された変数に、if 文を使って 0 か 1 を入力しているだけである。

Participate = if (条件部分, 1, 0);A.6 z-Tree における Table の概念

15
表 A.1 Program で使える基本的な構文

構文

説明

if (条件) { (処理) }条件が真の場合に、処理部分が実行される。

if (条件) { (処理 1) }条件が真の場合に処理 1 が実行され、偽の場合に処理

else {(処理 2)}

2 が事実行される。

if (条件 1) { (処理 1) }条件 1 が真の場合に処理 1 が実行され、条件 2 が真のelsif (条件 2) { (処理 2) }場合に処理 2 が事実行さ、それ以外の場合は処理 3 がelse {(処理 3)}

実行される。

while (条件) { (処理) }条件が真である限り、処理部分が繰り返し実行される。

repeat { (処理) }まず、処理部分が実行される。その後、条件部分が真でwhile (条件);ある限り、処理部分が繰り返し実行される。

later (数値) do { (処理) }

数値で指定された秒数だけ待った後に、処理部分が実行される。なお、数値部分は式でも構わない。数値が負であれば、処理部分は実行されない。

later (数値) repeat { (処理) }上記の later 文の繰り返し。数値で指定された秒数だけ待った後に、処理部分が実行され、再度、指定された数
値だけ待ち、処理部分が実行さるというプロセスが繰り返される。

Stage の冒頭で、Participate=1 となっていれば、その Stage へ参加するし、Participate=0 であれば、このStage はスキップして次のステージへ進む（同期を取っている場合には、Waiting screen 画面が表示される）。
なお、スライド A.11 の例では、繰り返しの Period 数が最後の Period になった場合（Period==NumPeriods）に、このステージに参加するという単純なものであり、繰り返しゲームの最後に最終的な合計利得を表示する

Stage である。
上記の例では、全参加者が Stage に参加するかどうかを制御したが、参加者毎に Stage に参加するかどうかを制御可能である。例えば、交互手番ゲームのように、参加者が異なる Stage に入らなければならないような場合も、この Participate を使って、Stage への参加をうまく制御できる。
この Participate の処理についても、A.6 節で説明する Table の概念を理解した方が、この処理の意味も正しく理解することができるだろう。

A.6

z-Tree における Table の概念

z-Tree で用いられている Table の概念を理解することが重要である。少し特殊な構造を有しているため、初学者は Table の扱いで混乱することが多い。これを理解することが、z-Tree プログラミング上達の近道である。

A.6.1 Subjects Table

z-Tree の Table のうちで、最も基本的で、かつ、よく使うものが Subjects Table である。基本的に、個々の参加者が意思決定した値などが全て格納されている Table である。

付録 A

16

スライド A.12

z-Tree チュートリアル

z-Tree における Subjects Table の仕組み 1

スライド A.12 に、実験中の参加者の意思決定と格納されるデータ構造のイメージを示している。A.5 で説明したように、必要な Stage で意思決定の結果を入力させるように Item などを使うが、その値は参加者毎に異なるものになるため、スライド A.12 の右側の表のような形で、それぞれの参加者の結果は表の行として保存される。また、多くの実験で、決まった人数のグループが設定されるが、それは Group という変数にグループの番号がセットされている*8 。
実験参加者の意思決定データは、基本的に上記のようなデータ構造として保存されるが、z-Tree で用意されている Subjects Table は、スライド A.13 で示すように、Period 毎に取り出したものが、Subujects Tableである。また、次の Period に進むと、Stage 開始の時点で全ての変数は初期化され、前の Period のデータは基本的に引き継ぐことができない*9 。つまり、Subujects Table とは、現在の Period の各参加者のデータを格納した表であると考えると良いだろう。

Subjects Table のデータ構造のイメージができれば、Table 関数の処理も理解することができるだろう。公
共財ゲームで出てきた sum(same(Group), Contribution) は、スライドでも説明しているように、自分のGroup 変数と同じ値を持っている人の投資額（Contribution）を合計した値を返す関数なのである。また、もう 1 つの count(same(Group)) は、同じ Group 変数の値を持った変数の個数をカウントする関数であり、す*8 スライド A.12 の右側の表で書かれている、Period, Subject, Group, Proﬁt, Participate はデフォルトで設定されている変数である。独自に追加した変数は、Participate 以降の列として追加される。
*9 前の Periood のデータを引き継ぐためには、OLDSubjects という Table を使う。詳細は z-Tree のサイトのマニュアルを参照。

A.6 z-Tree における Table の概念

スライド A.13

17

z-Tree における Subjects Table の仕組み 2

なわち、これで簡単に同じグループの人数を求めることができる。
このように、Table の概念を前提として、簡単に参加者の意思決定の値を集計したり、取り出したりする関数が Table 関数である。z-Tree では、様々な Table 関数が用意されている。

A.6.2 Table 関 数
代表的な Table 関数を表 A.2 に示す。これらの Table 関数は、当然ながら、どの Table で使用するかによって、その挙動は同じではないので注意が必要である。Subjects Table 以外の Table については、次節で少し説明する。

A.6.3 その他の Table

Subjects Table 以外に、デフォルトでは、Global Table、Summary Table、Session Table、Contracts Tableが用意されている*10 。さらに、自分自身で新しく Table を作成することも可能である。なお、美人投票ゲーム（Chap6-exp1-beauty-contest.ztt）で、groupdata という Table があるが、それは追加で独自に作成したものである。

*10 最新のバージョン 5 では、Clients Table, Treatments Table (Session Table から名称変更), Logﬁle Table, SessionGlobals

Table, Participations Table などのテーブルが追加されている（2021/03/17 現在）。

付録 A

18

z-Tree チュートリアル

表 A.2 代表的な Table 関数一覧

Table 関数説明

sum(条件, 変数)

Table のデータのうち、条件に当てはまる、変数の合計を返

sum(変数)す。条件を指定しない場合は、指定した変数について、そのTable に含まれる値を全て合計した値を返す。
average(条件, 変数)

Table のデータのうち、条件に当てはまる、変数の平均値を返

average(変数)す。条件を指定しない場合は、指定した変数について、そのTable に含まれる値を全て平均した値を返す。
count(条件)

Table のデータのうち、条件に当てはまる、データの数（行count()

数）を返す。条件を指定しない場合は、Table に含まれるデー
タ数（行数）値を返す。

maximum(条件, 変数)

Table のデータのうち、条件に当てはまる、変数のうちで最大

maximum(変数)値を返す。条件を指定しない場合は、指定した変数について、
その Table に含まれる値のうちで最大値を返す。

minimum(条件, 変数)

Table のデータのうち、条件に当てはまる、変数のうちで最小minimum(変数)値を返す。条件を指定しない場合は、指定した変数について、
その Table に含まれる値のうちで最小値を返す。

Global Table
Global Table は 1 つのレコード（1 行のデータ）のみで構成される Table である。ゲームを通じて変わることの無い変数などは、この Table の中で定義すれば良い。どの参加者からも同じ値が参照される。しかし、Subject Table と同様、次の Period に行けば初期化される。そのため、Stage の途中で Global Table に含まれる変数の値を変更したとしても、Period が変われば元の初期設定に戻るので注意が必要である。あくまで、これらの Table は Period 単位でデータを格納する。

Summary Table
一方、Summary Table は、Period 毎に 1 つのレコード（1 行のデータ）を持つ構造の Table であり、Summary

Table に含まれる変数は、次の Period へ行っても初期化されない。トリートメント*11 が終わった時点で、Table のデータが破棄される。1 つのトリートメント中に、Period を超えて管理した変数がある場合には、この Table をうまく活用すると良いだろう。しかし、参加者毎の変数をこの Table 保持するような使い方は適さない。ただし、Summary Table であっても、Background の部分に Program を使い、数値の代入をしている場合には、Period の最初にそれが実行されるため、見た目上は Period 毎に初期化されているのと同じよ
うな振る舞いに見えてしまう。Summary Table を利用する場合には仕組みをしっかり理解しよう。

Sesison Table
Session Table は、複数のトリートメントを超えてデータを管理したい場合に利用すると良いだろう。Session
Table は、次の Period へ行っても変数の値は初期化されないし、1 つのトリートメント（同じ設定下の 1 つ*11 トリートメントは、1 つの設定での実験のことを指す。つまり、z-Tree で言えば、Period 1 から終了 Period までの一連のプロセスがトリートメントという単位である。

A.6 z-Tree における Table の概念

19の実験）が終わっても、z-Tree を終了させない限り、Table のデータは初期化されない。デフォルトで設定されている FinalProﬁt の変数は、この Table 内で定義されており、セッションを超えて、合計利得を保存している変数である。なお、Subject Table に Proﬁt と TotalProﬁt という変数がデフォルトで定義されているが、Proﬁt に各 Period の利得を保存すれば（各 Period の最初に初期化される）、その累積値が TotalProﬁtに自動的に保存されるようになっているので、実験をする場合に合計利得を保存する変数を改めて用意する必要はない。しかし、TotalProﬁt もトリートメントが終了すれば初期化される。しかし、Session Table の中のFinalProﬁt の変数には、トリートメントを超えて累積された値が入っているのである。
なお、Contracts Table は、市場タイプの実験の際に利用する。詳細については、A.8 節で説明する。

A.6.4 異なる Table から Table 関数を用いる場合

Program を追加する場合には、スライド A.14 のように必ず Table を指定しなければならない。デフォルトでは、Subjects Table になっている。しかし、例えば、Global Table を選択している状況で、Subjects

Table の Table 関数を利用したい場合も出てくる。その場合は、スライドのように、Table 名に . (ドット) をつけて、その後ろに Table 関数をつなげて使えば良い。
また、Table 関数において、スコープオペレータの働きを理解しておくことは重要である。多くのプログラ
ミング言語で用いられているように、スコープオペレータは : (コロン) が用いられ、そのスコープの上位のス

スライド A.14

Table 関数の動作

付録 A

20

z-Tree チュートリアル

コープの変数を参照したい時に使う。
スライド A.14 の右下に示しているように、これまでに何度も出てきた same(Group) という命令は、ス
コープオペレータを用いて Group==:Group と全く同じ処理が行われていただけである。この意味は以下の図を見れば直感的に理解できるだろう。外側のスコープでは、例えば、Group=2, Subject=5 の状況で、

sum(Group==:Group, x) を実行しようとしている状況である。sum 関数の内部のスコープでは、Subjects
Table のループを回して、外側のスコープの Group と同じ値を探しているものだと考えると分かりやすいだろう。

Subject Table のスコープ（外側）(Group=2, Subject=5, · · · )上位のスコープの変数を参照

Table 関数のスコープ（内側）sum 関数は Subjects Table のレコード
を 1 つずつチェックする→ Group=1, 2, 3, · · ·（ただし、このスコープにおいて :Group=2）
図 A.2 Subject Table におけるスコープオペレータの働き

このように、Table 関数とスコープオペレータは一緒に使われることが多いので、覚えておくと良いだろう。

A.7

様々なタイプの Box

本節では、Stage に追加する Box について説明する。すでに、Standard box は出てきたが、それ以外にも有用な Box があり、比較的よく使うものを紹介しよう。スライド A.15 に、本節で紹介する Box の機能についてまとめている。

A.7.1 Standard box
最も基本的な Box であり、特別な目的がなければこれを使うと良いだろう。

A.7.2 Grid box
スライド A.15 の右上の図に示すように、box に追加するコンポーネントをグリッド状に配置できる。

A.7.3 Container box

Box に Box を配置して入れ子構造を作る場合には、Container box を使う。なお、Container box に別のBox を追加する場合は、Container Box を選択した状態でなければ、新しく Box を追加できない（メニューに表示される各 Box がグレーになって選択できない）。

A.7.4 History box
繰り返しゲーム等において、過去の Period の行動の履歴を表示したい場合には、History box を使う。

History box に item を追加していくことで、スライド A.15 の左下の図のような履歴の表が簡単に作成でA.7 様々なタイプの Box

21

スライド A.15

きる。

A.7.5 Box の配置位置の設定

Box は追加時に現れるウィンドウで、Width や Height、Distance to the margin の部分に数値設定することで、配置位置を設定することができる。% かピクセル (p) で指定する。スライド A.16 に、Container に複数の Standard box を幅と余白を変えて設置した例を示す。なお、Box の高さは 60p に固定して、Width と左右の Margin を色々変更して、Box の配置がどのように変わるか確認して欲しい。設定の仕方は少し複雑なので、しっかり理解する必要がある。
さらに、「Adjustment of the remaining box」の部分はさらに理解が難しい。スライド A.17 で、Top,

Bottom, Left, Right のチェックの意味を説明している。スライドの左上の図に示しているように、z-Tree 上
では Container box に Standard box を 4 つ続けて追加しており、さらに、それぞれの Box の「Adjustmentof the remaining box」では、異なる部分にチェックを入れている。
まず、1 つ目の Box（Box1）は、Container box の上部に配置されており、高さが 10% に設定され、そのBox 下部の余った部分を赤枠で示した。ここで、Top にチェックが入っている意味は、この Box 追加後に余った領域の Top（赤枠の上辺）を意味している。次に追加する Box はこの Top からの相対位置でサイズとマージンをすることになる。

付録 A

22

スライド A.16

スライド A.17

Box の配置位置の設定

Adjustment of the Remaining Box の設定

z-Tree チュートリアルA.8 Contract Table
2 つ目の Box (Box2) は、Width=20%、上、左、下からのマージンを 20p と設定しており、ちょうど、Topの部分で示されたところから、20 pixel の余白で、かつ、左と下の余白も 20 pixel になり、左側に寄った配置になっていることが分かる。さらに、この Box では Left にチェックが付けられている。その意味は、先ほどと同様に、青枠の四角の左辺を指し示しており、次に追加する Box はここからの相対位置で設定することになる。
そして、3 つ目の Box（Box3） は Height=30% の Box であり、左からのマージンが 0p、上下のマージンは未設定なので、青枠で示された四角の縦の長さの 30% が Box の高さとなり、上下の余白は均等に設定される。今回、上下 2 つに余った領域ができ、次に追加される Box はこの余白領域のどちらかとなる。ここで、この Box3 は Bottom にチェックが入られているので、余った 2 つの領域のうち上側が選択され、緑枠の四角の下辺が Bottom となり、次の Box はそこからの相対位置で設定することになる。スライドの図から分かるよ
うに、4 つ目の Box は、Height=100p、下からのマージンが 0p と設定されているので、Box3 のすぐ上に配置されることになる。
このように、「Adjustment of the remaining box」による配置の設定は、その仕組みをよく理解しておかな
ければ、思いがけないレイアウトになってしまう恐れがあるので、注意が必要である。

A.8

Contract Table

本書の 2 章や 4 章で説明した市場タイプの経済実験では、Contract Table が使われている。本節までは、
美人投票ゲームのような他の参加者と同期を取りながら Stage を進めていくタイプとして説明してきたが、ダブルオークションなどの市場実験では、リアルタイムに売り注文を出し、買い手が出てきた売り注文を他の参加者に取られないように素早く購入したりする。このような場合、Contract Table が必要不可欠である。本節では、Contract Table の重要なエッセンスだけに絞って説明する。詳細については、z-Tree のサイトのマ
ニュアルを参照されたい。

Subjects Table など、基本的な Table はレコードの数（表に含まれるデータの行数）は予め定められている。しかし、連続ダブルオークションなどの実験では、参加者からどれだけ入札の注文が出されるか分からず、

Table のレコード数の上限を定めることができない。そのように、実験中にどんどんレコードを追加できるよ
うになっている Table が Contract Table である。基本的に、Contract Table は各 Period における参加者のすべての入札を記録するような形式で使う。ただし、次の Period に進めば Table のレコード全ては初期化される。

Contract Table を有効活用するために、Contract Creation Box, Contract List Box, Contract Grid Box
等の専用の Box が用意されている。これらの Box は、入札の作成や選択をしたり、現在市場に出されている
入札を確認したり、それを変更したりする操作を提供してくれる。
例えば、Contract Creation Box を追加し、そこに Item を配置し、価格等の入力を受け付けるインプット欄を作る。そこで、参加者が数値を入力してボタンを押せば、即座にそのデータは Contract Table の 1 つのレコードとして保存される。また、Contract List Box は、Contract Table に含まれるレコードを表示するための Box であり、作成されたレコードはリアルタイムでこの Box で更新される。そのため、ある参加者が作成した入札を、他の参加者が即座に確認でき、その入札に応じるなどの意思決定が実現できるのである。な

23

付録 A

24

z-Tree チュートリアル

お、Contract List Box では、表示された入札を選択して、それに応じるような意思決定を含めることも可能である。ただし、その際には、Contract Table の値を適切に更新するような Program を適切に記述する必要がある。
初学者には Contract Table の理解は多少難しいかもしれない。本書の第 2 章で扱ったダブルオークションの z-Tree のファイル（Chap2-exp1-double-auction.ztt）の中を参照し、まずはダブルオークションがどのように記述されているか理解するところから始めると良いだろう。

A.9

参加者の画面表示に関する Tips

A.9.1 Item の Layout 設定
スライド A.18 に示すように、Item によって z-Leaf 上で表示フォーマットは Layout 欄に指定することで、様々な形式で出力することができる。

数値の表示桁数など
数値の桁数を設定したい場合には、Layout 欄に数値を入力すれば良い。ただし、その数値が最小単位となり、その倍数で最も近い値が表示される。1 にすれば整数表示になるし、0.1 であれば小数点第 1 位までの表示となる。0.2 のような数も設定可能で、その場合はスライドのように、x = 12.31 ならば 12.4 が表示されること

スライド A.18

Item の Layout 設定

A.10 実行時に指定するオプション：コマンドラインオプションになる。

変数に Text を割り当てて表示

Layout 欄に !text: 1 = "協力" ; 2 = "裏切り"; と書いておけば、variable にセットした変数が 1 の時に、z-Leaf 上に「協力」、2 の時に「裏切り」が表示される。数値を何かのテキストに置き換えて表示したい場合に使う。

ラジオボタンで入力
参加者に意思決定を入力させる場合、単にボックスに数値だけを入力させるだけが、その方法ではない。

Layout 欄に !radio: 1 = "ボクシング"; 2 = "バレエ"; のように入力すれば、ラジオボタンでの意思決定の選択が可能になる。なお、参加者がラジオボタンで選択した際に、対応する数字が variable でセットした変数に保存される。

その他の入力オプション
ラジオボタンの他にも、line of radio buttons, checkbox, slider, horizontal scrollbar, push buttons のオプションを利用可能である。詳細は z-Tree サイトのマニュアルを参照のこと。

A.9.2 Item の Label 部分で変数を表示する

Item の Label 部分に変数の値を直接表示することも可能である。その場合には、スライド A.18 の右下で示されているように、Label 欄の冒頭に<>を書き、変数を表示したいところで < (変数) | 0.1 > を書けば、変数の値を文字列の中に含めることができる。なお、| の記号の後ろに書いている数字は、Layout 欄に記入するものと同じ形式で記述すれば良い。

A.10

実行時に指定するオプション：コマンドラインオプション

A.2 節で説明したように、z-Tree で実験する環境を構築するために、z-Leaf のショートカットを作成し、そこに /name のような形式でいくつかのパラメータを設定した。実は、このような作業によって、起動時にオプションを指定しているのである。z-Tree ではこれをコマンドラインオプションと呼んでいる。スライド A.2
で設定した以外にも、たくさんのコマンドラインオプションが用意されている。それぞれ、z-Tree 側と z-Leaf
側で異なるオプションもあり、本節でそれぞれ紹介しよう。

A.10.1 設 定 の 仕 方
繰り返しになるが、コマンドラインオプションを設定するには、ショートカットを作る必要がある。z-Leafにコマンドラインオプションを指定したい場合は、z-Leaf.exe のショートカットを、z-Tree ならば z-Tree.exeのショートカットをそれぞれ作成しなければならない。作成したショートカットのプロパティ画面を開き、「リンク先」の欄の末尾に、必要な設定を記述すれば良い。記述方法は、「/(オプション名)␣(指定する値)」という形式で指定する。複数のオプションを設定したい場合には、半角スペースを空けて、上記のフォーマットを必要な分だけ続けて追加すれば良い。

25

付録 A

26

z-Tree チュートリアル

A.10.2 コマンドラインオプション一覧
表 A.3〜表 A.5 に、比較的良く使う代表的なオプションを示す。全てのコマンドラインオプションを知りた
い場合は、z-Tree のサイトのマニュアルを参照のこと。
表 A.3 z-Tree、z-Leaf に共通なコマンドラインオプション一覧

オプション名指定可能な値/languagejp, japanese, nihongo

説明
言語設定のオプション。なお、左記は日本語の場合。多言語に対応しているので、その他の場
合は z-Tree のサイトを参照のこと。

1 以上の整数/channelz-Tree と z-Leaf を繋ぐチャネルの設定。これを設定すれば、1 台のサーバー PC 上で、複数の z-Tree を立ち上げることができ、1 台のサーバーでチャネル毎に別の実験を実施可能になる。同じチャネル上で繋げたい z-Tree と z-Leaf
は、/channel の値をそれぞれ同じにすれば良い。

表 A.4 z-Tree のコマンドラインオプション一覧

オプション名指定可能な値
ディレクトリ名/xlsdir

説明
生成された .xls ファイルを指定したディレクト
リに保存する。

ディレクトリ名/zttdir.ztt (実験トリートメントのファイル) を指定したディレクトリに保存する。

ディレクトリ名/datadir

生成された .xls ファイルと .sbj ファイルを指定したディレクトリに保存する。

ディレクトリ名/dirz-Tree が生成する全てのファイルを指定したディレクトリに保存する。

A.11

そ

の

他

その他の有用な項目についてここで説明する。

A.11.1 日本語設定で作成するために新規で「New Treatment」を選択すれば、デフォルトではドイツ語設定になっており、参加者に示されるメッセージの多くがドイツ語のままである。日本語にするためには、メニューの「Treatment」の「Language」*12 を選択してから、から「Nihongo」「New Treatment」を選択すれば良い。なお、「New Treatment」で新規ファイルを作成した後で、「Nihongo」を選択しても、変更することはできないので、事前に選択しておく必要がある。

*12 Japanese ではなく Nihongo になっているのは、開発者のポリシーによるものである。筆者らも含まれる研究グループが、当時、z-Tree 開発者と共に日本語化作業を行ったが、その際に強く要請され、現在もそれの記載がそのまま残っている。

A.11 その他

27
表 A.5 z-Leaf のコマンドラインオプション一覧

オプション名指定可能な値

説明

/name

文字列

z-Leaf の名前の設定。

/server

IP アドレス

接続するサーバー (z-Tree) の IP アドレスを設
定する。

/size

(width)x(height)

z-Leaf のウィンドウサイズを変更する。サイズの指定の仕方は、width の数値と height の数値を”x”でくっつける。e.g. 1024x867/position

xpos,ypos

z-Leaf が表示されるウィンドウの場所を設定する。ウィンドウの左上のコーナーが、xpos, ypos
で設定した座標になる。なお、xpos と ypos の間の”,”(カンマ) の後にスペースは入れてはいけない。

/fontface

フォント名z-Leaf で表示される文字のフォントを変更する。

/buttonfontface

フォント名z-Leaf で表示されるボタンのフォントを変更する。

/fontsize

整数値

z-Leaf で表示される文字のフォントサイズを設定する。

あるいは、A.10 節で説明したコマンドラインオプションで、z-Tree 側で /language を日本語にしておくと、自動的に「New Treatment」で新しく日本語設定のものが作成されるので、上記の手順は必要なくなる。

A.11.2 Parameter Table
メニューの「Treatment」から「Parameter Table」を選択すれば、スライド A.19 に示すような表が現れる。ここでは、5 行６列の表になっているが、1 つの Period が 1 つの行に対応し、1 つの列が 1 人の参加者に対応している。そのため、一番左側に書かれた数値の列は Period 数を表しており、一番上に表示されている

S1 から S6 はそれぞれ、Subject 1 から Subject 6 を意味している。なお、左上の選択されて黒くなっている
セルをダブルクリックすると、右下のようなウィンドウが現れる。この Program 部分に変数の設定をすれば、Subject Table 内の変数にそのまま数値を代入することができる。z-Tree の Stage 内部で処理しなくても、こ
こから強制的に設定が可能なので、いざという時に非常に役に立つ。
なお、各セルの左肩に小さな数字があるが、これは Subject Table の Group の変数の値が表示されている。
つまり、この Parameter Table では、6 人３グループの実験で、それぞれSubject 1 と 2、Subject 3 と 4、Subject 5 と 6 がペアになった 2 人１グループの実験設定であることが分かる。この Table で Group の数字を設定することもできるし、A.4.3 節で述べたように、メニューの Matching から Partner などの設定を選択することで、自動的にこの番号を付与することができる。

A.11.3 チャット機能やグラフィック表示z-Tree にはチャットやグラッフィクの表示機能も備えている。実験中に参加者同士で、チャットボックスで会話を許すような形式で実施したい場合などは有用である。また、画像の表示や、簡単なグラフィックならば

付録 A

28

スライド A.19

z-Tree チュートリアル

Parameter Table

z-Tree 上でも可能である。本付録では説明しないが、詳細については、z-Tree のサイトのマニュアルを参照の
こと。

A.12

マニュアル等の有用な情報源

開発元であるチューリヒ大のサイトに多くの有用な情報が提供されている。https://www.ztree.uzh.ch/ でチェックすると良いだろう。マニュアル等も利用可能である。また、そのサイトでアップされている日本語のマニュアルは、Version 2.1 のものしかなく、かなり古いものであるが、基本的部分は共通であるので、初めて学ぶ人には有用であろう。

29

付録

B NetLogo チュートリアル

B.1

NetLogo とはスライド B.1 で説明しているように、NetLogo は非常に簡単にエージェントベースシミュレーションのプ
ログラミングを作成し、かつ、グラフィカルに実行することができる優れたシミュレータである。NetLogo 自体は、https://ccl.northwestern.edu/netlogo/ より入手可能である。インストールも通常のアプリケーションと同様に、指示された通りに従うとインストールできる。インストールが終了すれば、実際に NetLogo を立
ち上げてみよう。

スライド B.1

NetLogo とは

付録 B

30

スライド B.2

B.2

NetLogo チュートリアル

NetLogo の画面

NetLogo の基本構成

NetLogo を起動すると、ウィンドウ上部に「インタフェース」「情報」「コード」と書かれたタブが見えるはずである。各タブを押せば、それぞれスライド B.2 に示すように 3 つの画面にそれぞれ切り替わる。それ
ぞれ異なる役割を担っており、プログラミングのソースコードの作成から実行まで、全てこのアプリケーショ
ン内で全て完結する。なお、スライド B.2 の画面は、モデルライブラリから Sample Models → Biology →Flocking のファイルを開いたものである。
B.2.1 インターフェース画面
スライド B.2 の左側に示されてるのがインターフェース画面である。スライド B.3 のように、シミュレー
ションを実行するには、Setup ボタンを押すことで初期化が行われ、その後に go ボタンを押せば、シミュレー
ションが開始される。スライドで示されているように、Setup ボタンが押された後に、黄色い三角形のエー
ジェント*1 が画面上に描画されていることが分かる。本書でも、以降は NetLogo の名称に従い、turtle と呼ぶことにする。
さて、実行ボタン（go ボタン）を押してみよう。turtle が動き始める様子を確認することが出来るだろう。
*1 厳密には、Netlogo の世界では turtle と呼ばれる。turtle もエージェントの 1 つであるが、それらを含む上位概念として agentが定義されている。

B.2 NetLogo の基本構成

31

スライド B.3

プログラミング実行

なお、シミュレーションをストップするには、もう一度 go ボタンを押せばよい。

B.2.2 情 報 画 面
タブの情報と書かれたボタンを押すと、プログラミングの説明がされている。スライド B.2 の真ん中の図は、Flock のシミュレーションの説明である。ただし、日本語バージョンであっても、この部分は英語のままである。自分自身でプログラミングを作成する場合には、ここは何も記入されていないので、必要に応じて自分で作成することができる。

B.2.3 コード作成画面
プログラミングの作成はこの画面で行う。具体的に中身を見れば、to setup から end という一つのブロックで書かれている部分を確認することが出来るだろう。その部分がインターフェース画面の setup ボタンに対応しており、ボタンを押すと、この部分が実行されるのである。同様に、setup のブロックの下には、go のブ
ロックがあるはずである。それが、ﬂock のプログラムのメインの実行部分となる。go ボタンが押されることで、プログラム内部では、この部分が実行されることになるのである。
以上のような to と end で囲まれた 1 つのブロックを NetLogo では procedure と呼ぶ。通常のプログラミ
ングの関数と同様なものと考えれば良い。自分自身でプログラミングを作る場合には、この setup と go を作ることから始めることになる。

付録 B

32

スライド B.4

B.3

NetLogo チュートリアル

NetLogo の動作の仕組み

NetLogo におけるシミュレーションの仕組み

B.3.1 シミュレーションの実行の仕方

NetLogo では、他の多くのプログラミング言語にあるような main 文は存在しない。その代わりに、自分自身がインターフェース画面でボタンを押すことによって、プログラムが実行される。そのために、スライド

B.4 のように、自分自身で実行のためのボタンを作成し、それに対応する procedure を記述しなければならない。
前節でも述べたように、setup と go の 2 つのボタンを作成することが規範的な作り方である。ほとんどの場合で、そのように作成すれば問題ないだろう。通常は、setup で turtle の生成やパラメータの初期化などを行うのが通常である。なお、go ボタンを作る際に、「フォーエバー」のオプションを設定することができる。
チェックを入れると、go procedure が無限に何度も実行される。その場合、１ステップずつどのように動くか確認するために、go once というようなシミュレーションのステップ刻みで動くようなボタンと分けて 2 つのボタンを作っておくと便利であろう。モデルライブラリのプログラムでもそのように作られていることが多い。
さらに、ほとんどの場合で、go procedure の中から別の procedure を呼び出して、より複雑な処理などを行うことになるだろう。procedure の中では、ask 文を使って、エージェントに命令するという形式でプログラ
ミングを行う点が、NetLogo の特徴である。ask 文については、B.5 節で詳細を説明する。

B.3 NetLogo におけるシミュレーションの仕組み

スライド B.5

33

NetLogo 世界の構成要素

B.3.2 NetLogo 世界の構成要素: turtle, patch, link, observer

NetLogo は、エージェントベースの形式でシミュレーションを作成しやすくなるように、その世界が事前に規定されている。NetLogo の世界は、turtle、patch、link、observer という 4 つの構成要素からなる。スライ
ド B.5 にイメージを示す。

patch
NetLogo の世界は、patch が一面にグリッド状に敷き詰められていると考えると良い。xy 座標系上でそれぞれの patch が管理されており、プログラミングでは「patch 2 5」のような形式で表すことができる。この場
合、座標 (2,5) にある patch のことを示す。

turtlepatch の上に自由に動き回れる主体が turtle である。turtle にはそれぞれ ID のような番号が付与されており*2 、「turtle 1」のような形式で表すことででき、この場合 ID が 1 の turtle という意味である。プログラム
内部で、個別の turtle に命令したい場合は、このように番号を付けて指定すると良い。

*2 実際は、who というパラメータに値が入っている。

付録 B

34

NetLogo チュートリアル

linkturtle 同士を繋ぐものが link である。有向リンクと無向リンクの 2 種類がある。個別のリンクを指定する場
合には、何番の turtle 同士がつながっているかという、その番号で指定すれば良い。つまり、「link 0 1」は「turtle 0」と「turtle 1」の間で繋がった link を表す。

observer俯瞰的に見ている主体が observer である。patch、turtle, link に命令を出すことができる主体であると考えれば分かりやすい。NetLogo プログラミングにおいて、この observer を直接操作するということはしない。概念的なものであり、ask 文（詳細は B.5 を参照）でそのイメージを掴むことができるだろう。

B.3.3 描 画 画 面
敷き詰められた patch がインターフェース画面の黒い部分に描画されている（スライド B.6）。また、同ス
ライド右側に示されているように、設定ボタンを押せば、具体的に patch がとのような座標に対応しているか分かる。また、この画面で、座標の原点や x 軸と y 軸の最大値と最小値を設定することができる。
この設定画面で、パッチサイズを指定することができる。このサイズはパッチの一辺の長さを表している。
このサイズを小さくすれば、描画サイズ自体も小さくなる。逆に、大きくすれば、描画サイズが大きくなる。
状況に応じて、調整すると良い。

スライド B.6

描画画面

B.4 変数の定義や代入など

35

スライド B.7

B.4

変数の定義

変数の定義や代入など

本節では、NetLogo で扱う変数について説明する。スライド B.7 に示すように、グローバル変数、エージェ
ント変数、ローカル変数に大きく分けることができる。それぞれ、スライドに示されるような形式で定義する。

B.4.1 global 変 数
通常のプログラミングと同じで、グローバル変数はどこからでもアクセスできる変数であり、NetLogo でも
基本的に同じ考え方である。

B.4.2 ロ ー カ ル 変 数
ローカル変数も、考え方は通常のプログラミングと同様である。procedure の中だけで有効な変数であり、スライド B.7 のように、let を使って定義する。procedure の最初の部分で定義すれば、同じ procedure 内であれば、いつでも、どのエージェントからでもアクセスできる変数である。一方、ask 文などに使われる四角
いかっこ [ ] の中でも定義することが可能で、その場合、その変数はかっこの中だけで使える。

B.4.3 エージェント変数

NetLogo の特徴はエージェント変数である。エージェントが個別に持っている変数である。オブジェクト指

付録 B

36

スライド B.8

NetLogo チュートリアル

変数の代入など

向プログラミングで当てはめると、各クラスのプライベート変数のようなものであると考えればイメージしやすいだろう。エージェント個別に持っているため、同じ変数名でも、異なるエージェントであれば、当然ながら異なる値が格納されている。例えば、スライド B.7 では、turtle が a, b, c の 3 つのエージェント変数が定義されているが、turtle 0 が a=2 の値が入っていても、turtle 1 は全く異なる a=10 がセットされていたりするので、混同しないようにしよう。

B.4.4 変 数 の 代 入スライド B.8 に、NetLogo での変数の代入や四則演算の方法について示した。変数の代入については、setを使う。通常のプログラミングでは x = 10 のように直感的に記述できるが、NetLogo では変数の代入に =のオペレータが使えない。その代わりに、set を使う。「set (引数 1) (引数 2)」という形式で、引数 1 の変数に、引数 2 の値を代入する。なお、変数に値を設定しない場合、デフォルトでは 0 がセットされる。

B.4.5 四則演算、and/or 等のオペレータ
四則演算も通常通り使うことができる。しかし、スライドに示しているように + - * / のオペレータの前後には必ず半角スペースを入れるのを忘れないようにしよう。なお、余剰演算子は % ではなく mod を使う。
また、and, or, not などの論理演算子も、そのまま使うことができる。ただし、&&, ||, ! などのオペレータは使えない。

B.5 ask 文とエージェントへの命令
B.4.6 リス

37

トスライド B.8 の下部に示したように、リストは「list 1 2 3」という形式で定義できる。ただし、x[0], x[1] のような方法で、リストの要素にはアクセスできない。リストの要素を取り出したい場合には、item というコマンドを用いる。使い方は、「item (番号) (リスト)」という形式で、番号に指定した index 値の要素を、第 2 引数で指定されたリストから取り出す。また、リストの要素を置き換えたい場合は、「replace-item (番号) (リスト) (値)」という使い方をする。これによって、第 2 引数リストのおいて、第 1 引数指定された index 値にある値を、第 3 引数の値にセットし直す。
なお、エージェントのリストも同じように作成することができる。エージェントのリストは、B.5.3 節で説明するエージェント集合と似ているが、リストは順序が保存されているところが違いである。詳細は B.5.3 節
を参照のこと。

B.5

ask 文とエージェントへの命令

NetLogo で最も重要な構文が ask 文*3 である。本節では、ask 文の使い方について説明する。

スライド B.9

ask 文について*3 NetLogo のサイトのマニュアルでは ask 文という言い方はしていないが、本書では ask 文という言い方に統一する。通常のプロ

グラミングの foreach 文に近いような使い方をするため、それになぞらえて ask 文という言い方にした。

付録 B

38

NetLogo チュートリアル

B.5.1 ask 文の仕組み
スライド B.9 に示しているように、ask の直後に命令を送りたい対象を指定する。指定できるものはエー
ジェントであり、具体的にはスライドに記載している通りである。例えば、turtle 全体に命令を出したけれ
ば turtles のように複数形にすれば良い。
「turtle (番号)」 (番号は who というエージェント変数の格納されている) という形式で指定すれば、個別の turtle に命令を出すことができる。patch や link についても同様である。

ask 文は、多くのプログラム言語にあるような foreach 文に処理が似ている。NetLogo でも foreach 文を使うことができるが ask 文とは少し動作が異なる。ask 文では、対象とするエージェントが 1 つの場合には、そのエージェントだけに命令が実行されるが、対象とする部分が複数のエージェントだった場合*4 、各エージェントに対して、順番に指定された命令が実行される。ただし、実行されるエージェントの順番は毎回ランダムになる。
また、角括弧を使うところも NetLogo の特徴である。すでに、これまでにもソースコードの一部を示しているので、読者は気づいていると思うが、基本的に NetLogo では各括弧を使う。ask 文で対象となるエージェ
ントを指定した後、具体的な命令は角括弧に囲まれたものが順番に実行される。もちろん、角括弧だけではな
く、通常の丸括弧も使われる。四則演算においては丸括弧を使えば良いし、set や list などのコマンドを複数つなげて書く場合にも丸括弧で指定する。
このように、NetLogo でのプログラミングは、ask を使ってエージェントを動かすという観点でプログラムを作成することになる。もちろん、エージェントと関係ない、グローバル変数などの処理では、ask 文を使う必要はない。

B.5.2 observer

observer はエージェントの 1 つとして定義されているが、描画画面に実際に登場したり、observer に対して処理を行うことはない。概念的なものだと考えれば良い。ask 文を実行する際に、observer をイメージすることができるだろう。この NetLogo の世界を observer が俯瞰的に眺めており、中央集権的な立場から、各エー
ジェントに ask というコマンドを用いて命令を出し、それぞれを動かしていくという形式でプログラミングが書かれていると思えば、プログラミングの作業も比較的すっきするだろう。

B.5.3 エージェント集合

ask 文で特に重要になるのがエージェント集合の概念である。文字通り、複数のエージェントを集め、（数学で言うところの）集合という形式で定義したものと思えば良い。すでに出てきたが、turtles, patches, links もエージェント集合である。エージェント集合を ask 文と一緒に使うことで、プログラミングは非常に効率的に書くことができるだろう。
数学における集合では各要素に順番が規定されていないように、エージェント集合も順番が規定されていない。つまり、リストとは全く異なる概念である。基本的にランダムな順番で構成されていると考えると良いだ
ろう。さらに、それは固定されたものではなく、ask 文を実行するたびに、別のランダムな並びになる。そのため、ask 文でのエージェントの処理は、毎回ランダムとなるのである。
*4 正しくは、エージェント集合と呼ばれる。詳細は B.5.3 節で説明するが、複数のエージェントがリストになったようなものと理解すれば良い。turtles もエージェント集合の 1 つである。

B.5 ask 文とエージェントへの命令

スライド B.10

39

エージェント集合の例

エージェント集合の有用な使い方の例をスライド B.10 に示した。エージェント集合をうまく使えば、NetLogo では非常に簡単にエージェントの処理を記述することができる。例えば、ask 文で処理の対象となっている turtle から相対的に見て、近い位置にある turtle や patch などが容易に取得できるため、それに対する処理が簡単に記述することができるだろう。スライドで示した以外にも、様々な使い方があるので、プログ
ラミングの際にはよく考えて欲しい。
なお、予め決めた順番で ask 文を実行したい時には、エージェントのリストを作成して、foreach 文で処理すれば良い。ただし、foreach 文の内部に ask 文で実行するというやり方になる。

B.5.4 具体的なサンプル
ここでは、ask 文を使った簡単なサンプルを紹介しよう。スライド B.11 は、setup という procedure を作成し、そこから setup-patches と setup-turtles という 2 つの別の procedure を呼び出している。

setup-patches で ask 文を使い、全ての patch について pcolor を green に設定している。このように、角
括弧の中に命令を書くと、その命令が全ての patches に実行される。setup-turtles も同様の処理がなされており、setxy の命令で、turtle の場所を設定し、set color red で turtle の色を赤にセットしている。なお、ここで random-xcor は x 軸上で取れる範囲からランダムで値を取り出す命令で、random-ycor は同様に y 軸からランダムで数値が取り出される。すなわち、ここではこの patch で規定される空間上で、ランダムな場所にセットされるという処理がなされている。

付録 B

40

スライド B.11

NetLogo チュートリアル

ask 文のサンプル

なお、clear-all という命令は全てを初期化するというものであり、patch の場合はデフォルトの初期値に戻されるし、turtle は全て消去される。その他の要素についても、初期化される。setup をする場合は、まず冒頭に clear-all を書くようにしよう。また、setup procedure の最後には reset-ticks 命令があるが、これはシミュレーション内部のカウンタ（シミュレーションのステップ数のようなもの）を初期化する。シミュレー
ションの時間の概念は、ticks という変数に保存されており、tick という命令で 1 つ進める。
このように、ask 文を使い、それぞれのエージェントに命令を与えるようにして、プログラムを作成していく。

B.5.5 エージェントが持つ変数一覧
スライド B.12 に、turtle, patch, link それぞれがデフォルトで持っているエージェント変数を示している。
それぞれ、Properties 以下に示されている部分が、それぞれが持っているエージェント変数である。なお、これらは、inspect というコマンドで出すことができるダイアログウィンドウである。例えば、描画画面で対象の turtle を右クリックすると「inspect turtle 0」が出てくるので、それを選択すれば表示される。patch, linkも同様である。なお、コマンドセンター（詳細は B.11 節を参照）に同様のコマンドを入力しても、同じウィンドウが表示される。
例えば、これまで turtle 番号と呼んでいたものは、who というエージェント変数に格納されており、スライドでは who=0 となっている。また、xcor, ycor がそれぞれ x 座標と y 座標であり、他にも多数のエー

B.6 基本的な構文

41

スライド B.12

エージェント変数

ジェント変数がデフォルトで設定されている。同じように、patch は pxcor, pycor のエージェント変数が座標である。link はどの turtle と繋がっているかという情報をエージェント変数として保持している。なお、

turtles-own 等で定義すれば、それも同様にここに表示される。

B.6

基本的な構文

本節では、よく使う基本的な構文についてまとめる。使い方は、その他の多くのプログラミング言語と基本的な考え方は共通しており、直感的に理解することができるだろう。どのプログラミング言語でも使われる代表的な構文をスライド B.13 に示した。

B.6.1 if/ifelse

if 文は、条件部分が true の時に命令が実行され、false の時には何も実行されない。また、ifelse 文は、
false の場合にも、別の命令を実行することができる。通常のプログラミング言語では、if と else でそれぞれ独立に書くものが多いが、NetLogo では少し異なり、 ifelse の後に、角括弧で囲まれたブロックを 2 つ連続でつなげることに注意が必要である。1 つ目の角括弧のブロックが条件部分が true であった時に処理される命令で、2 つ目の角括弧のブロックが false の時に処理される命令のブロックである。
また、1 つ目の条件を満たさなかった場合に、次の条件をつけ、さらに、その条件が満たされない場合に、そ

付録 B

42

スライド B.13

NetLogo チュートリアル

基本的な構文の次の条件をつけ、· · · というように連鎖させることが可能である。その場合は、「ifelse (条件 1) [ (命令 1) ](条件 2) [ (命令 2) ] (条件 3) [ (命令 3) ] · · · 」のように条件部分と角括弧で囲まれた命令部分を連ねると良い。
加えて、ifelse-value というコマンドを使えば、インラインで ifelse 文を実行することができ、set と併用して使うなど、便利であることも多い。「ifelse-value (条件 1) [ (値 1) ][ (値 2) ]」のように使う。

B.6.2 while

while 文も通常のプログラミング言語とほぼ同じ使い方である。条件部分が true の場合に繰り返され、
false になれば、ループから抜ける。
なお、スライドの使用例で使われている 「any? other turtles-here」は turtle がいる patch 上に他の turtle
が誰かいれば true を返し、誰もいなければ false を返すものである。また、命令部分の right は turtle の向きを指定された角度だけ右周りに向きを変える命令であり、この例ではその直後に random を使っており、ランダムな角度で向きを変えるような命令である。また、fd は forward と同じで、turtle を 1 だけ向いている方向に進めるという命令である。つまり、この例は patch 上に他の turtle が誰もいないところに移動するまでランダムに動き回るというものである。

B.6.3 repeat
上記で説明した基本的な構文に加えて、NetLogo ではいくつか特有の構文が用いられる。代表的なものをス

B.6 基本的な構文

43

スライド B.14

NetLogo 特有の構文

ライド B.14 に示した。repeat 文は while 文と似ているが、条件部分の変わりに数値（整数）を書くところが異なる。数値に書かれた回数だけ繰り返される。

B.6.4 foreachforeach 文は比較的多くのプログラミング言語で使われるが、NetLogo の場合、少し使い方に注意が必要である。foreach の後にリストが来るだけで、while 文や repeat 文と基本的に同じ構造である。しかし、スライド B.14 の右の使用例を見ると分かるように、-> のオペレータを一緒に使う必要がある。角括弧で囲まれたブロック内部の冒頭で、x-> のようなコマンドを書いておかなければならない。ここで、x は任意の変数でよく、そこで指定した変数名が foreach の繰り返しの中で使われる。リストから 1 つずつ取り出した値が、その指定した変数名（この例では x）に入るのである。NetLogo では -> によって実行される処理のことを anonymous

procedure と呼ぶ。
なお、-> は map や n-values のコマンドでも用いられる。

B.6.5 loop

loop 文は while 文の条件部分を外したものである。そのため、角括弧で書かれた命令が永久に繰り返される。このループから出るためには、stop を使う必要がある。

付録 B

44

B.7

NetLogo チュートリアル

procedure の定義

ここでは、procedure について改めて説明する。これまでは、戻り値も無く、引数もとらない形式の例を紹介したが、通常のプログラミング言語と同様に、戻り値を設定したり、引数をとる procedure を作ることができる。

B.7.1 to〜end
これまでに説明した通り、procedure は to と end で囲んで作成し、呼び出すにはインターフェース画面で作成したボタンか、あるいは他の procedure、または、コマンドセンター（詳細は B.11 を参照）から呼び出すことができる。

B.7.2 to-report〜end
通常のプログラミング言語では、関数は return 文などを使って値を返すことが可能である。NetLogo も同様なことが可能であり、その場合は to-report と end で囲み、return ではなく report を使って戻り値を設定する。それ以外は、上記の to と end で定義する procedure と同じである。戻り値がある procedure はreporter procedure と呼ぶ。
B.7.3 引数をとる procedure
引数をとる場合、以下のように後ろに角括弧を付ければ良い。また、複数の引数が必要であれば、角括弧の中に複数の変数を半角スペースで区切って並べれば良い。使い方は、通常のプログラミング言語の引数と同じである。

to my-procedure [argument]
(中身)
end

B.8

その他の要素、よく使う命令など

これまでに説明した以外のその他の重要な要素や、よく使われる命令などについても、本節で補足しておく。

B.8.1 create-turtles, hatch

create-turtles はすでに何度か出てきているが、最も基本的で、必要不可欠な命令である。turtle を作らな
ければ、そもそもシミュレーションをスタートしてもほとんど意味がない場合が多い。
「create-turtles (数値)」という使い方である。数値部分に何体の turtle を作成するか指定する。また、数値の後に角括弧で囲んで命令を書けば、turtle を作成したと同時に、その turtle に一緒に命令を出すことができる。

hatch は、turtle から新しく別の turtle を生み出す命令である。新しい turtle は親から位置を含むすべての変数値を受け継ぐ。使い方は、create-turtles と基本的に同じである。turtle から生み出すので、turtle に命令する ask 文の中で使うのが通常である。

B.8 その他の要素、よく使う命令など
B.8.2 random
プログラミングを行う上で、乱数は必要不可欠なものである。NetLogo でも乱数はよく用いられる。
「random (数値)」という使い方で良い。数値の部分に設定した値を含まず、0 からそれ未満の整数値がランダ
ムで返される。また、小数値のランダムな値が欲しい場合は、「random-ﬂoat (数値)」を用いれば良い。0 以上で指定した数値未満のランダムな浮動小数点数を返す。

B.8.3 周辺の patch を取得する命令など
すでに述べたように、NetLogo は ask 文 を使って turtle や patch にそれぞれ命令を出すことが特徴である。そのため、turtle や patch の視点から見て相対的な位置関係で処理をすることが便利な場合が多い。そのような場合に有用なものが、neighbors4 と neighbors である。

neighbors4 は対象となっている patch から見て、上下左右の 4 個の patch を集めたエージェント集合を返す命令である。すなわち、ノイマン近傍の patch を返す。neighbors は、対象となっている patch から見て、その周りにある 8 個の patch を集めたエージェント集合を返すものである。つまり、こちらはムーア近傍のpatch となる。
また、上記以外にも in-radius は「(エージェント集合) in-radius (数値)」のように使い、指定したエージェ
ント集合のうちで、対象の patch から数値で指定した距離以下にある patch からなるエージェント集合を返す。これは、patch だけではなく、turtle でも同様に使うことができる。その場合、対象のタートルから指定された距離以下にある turtle を集めたエージェント集合を返す。

patch-here もよく使う命令である。これは、対象となっている turtle がいる patch を返す命令である。わざわざ、座標を取得しなくても、turtle がいる patch をそのままダイレクトに取得できるので便利である。

patch-at は、「patch-at (x 座標) (y 座標)」という使い方で、対象の turtle から見て、(x 座標, y 座標) の位
置にある patch を返す。相対座標で指定するので、turtle に命令する ask 文の中で使用する際に役に立つ。

B.8.4 any?

any? もよく使う命令である。これは、エージェント集合が空でなければ true を返し、空ならば false を返す。ある patch に turtle が存在するかどうか、といった場合に使うのが典型的な使い方である。また、次節で説明する with と合わせて使えば、エージェント集合のうちで、条件を満たすものがいるかどうかという判断にも使えるため便利である。

B.8.5 with, ofwith は「(エージェント集合) with (条件)」のように使い、指定したエージェント集合のうちで、条件部を満たすものだけを返す。当然、複数のエージェントが条件を満たすことがあるので、返る値もエージェント集合となる。例えば、「patches with [pcolor = red]」のように書けば、赤色の patch だけを集めたエージェン
ト集合を返す。
一方、of は全く異なる概念で、エージェントが持っている変数（エージェント変数）の値を返すものであり、「(変数名) of (エージェント)」のように使う。例えば、「 [pcolor] of patch 3 5」とすれば、座標 (3,5) にある

patch の pcolor の値を返すことができる。なお、of のあとのエージェント部分をエージェント集合にすることも可能で、その場合には、各エージェントが持つ指定された変数の値のリスト（ランダム順）を返す。

45

付録 B

46

NetLogo チュートリアル

B.8.6 max-one-of, min-one-of, one-of, other などの命令

max-one-of は「max-one-of (エージェント集合) [ (変数) ]」のように使い、変数の値が最も大きいエー
ジェントのうちで 1 つをランダムに返す。同様に、min-one-of は最小のエージェントを 1 つ返す。one-of は「one-of (エージェント集合)」のように使い、エージェント集合の中からランダムで 1 つのエージェントを返すものである。other は「other (エージェント集合)」のように使い、対象となっているエージェント自身を除いた他のエージェント集合を返す。

B.8.7 stop
対象となっているエージェントが、procedure、ask などのブロックから抜け出す。そのエージェントが、囲まれた procedure もしくはブロックを停止するだけであり、他のエージェントの実行を全て止める訳ではないことに注意すること。
また、フォーエバーオプションを使って無限ループで go procedure を実行している場合でも、stop を使ってシミュレーションを停止することも可能である。ある条件を満たした時に stop で go procedure を抜けるようにしておけば良い。

B.9

インタフェース画面での変数の設定

インターフェース画面で、変数の設定を変えられるようにしておけば、シミュレーションの実行において、わざわざソース上で変数を書き替えなくて良いので便利である。
よく使う方法がスライダーを使う方法である。スライド B.15 に示しているように、スライドバーで変数を自由に設定できる。作り方は、追加のところで「スライダー」を選択し、好きな場所でクリックすれば、そこにスライダーが作成される。スライドで示したように、クリックの直後にダイアログボックスが表示され、グ
ローバル変数のところに変数名を設定し、取りうる最小値や最大値などを入力し、OK を押せば良い。なお、
ここで入力したグローバル変数は、ソースコード内で改めて定義する必要はなく、そのまま使うことができる。
同様にして、チューザーを追加すれば、予め設定した選択肢から変数等を選択するという方法も利用できる。
また、入力ボックスで、そのまま変数に値を入力できるインプットボックスも作ることができきる。他にもいくつか便利なある。詳細については NetLogo のサイト等を参照して欲しい。

B.10

グラフの描画

NetLogo では、グラフを描画させることも容易である。スライド B.16 にグラフの作成の仕方の例を示した。スライドで示しているように、追加の部分でプロットを選択し、好きなところでクリックすれば、そこにグラフが作成される。何の値をプロットするのかは、「プロットペン」の部分で、必要な命令を記述する必要がある。スライドの例では、生存する全ての turtle の数と、patch のうちで緑色をしたものの数を同時に 1 つのグラフにプロットしている例である。
このグラフは、シミュレーションの実行に合わせて、リアルタイムでグラフの描画がなされるため、適切にプロットを追加すれば、実行過程でどのような変化が起こっているかを容易に確認できるだろう。

B.10 グラフの描画

47

スライド B.15

スライダー

スライド B.16

グラフの描画

付録 B

48

B.11

NetLogo チュートリアル

コマンドセンター

NetLogo にはコマンドセンターと呼ばれる仕組みが用意されている。インターフェース画面の下部に、スライド B.17 に示すように、入力可能な部分がある。それがコマンドセンターである。この部分で、コマンドを入力すれば、命令を直接エージェントに送ることができる。
例えば、コマンドセンターに「ask patches [set pcolor green]」と入力してエンターキーを押せば、全てのpatch を緑色に変えることができる。これは、シミュレーションの実行中でも命令を送ることができる。上記の例であれば、リアルタイムで patch の色が変わる。ask patches とわざわざ書かなくても、observer> の部
分をクリックすれば、patches, turtles, links を選択できるので、そこで patches を選択すれば、入力欄に「setpcolor green」とだけ入力すれば良い。ask で指定する対象のエージェント集合を、その部分で指定できるのである。
また、スライドで書いているように、turtle を右クリックして、inspect turtle (番号) を選択すれば、左下のようなウィンドウが得られるが、この下部も同様にコマンドセンターである。ただし、この場合は、この

turtle のみに対して命令を送ることができる。patch や link についても同様で、inspect で得られたウィンド
ウで、それぞれのコマンドセンターがついているので、その場で画面を見ながら直接命令を送れるので、有用である。

スライド B.17

コマンドセンター

B.12 その他

49
そ

B.12

の

他

B.12.1 turtle の形状

turtle の形状は shape 変数で定義されており、set コマンドを使用することによって変更することができる。
例えば、以下のように記述すれば、turtle は人型の形状になる。

ask turtles [set shape "person"]
デフォルトで定義されている形状の一覧は以下の通りである。また、自身で作成した独自の形状にすることも可能である。詳細は、NetLogo のサイトを参照して欲しい。

default, airplane, arrow, box, bug, butterﬂy, car, circle, circle 2, cow, cylinder, dot,
face happy, face neutral, face sad, ﬁsh, ﬂag, ﬂower, house, leaf, line, line half, pentagon, person, plant, sheep, square, square 2, star, target, tree, triangle, triangle 2,
truck, turtle, wheel, x
B.12.2 演算子の優先順位
通常のプログラミング言語と同様に演算子の優先順位が決められている。いくつかは NetLogo 特有の演算子もあるので、優先順位はしっかり覚えておくと良いだろう。優先順位は高い順に以下の通りとなる。

• with, at-points, in-radius, in-cone• その他すべてのプリミティブとユーザー定義の procedure• ^• *, /, mod• +, • <, >, <=, >=• =, !=• and, or, xor
B.12.3 コメントアウト
ソースコード内でコメントアウトをしたい場合は、; (セミコロン) を使えば良い。

B.12.4 色 の 設 定
以下の 16 種類の色はあらかじめ定義されており、これらの名称はプログラムの中ではそのまま使える。

gray, red, orange, brown, yellow, green, lime, turquoise, cyan, sky, blue, violet,
magenta, pink
また、色は数値で設定することが可能であり、スライド B.18 に示しているような対応関係がある。

付録 B

50

スライド B.18

NetLogo チュートリアル

色の設定

B.12.5 ビ ュ ー の 更 新
ビューの更新には、「ティックごと」と「連続更新」を選択することができる。NetLogo では「ティック」と呼ばれる離散的なステップで時刻がカウントされている。そのティック毎に更新するのが、「ティックごと」の更新方法である。例えば、セルオートマトンなどのシミュレーションでは、同期をとって一斉に全てのセルを更新したい。そのような場合には、「ティックごと」の更新が有効である。
作成するシミュレーションの特性に応じて、適切に選択すれば良い。

B.13

マニュアル等の有用な情報源

本節でのチュートリアルは、基本的な部分に焦点を絞って説明した。その他、多様な機能を備えており、他にも有用なコマンドや構文があったり、機能拡張なども可能である。より深く学びたい読者は、NetLogo のサイトを参照して欲しい。マニュアル等も充実しており、有用は情報が入手可能である。URL は
https://ccl.northwestern.edu/netlogo/docs/ である。
また、NetLogo のサイトは英語であるが、筑波大学の倉橋先生のご尽力により、日本語化された情報が以下の URL に掲載されている。URL は http://www.u.tsukuba.ac.jp/ kurahashi.setsuya.gf/NetLogo-ja/ である。こちらも適宜参照すると良いだろう。