ボランティアについてのゲーム理論的なモデル
環境保護などを想定したボランティアについてゲーム理論的なモデルを考え、所得税からNPOを支援するような「協力」の必要性を考える。
ゲーム理論の枠組の他に人工経済的なモデルも作り、競争によって高い全体効用から低い全体効用に滑り落ちる「囚人のジレンマ」的な状況が、ゲーム理論では説明できないが、シミュレーションではそのようになりうる例を示す。
なお、本稿は、(ほぼ)「ボランティア・ジレンマ」とは関係がない。
■ |
はじめに
|
お金を稼がねばならない。でも、その方法がわからない。人に役に立つことをすれば、自然にお金が恵ってくる。人に役に立つことをしようとするべきだ。…本当にそうだろうか?
環境保護などのボランティアについて、自然にそこに人が集まるようになるだろうか。むしろ自然にはボランティアをする人がいるほうがいいとわかっていても、儲からないため人が集まらず、社会の全体的な効用が本来達成できるレベルに行かないことのほうが多いのではないか。
それを所得税からNPOを支援するような「協力」…税からの再分配が解決できるのではないか。
■ |
ゲーム理論からのアプローチ
|
本来達成できるはずの効用が達成できないというジレンマ的な状況を分析するツールと言えばゲーム理論である。
示したいのはだいたい次のようなことである。
|
これが無矛盾でありうることを示すための数値例を考える。
直感的に次のような数値例を考えた。
|
これを確認するのに、Python のナッシュ均衡解答パッケージの Nashpy を使う。だいたい次のようなソースを書き…、(「(…)」 は省略記号。)
import nashpy as nash import numpy as np (…) A = np.array([[2, 4], [2, 1]]) B = np.array([[2, 2], [4, 1]]) G = nash.Game(A, B) equilibria = G.support_enumeration() for eq in equilibria: print(eq, np.sum(G[eq]))
実行すると、だいたい次のような出力が得られる。
$ python volunteer_game_1.py Q1 (array([1., 0.]), array([1., 0.])) 4.0 (array([1., 0.]), array([0., 1.])) 6.0 (array([0., 1.]), array([1., 0.])) 6.0 (…)
これを解釈すると、Q1 は、ボランティアを両方がする場合も、片方のみボランティアの場合もナッシュ均衡になる。効用が小さい両方が仕事をするという場合は選択されることがない。…ということで Q0 の例としては適当ではないことがわかる。
(以降はプログラムを示さないが、ゲーム理論を使っているところは、 volunteer_game_1.py でまとめて計算した結果を用いている。また、混合戦略解については無視して論を進める。)
ここからいじっていろいろ試したところ、次のようにすればよいことがわかった。
|
Q2 は、両方仕事をする場合のみナッシュ均衡となる。
|
Q3 は、片方が仕事をし、片方がボランティアをするのが(あと、0.5 ずつランダムに行う混合戦略が)ナッシュ均衡になる。Q4 も、片方が仕事をし、片方がボランティアをするのが(あと混合戦略が)ナッシュ均衡になる。
Q2 と Q4 (Q3)は、Q0 の数値例として適当なようだ。ただ、Q3 と Q4 は、仕事をした側が半分以上をボランティアに渡すわけで現実的ではないかもしれないが。
■ |
人工経済モデル
|
Q4 はどちらが仕事をするかで二つの均衡解が存在し、現実でいきなりはじめたときにどちらが選択されるかはわからない。二人ではなくもっとたくさんいる場合に、得をするよう少しずつ選択が行われていったとき、平衡に致るようなモデルも考えられる。
そういった「人工経済」的モデルを試してみる。
仕様は次のようにする。
|
この仕様に基づき、実際に作ったプログラムが volunteer_game_2.py である。ただし、「(ボランティアの効用 - 仕事の効用) の大きさに応じて、戦略を変える人数が変わるとする。」とする部分は、変えた。効用が大きい方の比率を増やしながら行う二分探索にした。そのほうが結果的に効率的に思えたから。最初は二分探索を使わず「大きさに応じて」というのを愚直に実装していたが、いろいろな例を試していて収束がうまくいかないことがあり、その都度、動かす幅を指定したりしていたが、それが面倒だった。
実行すると、次のようになる。
$ python volunteer_game_2.py Step 1 workers:volunteers : 858 : 142 utility of workers:volunteers : 1.289833721833722 : 8.291004694835681 gross utility : 2284.0 (…) Step 10 workers:volunteers : 500.0 : 500.0 utility of workers:volunteers : 3.0 : 3.0 gross utility : 3000.0
workers と volunteers はそれぞれ仕事をする人とボランティアをする人の数。 utility of workers:volunteers は、それぞれの効用。gross utility は全体効用(効用を足し合わせたもの)。workers と volunteers の初期値はランダムに選んでいる(--init-fluid-workers で指定することも可能)。
なお、workers も volunteers も 0 人になると、評価が難しくなるので、最低限、1人は含まれるようにしている。
上のように Q4 に相当する人口経済では、workers:volunteers が 500 人ずつで釣り合う。
これに対し、Q2 に対応する状況は --tax=0 を指定することで試せる。
$ apython volunteer_game_2.py --tax=0 Step 1 workers:volunteers : 796 : 204 utility of workers:volunteers : 3.0722814070351756 : -0.18400000000000005 gross utility : 2407.9999999999995 (…) Step 9 workers:volunteers : 999.0 : 1.0 utility of workers:volunteers : 2.005001001001001 : -0.996 gross utility : 2002.0
まず、最後の結果に着目すると、ボランティア固定の一人を除いてすべての人が仕事を選択するのがわかる。Step 1 の gross utility と比較すればわかるように全体効用はそれにより下がるにもかかわらず…である。
競争によって高い全体効用から低い全体効用に滑り落ちる「囚人のジレンマ」的な状況が、人工経済的モデルでも確認できた。
さて、volunteer_game_2.py を Q1 的状況に対応するようにも拡張できる。それは次のようにオプションを指定すればいい。
$ python volunteer_game_2.py --max-labor-per-volunteer=1.0 \ --basic-reward-per-worker=0.0 --tax=0 Step 1 workers:volunteers : 341 : 659 utility of workers:volunteers : 4.932551319648094 : 2.0 gross utility : 3000.0 (…) Step 11 workers:volunteers : 999.0 : 1.0 utility of workers:volunteers : 1.005001001001001 : 0.004 gross utility : 1004.0000000000001
Q1 的状況でも、--tax=0 なら、すべてが仕事をするようになる。これはゲーム理論とは答えが違う。が、Q1 を作った私の直感はこうなるとむしろ正しかったと言える。
Q1 に関して税を取ることを考える。
|
Q5 は、片方が仕事をし、片方がボランティアをするのが(あと混合戦略が)ナッシュ均衡になる。
Q5 的状況を人工経済モデルで試してみる。
$ python volunteer_game_2.py --max-labor-per-volunteer=1.0 \ --basic-reward-per-worker=0.0 --tax=0.5 Step 1 workers:volunteers : 113 : 887 utility of workers:volunteers : 6.424778761061947 : 2.5636978579481395 gross utility : 2999.9999999999995 (…) Step 10 workers:volunteers : 500.0 : 500.0 utility of workers:volunteers : 3.0 : 3.0 gross utility : 3000.0
ゲーム理論と同じく、片方がボランティア、片方が仕事というふうに人数的にはっきりわかれる。
Q1 的状況設定でも Q0 に相当することが言えたとできる。
税率(tax)と全体効用(gross utility)のグラフをサンプル数は tax=[0.0, 0.1, 1/3, 0.5, 2/3, 0.9, 1.0] と少ないものの描いてみる。
グラフを見ると、tax がある程度高くなれば、それ以降、最大効用が達成されることがわかる。つまり乱暴に tax を増やせばとにかく最大効用にはなるというのが示唆になるかもしれない。ただ、一人あたりの所得がどこまでも増えるという仮定があるため、それをなくせばまた違った結果(ほどほどの tax が最大効用)になるだろう。
■ |
結論
|
Q0「一人が環境保護などのボランティアをすると、両者にプラスの効用がある。もう一人はその間仕事ができる。二人が仕事をしても両者のプラスは限られるが、一方だけが仕事をすると高い報酬が得られる。このとき、仕事をした側がボランティアに報酬から金を払うことで、双方もっとも高い効用が得られるだろう。」ということを確認するために、一つはゲーム理論的なモデルを作り、もう一つは、人工経済的なモデルを作った。そして、両モデルで確認できた。
非協力的な状況設定で、税を通じた「協力」の必要を示せたと思う。
さらに、ゲーム理論的なモデルでは Q0 を説明できないと見える直感的に作った Q1 のモデルについても、それに相当する人工経済的なモデルでは Q0 を説明しうることが示せた。
ゲーム理論をよく複数の場合に単純に拡張して論じることがあるが、今回の結果をみるとそれは少しおかしいのではないか?…と感じる。競争によって高い全体効用から低い全体効用に滑り落ちることを「囚人のジレンマ」的な状況と言って、ゲーム理論を参照すべき示唆がなされうるが、むしろ、それを示すのはゲーム理論のほうが難しいというのが本稿の実験が示唆するところであった。
■ |
参考
|
Python や Nashpy についてググっていろいろ参考にしているが、それについては割愛する。また、過去に読んだ経済学・数学・工学の書籍にもよるところが大きいだろうが、それも割愛する。それらにはとても感謝している。
|
■ |
ライセンス
|
パブリックドメイン。 (数式のような小さなプログラムなので。)
自由に改変・公開してください。
■ |
配布物
|
今回の配布物は以下の zip ファイル。更新があれば下のリンクの中身は最新のものに置き変わっているはず。volunteer_game_1.py と voklunteer_game_2.py とドキュメント等が入っている。
更新: | 2020-03-02 |
初公開: | 2020年03月02日 06:26:29 |
最新版: | 2020年03月02日 06:26:29 |
2020-03-02 06:26:38 (JST) in 経済学 | 固定リンク | コメント (2)
コメント
初公開: volunteer_game-20200302.zip。バージョン 0.0.1。
《volunteer_game-20200302.zip》
https://www.sugarsync.com/pf/D252372_79_7154804952
↓に感想を書いたのでよろしければそちらもご参照ください。
[cocolog:91719427]
http://jrf.cocolog-nifty.com/statuses/2020/03/post-23e291.html
>環境保護などを想定したボランティアについてゲーム理論的なモデルを考え、所得税からNPOを支援するような「協力」の必要性を考えた。ゲーム理論の「御用学問」性を疑う。<
投稿: JRF | 2020-03-02 06:36:16 (JST)
ここには書いていませんでしたが、↓にもソースがあります。
《GitHub - JRF-2018/volunteer_game: ボランティアについてのゲーム理論的なモデル》
https://github.com/JRF-2018/volunteer_game
投稿: JRF | 2024-07-12 00:29:15 (JST)