今日は、有澤 著『モデルシミュレーション技法』(共立出版、1997年)に記載されている「囚人のディレンマ」をC言語を利用してシミュレーションしました。
「囚人のディレンマ」はとても著名なゲーム理論の一つで非ゼロ和ゲームに分類されるものだそうです。自分と相手のとる行動によって得られるポイントを以下の通りとします。
この「囚人のディレンマ」ゲームを20回実行するプログラムをC言語で書いてみました。相手の行動はランダムに決定します。
作成したCプログラムソースは以下の通りです。インデントが有効になっていないので見辛いです。
//Prisoners' Dilemma
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define REPETITION 20
main()
{
int intI;
int intAction, intCompAction; //行動
int intPoint; //得点
intPoint=0;
srand(time(NULL));
printf("「囚人のディレンマ」シミュレーションn");
for(intI=1;intI<=REPETITION;intI++){
//あなたの手を決めます
do{
printf("n");
printf("%d回目 : あなたは罪を自白しますか、黙秘しますか。",intI);
printf("1:白状、2:黙秘 ");
scanf("%d",&intAction);
if(intAction<=0||intAction>2)
printf("正しい数字(1または2)を入力してください。n");
}while(intAction<=0||intAction>2);
//相手の手をランダムに決定します
intCompAction=(int)(rand()*2.0/(1.0+RAND_MAX))+1;
if(intAction==1){
if(intCompAction==1){ //両方とも自白した場合
printf("相手も自白しました。得点は1点です。n");
intPoint+=1;
}else{ //プレーヤーのみ自白した場合
printf("相手は黙秘しました。得点は5点です。n");
intPoint+=5;
}
}else{
if(intCompAction==1){ //相手が自白した場合
printf("相手が自白しました。得点は0点です。n");
}else{ //両方とも黙秘した場合
printf("相手も黙秘しました。得点は3点です。n");
intPoint+=3;
}
}
printf("得点は%d点です。n",intPoint);
}
return 0;
}
このプログラムをさらに改変して、自動的に実行するようにしてシミュレーションしました。自分の行動を選ぶ基準を以下の4通りにして、10000回実行しました。
1 : 自白しつづける
2 : 黙秘しつづける
3 : しっぺ返し戦略(Tit-for-Tat)
4 : パブロフ戦略
その結果、以下のような点数になりました。
1 : 自分29892点、相手5027点
2 : 自分14889点、相手40074点
3 : 自分22477点、相手22477点
4 : 自分22644点、相手22389点
他にも色々な戦略の組合わせが考えられそうです。