初探博弈论---网络与社会导论心得

博弈无处不在,小到每天去菜市场买菜,和朋友约好在商场集合,大到国家之间的利益冲突,核威慑等等。博弈圣经中给出了博弈论的定义:我们把动物利用大自然移动的瘾魂,在决策人期待的空间里,形成相对均衡的理论,称为博弈论。

博弈论三要素:

1参与者:指的是博弈中做出相关决策的个体,由于存在相互依赖,博弈中至少有两个参与者。

2每个参与者的策略集:指一个完整的计划或决策准则,它定义了参与者在不同状态下所要选择的行动。并非罗列参与者可选的行动,而是描述参与者的行动如何依赖他所观察到的其他参与者已经采取的行动。

3效用函数:衡量参与者在每一组策略组合下所获得的收益,参与者总是愿意选择高收益而不是低收益。

纳什均衡:如果某情况下无一参与者可以通过独自行动而增加收益,则此策略组合被称为纳什均衡。

下面具体讨论一下囚徒困境:

囚徒困境反映了个人最佳选择并非团体最佳选择。或者说在一个群体中,个人做出理性选择却往往导致集体的非理性。局部最优解优势偶并非全局最优解。

1.公地悲剧

2.搭便车问题

3.自愿者困境

......

上述几个困境本质上都是一样的困境。大家合作可以产生最佳的结果,但是这种合作的并没有达到纳什均衡,因此合作这种情形并不稳定。

博弈论可以让我们从一个全新的角度去看待问题,发掘内在的真正原因。同时可以提供一些全新的策略帮我们解决难题。

1.赢了位置不变,输了就换位。

2.引进一个额外的参与者。

3.形成一些互惠的形式。

4.限制自己未来的选择可能,如果欺骗的话,那么就会一无所获。

5.提供信任。

6.形成这么一种情况,使没有一方可以毫无损失地独立地从合作中撤退。

7.使用边缘支付来打造并维持合作协同关系。

8.有效分配物品、责任、工作以及惩罚,从而使没有人会对这个结果有所妒忌、搞到不平。

9.将打团体分割成小团体。

都可以解决生活中的难题

————————————————————————

去维基百科又搜索了下囚徒困境,其中说到了重复囚徒困境的最优策略,很受启发,我就直接粘贴在下面:

1.友善:最重要的条件是策略必须“友善”,这就是说,不要在对手背叛之前先背叛。几乎所有的高分策略都是友善的。因此,完全自私的策略仅仅出于自私的原因,也永远不会首先打击其对手。

2.宽恕:成功策略的另一个品质是必须要宽恕。虽然它们不报复,但是如果对手不继续背叛,它们会一再退却到合作。这停止了报复和反报复的长期进行,最大化了得分点数。

3.不嫉妒:最后一个品质是不嫉妒,就是说不去争取得到高于对手的分数(对于“友善”的策略来说这也是不可能的,也就是说“友善”的策略永远无法得到高于对手的分数)。

可见,中国人自古以来的待人态度,对现在的我们的确是非常有启发意义的。

————————————————————————

下面以尼姆博奕说明一种取数游戏的最优策略问题:

尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。

计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号(+)表示这种运算。这种运算和一般加法不同的一点是1+1=0。先看(1,2,3)的按位模2加的结果:

1 =二进制01

2 =二进制10

3 =二进制11(+)

0 =二进制00(注意不进位)

对于奇异局势(0,n,n)也一样,结果也是0。

任何奇异局势(a,b,c)都有a(+)b(+)c =0。

如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设a < b< c,我们只要将c变为a(+)b,即可,因为有如下的运算结果: a(+)b(+)(a(+)b)=(a(+)a)(+)(b(+)b)=0(+)0=0。要将c变为a(+)b,只要从c中减去c-(a(+)b)即可。

1:(14,21,39),14(+)21=27,39-27=12,所以从39中拿走12个物体即可达到奇异局势(14,21,27)。

2:(55,81,121),55(+)81=102,121-102=19,所以从121中拿走19个物品就形成了奇异局势(55,81,102)。

3:(29,45,58),29(+)45=48,58-48=10,从58中拿走10个,变为(29,45,48)。

4:我们来实际进行一盘比赛看看:

:(7,8,9)->(1,8,9)奇异局势

:(1,8,9)->(1,8,4)

:(1,8,4)->(1,5,4)奇异局势

:(1,5,4)->(1,4,4)

:(1,4,4)->(0,4,4)奇异局势

:(0,4,4)->(0,4,2)

:(0.4,2)->(0,2,2)奇异局势

:(0,2,2)->(0,2,1)

:(0,2,1)->(0,1,1)奇异局势

:(0,1,1)->(0,1,0)

:(0,1,0)->(0,0,0)奇异局势

甲胜。

对于本次普及组“取石子游戏”来说,

19010011

7000111

5 000101

3 000011

010010 (18)10

50-18=32

所以第1次只能在第5堆石子中取32粒,使得取出32粒后为奇异局势,即异或运算结果为0。

下面给出取石子游戏C程序

任给N堆石子,两人(游戏者与计算机)轮流从任一堆中任取,计算机先取,取最后一颗石子胜.

#include <stdio.h>

unsigned int a[11];

int n;

void init1()

{int i;

printf("input n(2--10):"); scanf("%d",&n);

for (i=1;i<=n;i++)

{printf("input No.%d Number of stone:\n",i);

scanf("%d",&a[i]);}

}

void status()

{int i;

printf("Now remainder:\n");

for (i=1;i<=n;i++) printf(" No.%d rem: %u \n",i,a[i]);

}

unsigned int sum1()

{unsigned int s; int i;

s=0;

for(i=1;i<=n;i++) s+=a[i];

return s;

}

unsigned int xorall()

{unsigned int s; int i;

s=0;

for (i=1;i<=n;i++) s^=a[i];

return s;

}

main()

{unsigned int t;

int i,s,e;

init1();

while (sum1())

{if (xorall()==0)

{for (i=1;i<=n;i++)

if(a[i]>0)

{printf("computer take 1 from No.%d \n",i);

a[i]--; goto loop2;}

}

else

for (i=1;i<=n;i++)

{ s=a[i]-(xorall()^a[i]) ;

if (s>0)

{printf("computer take %u from No.%d \n",s,i);

a[i]^=xorall();

goto loop2;}

}

loop2:;

if(sum1()==0)

{printf("computer win!"); break;}

status();

while (1)

{printf("Input your selection

(examp. 1 2 means take 2 from No.1):\n");

scanf("%d %u",&e,&t);

if ((e>=1)&&(e<=n)&&(a[e]>=t))

{a[e]-=t; goto loop1;}

else

printf("data error! re-input...\n");

}

loop1:;

if(sum1()==0)

{printf("you win!"); break;}

}

}

 

posted @ 2020-04-10 08:54  owczhlol  阅读(682)  评论(0)    收藏  举报