蒟蒻的第一篇博客——博弈

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

太无聊了搞个博弈专题vanvan~

博弈论(Game Theory),博弈论是指研究多个个体或团队之间在特定条件制约下的对局中利用相关方的策略,而实施对应策略的学科。有时也称为对策论,或者赛局理论,是研究具有斗争或竞争性质现象的理论和方法。

一、博弈论基本要素

(1)局中人(players):在一场竞赛或博弈中,每一个有决策权的参与者成为一个局中人。只有两个局中人的博弈现象称为“两人博弈”,而多于两个局中人的博弈称为 “多人博弈”。

  (2)策略(strategies):一局博弈中,每个局中人都有选择实际可行的完整的行动方案,即方案不是某阶段的行动方案,而是指导整个行动的一个方案,一个局中人的一个可行的自始至终全局筹划的一个行动方案,称为这个局中人的一个策略。如果在一个博弈中局中人都总共有有限个策略,则称为“有限博弈”,否则称为“无限博弈”。

  (3)得失(payoffs):一局博弈结局时的结果称为得失。每个局中人在一局博弈结束时的得失,不仅与该局中人自身所选择的策略有关,而且与全局中人所取定的一组策略有关。所以,一局博弈结束时每个局中人的“得失”是全体局中人所取定的一组策略的函数,通常称为支付(payoff)函数。

  (4)次序(orders):各博弈方的决策有先后之分,且一个博弈方要作不止一次的决策选择,就出现了次序问题;其他要素相同次序不同,博弈就不同。

  (5)博弈涉及到均衡:均衡是平衡的意思,在经济学中,均衡意即相关量处于稳定值。在供求关系中,某一商品市场如果在某一价格下,想以此价格买此商品的人均能买到,而想卖的人均能卖出,此时我们就说,该商品的供求达到了均衡。所谓纳什均衡,它是一稳定的博弈结果。

————MBA智库

二、博弈论类型

  合作博弈非合作博弈的区别在于相互发生作用的当事人之间有没有一个具有约束力的协议,如果有,就是合作博弈,如果没有,就是非合作博弈。

  静态博弈是指在博弈中,参与人同时选择或虽非同时选择但后行动者并不知道先行动者采取了什么具体行动;

  动态博弈是指在博弈中,参与人的行动有先后顺序,且后行动者能够观察到先行动者所选择的行动。通俗的理解:"囚徒困境"就是同时决策的,属于静态博弈;而棋牌类游戏等决策或行动有先后次序的,属于动态博弈

  完全博弈是指在博弈过程中,每一位参与人对其他参与人的特征、策略空间收益函数有准确的信息。

  不完全信息博弈是指如果参与人对其他参与人的特征、策略空间及收益函数信息了解的不够准确、或者不是对所有参与人的特征、策略空间及收益函数都有准确的信息,在这种情况下进行的博弈就是不完全信息博弈

我们平时遇到的博弈题目多是合作、动态、完全的。

1.两人游戏,每人轮流做出决策,且每人的决策都是对自己有利的。
2.游戏有终止,不会产生平局。
3.游戏可以在有限步数内结束。
4.所有规定唯一,两人等效。

四大博弈类型

首先需要了解奇异态势(平衡状态):

对下先手来说,

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

任意非平衡状态可经过一次操作变为平衡态。

简单来说说,博弈者,需要将一个奇异态势(平衡态)留给对手,以期让对面打破平衡,自己取得胜利。

巴什博奕(Bash Game)

1堆n个石子,两人轮流取,规定每次至少取1个,最多取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)的倍数,就能最后获胜。(保证自己操作后达到奇异态势)

1122: 取石子游戏II

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 428  Solved: 251
[Submit][Status][Web Board]

Description

一堆石子有n个,两人轮流取.每次取最少取1个,最多取m个。取完者胜.先取者负输出"Second win".先取者胜输出"First win"

Input

多组测试数据。

每组测试数据包含2个正整数n,m。(n,m<=10000000)

Output

对于每组测试数据,输出谁获胜.

Sample Input

2 1 3 2 3 1

Sample Output

Second win Second win First win

 尼姆博奕(Nimm Game): 有k堆各n个石子,两人轮流从某一堆取任意多石子,规定每次至少取1个,取走最后石子的人获胜。

已知结论:把每堆物品数全部异或起来,若值为0,则先手必败,否则先手必胜。

我们将每堆物品数异或起来为0这个状态称为必败态,(此时即为奇异局势),谁取谁必败。当这个状态时,经过两人轮流取物,后者始终可以维持这个必败态,即A取完后,B一定可以取一个数,使得取完后每堆物品数异或起来仍为0。
所以当每堆物品数全部异或起来,若值为0,此时已是必败态,先手必败;若值不为0,则先手一定会取一个数使得每堆数异或起来为0,达到必败态,从而后手必败。

 #include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    while(cin>>n>>m)
    {
        if(n % (m + 1) == 0)
            cout<<"Second win"<<endl;
        else
            cout<<"First win"<<endl;
    }
    return 0;
}

1915: D.取石子游戏终结版

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 27  Solved: 24
[Submit][Status][Web Board]

Description

游戏规则:

有一天,Hx和Xh两个人在玩Nim游戏,他们觉得Nim游戏真是太简单了,于是就稍微修改下玩法:

m堆石子,两人轮流取.只能在1堆中取.取完者胜.HX先取。

例如5堆 5,7,8,9,10先取者胜,先取者第1次取时可以从有8个的那一堆取走7个剩下1个,也可以从有9个的中那一堆取走9个剩下0个,也可以从有10个的中那一堆取走7个剩下3个。

Input

多组输入.输入一个数 m(0<m<=200000)当m=0时结束。

之后输入m个数,表示每一堆石子个数(0< s[i] <= 2^32 - 1)。

Output

XH赢输出X。

HX赢输出H,然后输出HX第1次取子的所有方法.如果从有a个石子的堆中取若干个后剩下b个后会胜就输出a b.(hhh是不是很棒棒)。

Sample Input

2 45 45 3 3 6 9 5 5 7 8 9 10 0

Sample Output

X H 9 5 H 8 1 9 0 10 3

 

#include<bits/stdc++.h>
using namespace std; 
int a[200001];
int main()
{
    int m;
    while(cin>>m&&m) {
        int ans = 0, left;
        for(int i = 1; i <= m; i++) {
            cin>>a[i];
            ans ^= a[i];
        }
        if(ans == 0) printf("X\n");
        else {
            printf("H\n");
            for(int i = 1; i <= m; i++)
                if(a[i] > (left = ans ^ a[i]))
                    printf("%d %d\n", a[i], left);
        }
}
    return 0;
}

 威佐夫博弈(Wythoff Game): 有2堆各n个石子,两人轮流从某一堆或同时从两堆中取同样多的石子,规定每次至少取1个,多取不限,取完石子者获胜。

我们用(a[k],b[k])(a[k] ≤ b[k] ,k=0,1,2,...,n)(表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。注:k表示奇异局势的序号, 第一个奇异局势k=0。

可以看出,a[0]=b[0]=0,a[k]是未在前面出现过的最小自然数,而 b[k]= a[k] + k。详见百度百科。

重要结论:有两堆石子,数量为n,m.设n中的石子数量少于m中的。当n == (m - n) *(1+√5)/2,此时先手必输

1918: G.这是个博弈

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 92  Solved: 61
[Submit][Status][Web Board]

Description

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到HX先取,假设双方都采取最好的策略,问最后HX是胜者还是败者。

Input

输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。

输入为0 0的时候结束。

Output

若HX赢,则输出H,否则输出X;

Sample Input

2 1 8 4 4 7 0 0

Sample Output

X H X

#include<bits/stdc++.h>
using namespace std; 
int main()
{
    int a,b;
    while(cin>>a>>b&&a&&b){
    	if(a>b)swap(a,b);
    	int k=(b-a)*(1+sqrt(5))/2;
    	if(a==k)
    	cout<<"X"<<endl;
    	else
    	cout<<"H"<<endl;
    }
    return 0;
}

斐波那契博弈(Fibonacci Nim Game): 有一堆物品,共n个,两人轮流取物,先手可取任意件,但不能不取,也不能把物品取完,之后每次取的物品数不能超过上一次的两倍,且至少为1件,取走最后一件物品的人获胜。

结论: 当且仅当n不是斐波那契数时,先手胜。

1121: 取石子游戏I

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 450  Solved: 280
[Submit][Status][Web Board]

Description

一堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".

Input

多组测试数据。

每组测试数据包含1个整数n。(1<n<=1000000000)

Output

对于每组测试数据,输出谁获胜.

Sample Input

2 13 10000

Sample Output

Second win Second win First win

 

#include<bits/stdc++.h>
using namespace std;
int main(){
    int fib[55];
    fib[0]=1;
    fib[1]=1;
    for(int i=2;i<55;i++){
        fib[i]=fib[i-1]+fib[i-2];
    }
    int n;
    while(cin>>n)
    {
        int f=0;
        for(int i=0;i<55;i++){
            if(n==fib[i])f=1;
        }
        if(f)cout<<"Second win"<<endl;
        else cout<<"First win"<<endl;
    }
    return 0;
}

 拓展:k倍动态

 有一堆物品,共n个,两人轮流取物,先手可取任意件,但不能不取,也不能把物品取完,之后每次取的物品数不能超过上一次的k倍,且至少为1件,取走最后一件物品的人获胜。

即上述2倍变为k倍。

同理构造数列,若n是该数列中的数时,先手必败,否则后手必败。

 

#include<bits/stdc++.h>
using namespace std;
const int maxn= 10010;
int a[maxn],b[maxn];
int main()
{
	int n,k;
	cin >> n >> k;
	a[0] = b[0] = 1;
	int i = 0,j = 0;
	while(n > a[i])
	{
		i++;
		a[i] = b[i-1] + 1;
		while(a[j+1] * k < a[i])
			j++;
		if(a[j] * k < a[i])
			b[i] = b[j] + a[i];
		else
			b[i] = a[i];
	}
	if(n == a[i])
		cout << "lose" << endl;
	else
		cout << "win" << endl;

	return 0;
}

总结

其他题不会写,只能勉强搞点简单博弈题康康,这个样子,呜呜呜~~~

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值