公共財ゲーム

続いて,単純な公共財ゲーム作成しましょう.公共財ゲームとは,経済学における古典的なゲームの1つです.

ここでは初期保有額が100ポイントであり,3人プレイヤーのゲームであるとします.各プレイヤーは独立して,手持ちのポイントをグループに貢献するのかを決めます.各プレイヤーの貢献額を2倍したものを3人に平等に分配します.

公共財ゲームのすべてのコードはコチラにあります.

以下の9つのセットアップを行っていきます.

  • アップグレード

  • アプリケーションの作成

  • model.pyの定義

  • templateの定義

  • views.pyの定義

  • settings.pyでのsession configの定義

  • データベースをリセットして再起動

  • サーバを動かしている間の変更

  • ボットの作成

    それではやっていきましょう.

アップグレード 最新バージョンのoTreeを使うために,コマンドラインを開いて,以下のコードを実行しましょう

pip3 install -U otree-core
#再度インストールします.

otree resetdb
#インストールをした際にはデータベースをリセットしましょう.

アプリケーションの作成

cdコマンドを使って,"requirements_base.txt"のある,あなたが作ったoTreeプロジェクトフォルダに移動してください.

このディレクトリの中に,公共財ゲーム用のディレクトリを作ってあげます.

otree startapp my_public_goods

これによってoTreeプロジェクトフォルダの中に"my_public_goods"というフォルダができたことを確認してください.

model.pyの定義

"model.py"ファイルを開きます.このファイルにはプレイヤー,グループ,サブセッションなどのゲームに関連するモデルとパラメータなどを定義します.

はじめに,公共財ゲームにあわせて,すべてのプレイヤーがすべてのゲームで同様のパラメータになるようにConstantsクラスを修正します.

1つのグループにつき,3人のプレイヤーが必要です.したがって,"players_per_group"を3に変更します.oTreeでは自動的にプレイヤーを3人グループに分けてくれます. 各プレイヤーの初期保有額は100ポイントです.したがって,"endowment"を"c(100)"として定義します.("c()"は金額を示しています.) それぞれの貢献額は2倍にします.したがって,multiplierを2にセットします. そうすると,以下のようなコードが用意できます.

ただし,Pythonは大文字と小文字を区別します.したがって,大文字を使うときは気をつけてください.また,インデントも適切に用いてください.例えばif,for,defなどのコードブロック内にあるとき.4つのスペースをインデントする必要があります.

続いて,このゲームで重要な点であるプレイヤーとグループについて検討します.

ゲームを実施した後,各プレイヤーにはどのようなデータが必要でしょうか?重要なのはどのプレイヤーがいくら貢献したかです.したがって,通貨を示す"contribution"フィールドを定義しましょう.

各グループについて記録を残すとき,どのようなデータに興味があるのでしょうか?もしかしたら,全てのプレイヤーの貢献額(total contribution)に興味があるかもしれません.そして貢献額に基づいて算出された金額(individual share)が各プレイヤーに分配されます.したがって,これらの2つを定義します.

それでは,利得の計算式や,関連する数値を計算します.ここでは"set_payoffs"と呼びましょう.

templateの定義

このゲームでは2つのページを用意します.

ページ1:プレイヤーはいくら貢献するか決定します. ページ2:プレイヤーは結果を伝えられます. このセクションではゲームを表示するためにHTMLテンプレートを定義します.はじめに,"templates/my_public_goods/"ディレクトリ内に2つのHTMLファイルを作成しましょう.

1つは"Contribute.html"です.これはゲームの単純な説明と,プレイヤーが貢献額を入力するフォームフィールドを用意します.

ちなみに,Pycharmを使って"

"と移動的に入力されます.そして,その間に何を打つべきかサジェッションが表示されます.

そして,もう1つのテンプレートは"Result.html"です.

views.pyの定義

続いて,viewファイルを定義します.これはHTMLテンプレートを表示する方法を示しているものです.

ここでは2つのテンプレートを用意したので,"views.py"の中に2つの"Page"クラスを用意する必要があります.

最初に,"Contribute"を定義します.このページは入力フォームを含んでいるので,"form_model"と"form_fields"を定義する必要があります.特に,このフォームは各プレイヤーの"contribution"フィールドを含んでいる必要があります.

続いて,"Results"を定義します.このページにはフォームはありません.したがって,何もクラスを定義しません.このような場合は"pass"を使います.

これでほとんどできましたが,最後にもう1ページ必要です.プレイヤーが貢献額を決めた後,すぐに結果を知ることはできません.他のプレイヤーが貢献額を決めるのを待つ必要があります.そのために,"WaitPage"という待機画面のページを追加します.

プレイヤーが待機画面にたどり着いた時,他のプレイヤーが待機画面にたどり着くのを待つ必要があります.そして,次ぐのページに進むことになります.

最初に"self.group.set_payoffs()"と記入します.なぜならば,先程,利得の計算方法を"set_payoffs"として定義しました.そしてその方法は"Group"クラスの中にあります.これが最初に"self.group"と書く理由です.

そして,"page_sequence"でページ遷移の順番を並べ替えます.

settings.pyでのsession configの定義

最後に,このプロジェクトのルートディレクトリにある,settings.pyを定義します.SESSION_CONFIGSの中に以下の内容を追記します.

実験室実験では,実験の後に調査で終わるのが慣例です.そして,そのためにいくらを実験参加者に渡すか示す必要があります.そこで,「実験後調査」と「支払情報」のアプリケーションを"app_sequence"(アプリケーション遷移)に追加する必要があります.

データベースをリセットして再起動

コマンドラインに以下の通り入力してデータベースをリセットします.

起動したら,http://127.0.0.1:8000にアクセスしてください.

print()を使ったトラブルシューティング

もしコードが適切に動いていなそうであれば,"print()"を使ってPythonプログラムのデバッグをすることができます.ここでは,printを"set_payoffs"の中に追記します.

アウトプットは"otree runserver"を走らせているコンソールに表示されます.ブラウザには表示されません.

サーバを動かしている間の変更

一度サーバを動かし始めたら,"Contribution.html",もしくは"Results.html"を変更してみてください.そして,保存をしてからページを読み込み直してください.変更が即座に反映されます.

ボットの作成

最後に,今作った実験をシミュレーションするボットを作成しましょう.ボットを作るとタスクを減らすことができます.なぜならば,ゲームに変更があった際に,しっかりと動くかどうか確認することができるからです.

はじめに,"test.py"に移動して,以下のコードを"PlayerBot"クラスに追記してください.

コマンドラインでは,以下のコードを入力しましょう.

そして,コマンドラインで実行した結果を確認することができます.ブラウザ上でボットを動かす場合には,"settings.py"に移動して,"'use_browser_bots': True"とSESSION CONFIGに入力してください.

こんな感じです.

これで新たなセッションを始めた時,自動的に始めることができます.

....長っ!!

でも,この調子で書き進めよう.

今,WordPressで書いているけどこれで良いのかしら?Qiitaとかの方が..とも思ったりします..

本家本元のURL(このページを翻訳+αをしています):

http://otree.readthedocs.io/en/latest/tutorial/part1.html

Last updated

Was this helpful?