/* 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)が存在する

