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


Google




BLOG
PICASAWEB
Panoramio


 Symmetric Two Person Game
 Asymmetric Two Person Game

REF:

Cプログラミングによる経済・経営問題の解決法 土田 美廣

Evolutionary Game Theory

A Course in Game Theory

ゲーム理論

ナッシュは何を見たか - 純粋数学とゲーム理論

ビューティフル・マインド [DVD]