首页 > 其他分享 >博弈论个人笔记总结

博弈论个人笔记总结

时间:2024-03-11 22:24:00浏览次数:30  
标签:总结 ... 博弈论 游戏 parent int 石子 笔记 neq

博弈论

简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理) - The_Virtuoso - 博客园 (cnblogs.com)

尼姆博弈(Nim)游戏

引入 :

  • 假设先手为$X$,后手为$Y$
  • 先假设有两堆石子,数量分别为 a,b, 如果 $a \neq b\ and\ a >b$ ,$X$选石子$x$个让$a-x = b$ ,然后$Y$只能任选石子个数$k$个导致$a \neq b$,然后$X$跟着$Y$在另外一堆选$k$个,那么还是回到$a = b$,循环那么最终$a = b = 0$,$Y$是没法再取,$Y$失败, 同理如果开局$a = b$ ,则$X$必败
  • 在这里 $a = b$为先手必败态,$a\neq b$ 为先手必胜态

推广:

  • 假设有n堆石子呢, 我们该怎么办,我们可以想到异或的性质,二进制同位相同异或值为0,否则为1
  • 假设有3堆石子数量二进制表示$a = 1100,b = 1001 ,c = 0101$ ,$a$ ^ $b$ ^ $c = 0$
  • 正常情况是可以压缩为只有两堆石子那样,$X$取多少,$Y$取多少
  • 如果$X$挣扎在$a$石堆中取$1010$,那么剩余的石子堆中$a = 0010,b = 1001,c = 0101$中均没有那么大的数,即$Y$不能取相同的数
  • 让 $S = a$$b$$c$那么$Y$只需要在剩余石堆中寻找符合的( $Value$^S$ \le Value$ 也就是让该石堆的数量为其余石堆的异或值 )即石堆b取掉$b - b$^S,那么$\ \ b -> b$^$S$
  • 结束后$a = 0010,b = 0111,c = 0101$,那么再次,$a$ ^ $b$ ^ $c = 0$
  • 也就是说如果只要开局$a_1$ $a_2$...^$a_n = 0$,不管$X$怎么操作,$Y$永远都可以让$a_1$ $a_2$...^$a_n = 0$,直到取完,$X$失败
  • 同理开局$a_1$ $a_2$...^$a_n \neq 0$,$X$都可以让$a_1$ $a_2$...^$a_n \neq 0$,直到取完,$Y$失败

总结 :

  • $a_1$ $a_2$...^$a_n \neq 0$ 先手必胜态
  • $a_1$ $a_2$...^$a_n = 0$ 先手必败态
#include<cstdio>
using namespace std;

int k,a[500002];

int main(){
  scanf("%d",&k); 
  int s=0;
  for(int i=1;i<=k;i++)
    scanf("%d",&a[i]), s^=a[i];
    
  if(!s) return puts("lose"),0;
  for(int i=1;i<=k;i++){
    if((a[i]^s)>=a[i]) continue;
    printf("%d %d\n",(a[i]-(a[i]^s)),i);
    a[i]=a[i]^s; break;
  }
  for(int i=1;i<=k;i++) printf("%d ",a[i]);
  return 0;
}

题目 :

台阶型 Nim游戏

主要思想 :

  • $a_1$ $a_3$$a_5$...^$ \neq 0$ 先手必胜态
  • $a_1$ $a_3$$a_5$...^$ = 0$ 先手必败态

expand :每人每次可以从$[1,d]$堆中各取任意多个石子 ?

1int read(){2      int x=0,f=0,ch;3      while(!isdigit(ch=getchar()))f|=ch=='-';4      while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();5      return f?-x:x;6}cpp

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int T,n;
int a[1005],b[1005];

int main(){
  cin>>T;
  while(T--){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=n;i>=1;i--)b[n-i+1]=a[i]-a[i-1]-1;
    
    int s=0;
    for(int i=1;i<=n;i+=2) s^=b[i];
    
    if(s) puts("Georgia will win");
    else puts("Bob will win");
  }
}

题目 :

Nim游戏 SG函数

主要思想 :

​ DFS树林 转化为 多堆石堆子

​ 如何转换 ?

​ 因为 parent = MEX{childs...}

​ if parent == 0 : child must >= 0 so child of child must have 0 这棵树一定是没用的

​ else parent != 0 next must < parent => 石堆子

补充 :

  • mex运算 这是一个施加于集合的运算,表示求出这个集合中最小的没有出现过的非负整数,比如 mex{0,2,3} = 1,mex{1,2} = 0,mex{} = 0
int f[N];
/*
* 递归运算 :
*    parent =  MEX{childs...}
*    Tree : if root == 0 ,这棵树没有意义
*           if root != 0 ,change => Nim多堆石子问题
* 扩展 : 
*    if parent 和 child 存在一种可推断关系即可转化为 sg问题
*/
int sg(int u){
  if(f[u]!=-1) return f[u];  // 记忆化搜索
  set<int> S; // 把子节点的sg值插入集合
  /* TODO : parent about child connections
  *
  *  for(int i=h[u];i;i=ne[i])  // there is edge
  *    S.insert(sg(to[i]));    // mex运算求当前节点的sg值并记忆/
  */
  for(int i=0; ;i++) 
    if(!S.count(i)) return f[u]=i;
}

题目 :

威佐夫博弈

博弈论-2023-11-12-02-30-39

题面 :有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,

​ 规定每次至少取一个,多者不限,最后取光者得胜。

主要思想 : 枚举

公式 : $\frac{\sqrt{5} + 1}{2} * (n-m) == m .其中 n > m$

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	float eqa=(1+sqrt(5))/2;
	while(cin>>n>>m){
		if(n>m) swap(n,m);
		int dif=m-n;
		if(int(dif*eqa)==n) cout<<"0"<< '\n';
		else cout<<"1"<< '\n';
	}
	return 0;
}
/* 进阶级题型  : win输出 取法 枚举....*/

巴什博奕

题面 : 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
主要思想 :

  • 什么是博弈论 ? 必胜 => 必败 => 必胜 => ...... , 最终令一个必败
  • 那么从小反推到大, cnt <= m 必胜, 怎么由必败态转化来 ? 那就是 在(m+1,2 * m)中只有m+1满足

公式 : $n % (m+1) == 0$

题目 :

简单博弈

三种典型的博弈论问题之巴什博奕(Bash Game)_巴什博弈-CSDN博客

标签:总结,...,博弈论,游戏,parent,int,石子,笔记,neq
From: https://www.cnblogs.com/Uoyue/p/18067219

相关文章

  • cmd 的图论练习题(近期总结 2024.3.11)
    AGC010ERearranginglink题意:一个序列\(a_{1...n}\),两个人游戏。先手打乱这个序列,然后后手可以多次选择一对相邻的互质的数交换。先手希望最终序列字典序尽量小,后手则相反。两人都绝顶聪明,求最终序列。\(1\len\le2000,\space1\lea_i\le10^8\)考虑不互质的两个数\(a_i,a......
  • Minitorch笔记
    https://github.com/mukobi/Minitorch-Self-Study-Guide-SAIA/blob/main/README.md#what-is-thishttps://minitorch.github.io/srush/GPU-Puzzles:Solvepuzzles.LearnCUDA.(github.com)代码规范和提交black.#Formatallfilesflake8.#checkdocstringandetc.my......
  • vue3—尚硅谷禹神笔记转载
    1.Vue3简介2020年9月18日,Vue.js发布版3.0版本,代号:OnePiece(n经历了:4800+次提交、40+个RFC、600+次PR、300+贡献者官方发版地址:Releasev3.0.0OnePiece·vuejs/core截止2023年10月,最新的公开版本为:3.3.41.1.【性能的提升】打包大小减少41%。初次渲染快5......
  • 3.11每日总结
    净现值计算 #include<iostream>#include<iomanip>#include<cmath>constintPROJECTS=6;constintYEARS=4;intmain(){//创建二维数组储存每个项目每年利润intmoney[PROJECTS][YEARS]={{-100000,-1000000,-100000,-120000},{10000,......
  • GraphDA论文阅读笔记
    Abstract​ 图协同滤波(GCF)是在推荐系统中捕获高阶协同信号的一种流行技术。然而,GCF的二部邻接矩阵定义了基于用户-项目交互聚合的邻居,对于交互丰富的用户/项目来说是有噪声的,而对于交互稀缺的用户/项目则不够。此外,邻接矩阵忽略了用户-用户和项目-项目之间的相关性,这可能会限制被......
  • 计算几何——扫描线 学习笔记
    计算几何——扫描线学习笔记你会发现我的笔记的顺序和很多扫描线的讲解是反着来的。其实是和我老师给的课件完全是逆序(谁帮我算一下逆序对啊喵)。前言一开始以为扫描线就是用来求二维几何图像的信息的。但是其实这个并不准确。个人认为,扫描线其实是一个思想,就像动态规划一样......
  • 总结
    主要用来写一些自己的漏洞最大的漏洞:不记得更新这篇博客……数据结构Splay:(平均一个题4个小时我也是很服气一定要记得随时splay要不然会T(当然还得记得及时update不然在一些需要siz的操作会寄如果是区间翻转的时候,splay的时候要顺便pushdown,先pushdown父节点再pushdown自己......
  • Java学习笔记——第十二天
    面向对象高级(三)内部类内部类是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。比如:汽车类中的发动机类,发动......
  • 【Python使用】python高级进阶知识md总结第3篇:静态Web服务器-返回指定页面数据,静态We
    python高级进阶全知识知识笔记总结完整教程(附代码资料)主要内容讲述:操作系统,虚拟机软件,Ubuntu操作系统,Linux内核及发行版,查看目录命令,切换目录命令,绝对路径和相对路径,创建、删除文件及目录命令,复制、移动文件及目录命令,终端命令格式的组成,查看命令帮助。HTTP请求报文,HTTP响应报文......
  • C++学习笔记
    第一章认识C++1.1命名空间1.1.1命名空间的基本格式命名空间是一个由用户自己定义的作用域,在不同作用域中定义相同变量,不会冲突。命名空间中可以存放以下类型,这些定义/声明在结构体中的内容成为实体变量常量函数(可以是定义或声明)结构体类模板命名空间(可以嵌套定义)......