囚人のジレンマやってみた

「進化ゲーム理論遺伝的アルゴリズム」を買った。
ExcelVBAとかでプレイヤーを定義してシミュレートしているもの。
前から、興味あったので、買って、入れてみたけど、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用に入れたけど、よく考えてみたら、歴史を持っているほうが自然だなぁ。リファクタリングですな。