/* 2\times 2 対称2人ゲームにおけるNash均衡の導出。 利得表を与え、Nash均衡を導出する。 ->戦略1と戦略2の利得の差を考え、その正負で導出。 G 1: Non-Dilemma 3: Prisoner's Dilemma 3: Coordination 4: Hark-Dove */ #include#include /* payoff matrix*/ #define a1 3 #define a2 1 #define a3 2 #define a4 3 main() { int g; if (a1-a2>=0){ if (a4-a3<=0){ g=1; } else { g=3; } } if (a1-a2<=0){ if (a4-a3<=0){ g=4; } else { g=2; } } printf("Game Type=%d\n",g); switch (g) { case 1: printf("This Game is Non-Dilemma Game Type\n"); printf("Nash Equilibrium=(Strategy 1, Strategy 1)\n"); break; case 2: printf("This Game is Prisoner's Dilemma Game Type\n"); printf("Nash Equilibrium=(Strategy 2, Strategy 2)\n"); break; case 3: printf("This Game is Coordination Game Type\n"); printf("Nash Equilibria=(Strategy 1, Strategy 1) and (Strategy 2, Strategy 2)\n"); break; case 4: printf("This Game is Hawk-Dove Game Type\n"); printf("Nash Equilibrium=Mixed Strategy\n"); break; } return 0; }
/* 2\times 2 非対称2人ゲームにおけるNash均衡の導出。 利得表を与え、Nash均衡を導出する。 */ #include#include /* payoff matrix for player 1*/ #define a1 3 #define a2 1 #define a3 2 #define a4 0 /* payoff matrix for player 2*/ #define b1 3 #define b2 1 #define b3 2 #define b4 0 main() { int G,g11,g12,g21,g22; /*for player 1*/ if (a1-a2>=0){ g11=1; } else { g11=2; } if (a4-a3>=0){ g12=1; } else { g12=2; } /*for player 2*/ if (b1-b2>=0){ g21=1; } else { g21=2; } if (b4-b3>=0){ g22=1; } else { g22=2; } /*Classification*/ if(g11==1 && g12==1 && g21==1 && g22==1){ G=1; } if(g11==1 && g12==2 && g21==1 && g22==1){ G=2; } if(g11==2 && g12==1 && g21==1 && g22==1){ G=3; } if(g11==2 && g12==2 && g21==1 && g22==1){ G=4; } if(g11==1 && g12==1 && g21==2 && g22==1){ G=3; } if(g11==1 && g12==2 && g21==2 && g22==1){ G=4; } if(g11==2 && g12==1 && g21==2 && g22==1){ G=5; } if(g11==2 && g12==2 && g21==2 && g22==1){ G=6; } if(g11==1 && g12==1 && g21==1 && g22==2){ G=2; } if(g11==1 && g12==2 && g21==1 && g22==2){ G=7; } if(g11==2 && g12==1 && g21==1 && g22==2){ G=4; } if(g11==2 && g12==2 && g21==1 && g22==2){ G=8; } if(g11==1 && g12==1 && g21==2 && g22==2){ G=4; } if(g11==1 && g12==2 && g21==2 && g22==2){ G=8; } if(g11==2 && g12==1 && g21==2 && g22==2){ G=6; } if(g11==2 && g12==2 && g21==2 && g22==2){ G=9; } printf("Game Type=%d\n",G); switch (G) { case 1: printf("This Game is Coordination Game Type\n"); printf("Nash Equilibrium=(Strategy 1, Strategy 1),(Strategy 2, Strategy 2)\n"); break; case 2: printf("This Game is Non-Dilemma Game Type\n"); printf("Nash Equilibrium=(Strategy 1, Strategy 1)\n"); break; case 3: printf("This Game is Prisoner's Dilemma Game Type\n"); printf("Nash Equilibria=(Strategy 2, Strategy 2)\n"); break; case 4: printf("Nash Equilibrium=Mixed Strategy\n"); break; case 5: printf("Nash Equilibria=(Strategy 2, Strategy 1) and (Strategy 2, Strategy 2)\n"); break; case 6: printf("Nash Equilibria=(Strategy 2, Strategy 1)\n"); break; case 7: printf("Nash Equilibrium=(Strategy 1, Strategy 1), (Strategy 1, Strategy 2)\n"); break; case 8: printf("Nash Equilibrium=(Strategy 1, Strategy 2)\n"); break; case 9: printf("Nash Equilibrium=(Strategy 2, Strategy 1) and (Strategy 1, Strategy 2)\n"); break; } return 0; }
/* 2×2のゼロサムゲーム strategy 1 : p Ap+C(1-p)=Bp+D(1-p) p=(D-C)/(A+D-B-C), 1-p=(A-C)/(A+D-B-C) expected utility:Ap+B(1-p) payoff matrix: A,-A | B, -B C,-C | D, -D */ #include<stdio.h> #define row 2 #define column 2 #define A 5.0 #define B 2.0 #define C 3.0 #define D 7.0 main() { int i,j; double max1,max2,min1,min2,smax,smin; double payoff[row][column], mmin[row], mmax[column]; for(i=0;i<row;i++){ for(j=0;j<column;j++){ payoff[i][j]=0.0; } } payoff[0][0]=A; payoff[0][1]=B; payoff[1][0]=C; payoff[1][1]=D; printf("payoff matrix\n"); for(i=0;i<row;i++){ printf("%f %f\n",payoff[i][0],payoff[i][1]); printf("\n"); } printf("****利得の保証水準を求める*****\n"); for(i=0;i<row;i++){ min1=9999; for (j=0;j<column;j++){ if(payoff[i][j]max1){ max1=mmin[i]; smax=i; } } printf("マックスミニ値=%f\n", max1); printf("\n"); printf("****損失の保証水準を求める*****\n"); for(j=0;j<column;j++){ max2=-9999; for(i=0;i<row;i++){ if(payoff[i][j]>max2){ max2=payoff[i][j]; } } mmax[j]=max2; } printf("各行の損失の保証水準[%f %f]\n", mmax[0],mmax[1]); printf("\n"); printf("****ミニマックス値を求める*****\n"); min2=9999; for(j=0;j<2;j++){ if(mmax[j]<min2){ min2=mmax[j]; smin=j; } } printf("ミニマックス値=%f\n",min2); printf("\n"); if(min2==max1){ printf("最適戦略(%f, %f)が存在する\n", smax+1,smin+1); } else { printf("混合戦略が存在する\n"); printf("戦略1を選ぶ確率 p=%f 戦略2を選ぶ確率 1-p=%f\n",(D-C)/(A-B-C+D),1.0-(D-C)/(A-B-C+D)); printf("Expected Utility=%f\n",A*(D-C)/(A-B-C+D)+C*(1.0-(D-C)/(A-B-C+D))); } }
/* 3×3のゼロサムゲーム */ #include<stdio.h> #define row 3 #define column 3 main() { int i,j,max1,max2,min1,min2,smax,smin; int senryaku[row][column], mmin[row], mmax[column]; printf("****make the payoff matrix*****\n"); for (i=0;i<row;i++){ for(j=0;j<column;j++){ scanf("%d", &senryaku[i][j]); } } printf("payoff matrix\n"); for(i=0;i<row;i++) { printf("%d %d %d\n",senryaku[i][0],senryaku[i][1],senryaku[i][2]); printf("\n"); } printf("****利得の保証水準を求める*****\n"); for(i=0;i<row;i++) { min1=9999; for (j=0;j<column;j++) { if(senryaku[i][j]<min1){ min1=senryaku[i][j]; } } mmin[i]=min1; } printf("各行の利得の保証水準[%d %d %d]\n", mmin[0],mmin[1],mmin[2]); printf("\n"); printf("****マックスミニ値を求める*****\n"); max1=-9999; for(i=0;i<row;i++){ if(mmin[i]>max1){ max1=mmin[i]; smax=i; } } printf("マックスミニ値=%d\n", max1); printf("\n"); printf("****損失の保証水準を求める*****\n"); for(j=0;j<column;j++) { max2=-9999; for(i=0;i<row;i++) { if(senryaku[i][j]>max2){ max2=senryaku[i][j]; } } mmax[j]=max2; } printf("各行の損失の保証水準[%d %d %d]\n", mmax[0],mmax[1],mmax[2]); printf("\n"); printf("****ミニマックス値を求める*****\n"); min2=9999; for(j=0;j<3;j++) { if(mmax[j]<min2){ min2=mmax[j]; smin=j; } } printf("ミニマックス値=%d\n",min2); printf("\n"); if(min2==max1) { printf("最適戦略(%d, %d)が存在する\n", smax+1,smin+1); } else { printf("混合戦略が存在する\n"); } }
出力結果
****make the payoff matrix***** 20 60 30 70 50 40 50 10 30 payoff matrix 20 60 30 70 50 40 50 10 30 ****利得の保証水準を求める***** 各行の利得の保証水準[20 40 10] ****マックスミニ値を求める***** マックスミニ値=40 ****損失の保証水準を求める***** 各行の損失の保証水準[70 60 40] ****ミニマックス値を求める***** ミニマックス値=40 最適戦略(2, 3)が存在する