提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
今日偶遇博弈论的题,两眼一黑,进行学习。
提示:以下是本篇文章正文内容,下面案例可供参考
一、博弈论是啥意思,以及几种分类
1.什么意思:博弈,就是两方(或者多方)在为了某一种目标进行的竞争。大概就是对象只有两个,现在遇到的事取物品类的。
2.分类:
(1)巴什博弈
(2)威左夫博弈
(3)尼姆博弈
二、各个博弈的内容
1.巴什博弈
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜
大概:一堆物品(n个物品)给你,两个人去取,每次可以去1~m个,最后去光的人算赢。
现在也有很多这种小游戏嘛,然后就有了一个同余定理
同余定理:
n=K(m+1)+r 其中K为整数的常输,r为余数。 就是拿n(n个物品)去除(m+1)
得到的余数为r,商结果为K。
如果有余数r 那么先者只需一开始取走r个,然后再根据对方取走的个数,自己取走与之相加为(m+1)的个数,(比如10个物品(n=10),每人最多取5个(m个),(m+1)=6,10/6=1(K=1),10%6=4(r=4),现在只需先者取走4个,剩下6个,那么无论对方取几个,都能赢。)
那么如果现在没有余数r,则先手必输。
....(当然这是理想状态,要是现实中做游戏,对方不知道这个,那么其实每次从新到自己开始取物品的时候都可以当做一次新的游戏开始,在进行计算。)....
int m, n;
r=n%(m+1)
if(r==0)
printf("输")
else
printf("赢")
//n=K*(m+1)+r
大概这样操作,
2.威左夫博弈
威佐夫博弈(Wythoff's game)是指的这样一个问题:有两堆各若干个物品,两个人轮流从任意一堆中取出至少一个或者同时从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜利。
这边需要一个黄金分割比r=(sqrt(5.0)+1)/2
还有一个放在math头文件里的abs函数,取绝对值,(int a=abs(m-n))
然后可以自己写一个min找两个数最小值的函数
这些准备工作
#include<stdio.h>
#include<math.h>
int min(int a, int b)
{
if (a > b)
return b;
else
return a;
}
int main()
{
int m=0, n=0;
scanf("%d%d", &m , & n);
double r = (sqrt(5.0) + 1) / 2;
int Def = abs(m - n)*r;
if (Def== min(m, n))
printf("0");
else
printf("1");
}
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者
#include<stdio.h>
#include<math.h>
int min(int a, int b)
{
if (a > b)
return b;
else
return a;
}
int main()
{
int m=0, n=0;
while (scanf("%d %d", &m, &n) != EOF)
{
double r = (sqrt(5.0) + 1) / 2;
int Def = abs(m - n)*r;
if (Def== min(m, n))
printf("0");
else
printf("1");
}
}
3.尼姆博弈
1.定义: 有任意堆物品,每堆物品的个数也任意,双方轮流取物品,每次只能从一堆中取至少一个物品,取到最后一件物品的人获胜。
2.结论: 把每堆物品数全部异或起来,若值为0,则先手必败,否则先手必胜。
int res=0;
for(int i=1;i<=n;i++)
{
res = res ^ arr[i];
}
if(res)
return true;
else
return false;
异或运算法则的使用
相同为0,不同为1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
由运算规则可知,任何二进制数与零异或,都会等于其本身,即 A ^ 0 = A。
(1)交换律: A ^ B = B ^ A
(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)
示例:将 a 和 b 两个变量值交换,例如: a = 3,b = 7,交换后,a = 7,b = 3。
// 常规方法
int temp = a; // temp = 3
a = b; // a = 7
b = temp; // b = 3
// 异或方法
a = a ^ b; // a = 3 ^ 7
b = a ^ b; // b = (3 ^ 7) ^ 7 = 3 ^ (7 ^ 7) = 3
a = a ^ b; // a = (3 ^ 7) ^ (3 ^ 7 ^ 7) = (3 ^ 3) ^ (7 ^ 7) ^ 7 = 7
注意的话就是:这里b=a^b ,b的结果为3但是,b实际上还是为(3^7)^7
当下面再次带入计算a时其中的b带入的也是(3^7)^7而不是3
目录
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。