python博弈论代码_博弈论的算法总结

开头先啰嗦一句:想学好博弈,必然要花费很多的时间,深入学习,不要存在一知半解,应该是一看到题目,就想到博弈的类型。

以及,想不断重复不断重复,做大量各大oj网站的题目,最后吃透它。

博弈:

博弈论又被称为对策论(Game Theory),既是现代数学的一个新分支,也是运筹学的一个重要学科。

博弈,具体的例子就是下棋,双方都考虑最有利于自已的步骤,但是最终必有一方输,一方赢。

博弈的策略:参与者在行动之前所准备好的一套完整的行动方案,就是想好下完这步棋,对方会如何下,

以及接下来该如何下,最终得出结果。

常见的博弈有以下:

1.博弈:合作博弈和非合作博弈

合作博弈:指参与者能够达成一种具有约束力的协议,在协议范围内选择有利于双方的策略

非合作博弈:指参与者无法达成这样一种协议

2.博弈:静态博弈和动态博弈

静态博弈:指在博弈中,参与者同时选择,或虽非同时选择,但是在逻辑时间

上是同时的。(期末老师评分与同学给老师评分)

动态博弈:指在博弈中,参与者的行动有先后顺序,且后行动者能够观察

到先行动者的行动。(下棋)

3.博弈:完全信息博弈与不完全信息博弈

完全信息博弈:指在博弈中,每个参与者对其他参与者的类型,策略空间及损益函数都有准确的信息。(卖家与买家)

不完全信息博弈:总有一些信息不是所有参与者都知道的

4.博弈:零和博弈与非零和博弈

零和博弈:指博弈前的损益总和与博弈后的损益总和相等

非零和博弈:指博弈后的损益大于(小于)博弈前的损益总和(正和或负和 )

下面我主要讲一些关于算法比赛中用到的博弈类型:

首先你要理解必胜状态和必败状态:

对下先手来说,

一个状态是必败状态当且仅当它的所有后继都是必败状态。

一个状态是必胜状态当且仅当它至少有一个后继是必败状态。

就是说,博弈者,一旦捉住了胜利的把柄,必然最后胜利。

博弈中常常用到的:

两个数,不用中间变量实现交换。

a b;

a = a^b;

b = a^b;

a = a^b;

巴什博弈:

百度百科:

巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个。最后取光者得胜。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。对于巴什博弈,那么我们规定,如果最后取光者输,那么又会如何呢?(n-1)%(m+1)==0则后手胜利

先手会重新决定策略,所以不是简单的相反行的

例如n=15,m=3

后手 先手 剩余

0 2 13

1 3 9

2 2 5

3 1 1

1 0 0

先手胜利 输的人最后必定只抓走一个,如果>1个,则必定会留一个给对手

请去刷下面的题目,均是巴什博弈

算博弈题目时,一定要算到一个周期结束,防止出错,很有可能像HDU2897那样。中途错的猝不及防

代码实现如下:

packageCombat.com;importjava.util.Arrays;importjava.util.Scanner;public classMain

{public static voidmain(String []args)

{

Scanner cin= newScanner(System.in);while(cin.hasNext())

{int n =cin.nextInt();

PLG(n);

}

<
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值