囚人のジレンマやってみた
「進化ゲーム理論と遺伝的アルゴリズム」を買った。
ExcelのVBAとかでプレイヤーを定義してシミュレートしているもの。
前から、興味あったので、買って、入れてみたけど、OpenOfficeだったのよねぇ。やろうと思ったけど・・・・。
実は、2プレイヤーじゃなくってもう少し拡張してみたいのでいっそのことJavaで組んでみる。
とりあえず4種類のプレイヤーまで実装。勝ち負けだけじゃなくって、総和(たぶん市場規模になるんだろうなぁ)も出してみる。
コスト表として
Aは協調 | Aは裏切り | |
Bは協調 | 6,6 | 0,8 |
Bは裏切り | 8,0 | 2,2 |
を使う。
- お互い協調したら、双方6の儲け。
- Aが協調でBが裏切ったら、Bが8の一人がち。
- Bが協調でAが裏切ったら、Aが8の一人がち。
- A,Bともに裏切ったら、双方2の儲け。
ってな感じで読む
プレイヤーは
- All_Cさん、いつも協調路線。
- All_Dさん、裏切り大好き。
- randomさん、何も考えてまっしぇーん。
- TFTさん、普段はニコニコ、協調路線。でも、裏切られたら、報復。相手が判定したら許してあげる。
んで、1000回ほど対戦(もとい、商売)したら・・・
All_C | All_D | Random | TFT | Score | 相手 | Total | |||||||||
All_C | 6.0 | 6.0 | 12000 | 0.0 | 8.0 | 8000 | 2.916 | 7.028 | 9944 | 6.0 | 6.0 | 12000 | 14.92 | 27.3 | 41944 |
All_D | 8.0 | 0.0 | 8000 | 2.0 | 2.0 | 4000 | 5.126 | 0.958 | 6084 | 2.006 | 1.998 | 4004 | 17.13 | 4.96 | 22088 |
Random | 7.0 | 3.0 | 10000 | 0.924 | 5.228 | 6152 | 4.068 | 4.18 | 8248 | 3.99 | 3.982 | 7972 | 15.98 | 16.39 | 32372 |
TFT | 6.0 | 6.0 | 12000 | 1.998 | 2.006 | 4004 | 3.944 | 3.944 | 7888 | 6.0 | 6.0 | 12000 | 17.94 | 17.95 | 35892 |
各マス3つあって、1つ目が、Aの利益の平均、二つ目がBの利益の平均、三つ目が双方の利益の和。
うーん。お互いに協調して商売すると儲かるのねぇ。でも、疑心暗鬼で選択できないのかぁ。悲しいねぇ。
この4つのプレイヤーだったら、ランダムでもそこそこ、ってのが笑えるねぇ。
All_Dさんの、いつも裏切って勝ちを急ぐ人は・・・だめなのね。
合計でみると、協調だと、自分の利益は低いけど、市場全体(この場合、相手かぁ)が最大ですねぇ。
TFT(裏切りに対しては報復)は市場もそこそこ成長して自分も成長、WinWinになるのかぁ。正直なだけではだめなのねぇ。
それぞれの組み合わせでの利益については、WikiPdiaの¥ナッシュ均衡」みたいに、一定の条件があるみたい。
実装でのプレイヤーは、
public interface Player extends Common { public String getName(); public void initialize(); public void setYourResult(Action b); public Action execute(); }
ってなインターフェースを持っているから、適当に作れる。
状況把握として、getYourResult()ってのをTFT用に入れたけど、よく考えてみたら、歴史を持っているほうが自然だなぁ。リファクタリングですな。