博弈论及算法实现

博弈论 —— matlab 1.简介 2.算法原理 3.实例分析 1.各参数初始化 2.计算期望与实际期望 3.博弈过程 4.绘图 完整代码 阅读详情

一、巴什博弈(Bash Game)

      只有一堆n个物品,两个人从轮流中取出(1~m)个;最后取光者胜。

      考虑到 若n=m+1 那么 第一个人不论如何取都不能取胜。

      进一步我们发现 若 n=k*(m+1)+r; 先取者拿走 r 个,那么后者再拿(1~m)个

      n=(k-1)*(m+1)+s; 先取者再拿走s 个 最后总能造成 剩下n=m+1 的局面。

      因此,此时先手有必赢策略。

      相对应的,若n=k*(m+1) 那么先取者必输。

      因此我们可以写出对应的程序(默认 n m都大于0)

int Bash_Game(int n,int m)//是否先手有必赢策略
{
    if (n%(m+1)!=0) return 1;
    return 0;
}

 二、尼姆博弈(Nimm Game)

把n堆抽象为n个非负整数,再将n个整数转化为二进制,然后对n个二进制数按位相加(不进位),若每一位相加都为偶数。那么称这个状态为偶状态,否则称它为奇状态.

 可以证明:任何一个偶状态在其中一个数变小后一定成为奇状态,而一个奇状态一定可以通过改变一个数变成偶状态.

   前一点很显然,因为一个数变小至少有一位发生改变,这一位就改变了原来的偶状态. 

对于后一点,对于一个从高位到低位某一位和为奇的奇状态,必定有一个数的二进制表示在此位为1,对于后面的较低位和为奇的情况,只要把这个数对应位取反即可得到一个偶状态.

  XOR 和判断:

  如果有奇数个二进制数在第K位为1 那么在这一位上的和为奇,同样的,偶数个1和为偶.

  很明显位运算xor满足我们的要求,偶数个1异或和为0,奇数个为1;

 由此,终于可以给出算法:

int Nimm_Game(int n)//假设n个数存在数组f[]中,有必胜策略返回1
{
    int flag=0;
    for(int i=1;i<=n;i++)
    flag^=f[i];
    if(flag) return 1;
    return 0;
}

三 威佐夫博奕(Wythoff Game):

有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

    这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,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)。

    可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,奇异局势有
如下三条性质:

    1。任何自然数都包含在一个且仅有一个奇异局势中。
    由于ak是未在前面出现过的最小自然数,所以有ak > ak-1 ,而 bk= ak + k > ak-1 + k-1 = bk-1 > ak-1 。所以性质1。成立。
    2。任意操作都可将奇异局势变为非奇异局势。
    事实上,若只改变奇异局势(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。
    3。采用适当的方法,可以将非奇异局势变为奇异局势。

    假设面对的局势是(a,b),若 b = a,则同时从两堆中取走 a 个物体,就变为了
奇异局势(0,0);如果a = ak ,b > bk,那么,取走b  – bk个物体,即变为奇异局
势;如果 a = ak ,  b < bk ,则同时从两堆中拿走 ak – ab – ak个物体,变为奇异局
势( ab – ak , ab – ak+ b – ak);如果a > ak ,b= ak + k,则从第一堆中拿走多余
的数量a – ak 即可;如果a < ak ,b= ak + k,分两种情况,第一种,a=aj (j < k)
,从第二堆里面拿走 b – bj 即可;第二种,a=bj (j < k),从第二堆里面拿走 b – a
j 即可。

  从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜
;反之,则后拿者取胜。

  那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:

 ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,…,n 方括号表示取整函数)

奇妙的是其中出现了黄金分割数(1+√5)/2 = 1.618…,因此,由ak,bk组成的矩形近似为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a=[j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1+ j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异
局势。

        int t;
            if(a>b)
            {
                t=a;
                a=b;
                b=t;
            }
        double k=(sqrt(5.0)-1.0)/2.0;
        int j=a*k;
        if(a!=j*(int)(k+1))
            j++;
        if(a+j==b)
            cout<<0<<endl;//奇异局势,后手胜!
        else cout<<1<<endl;//非奇异局势,先手胜!

Sprague-Grundy定理(SG定理):

        游戏和的SG函数等于各个游戏SG函数的Nim和。这样就可以将每一个子游戏分而治之,从而简化了问题。而Bouton定理就是Sprague-Grundy定理在Nim游戏中的直接应用,因为单堆的Nim游戏 SG函数满足 SG(x) = x。

SG函数:

        首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。

        对于任意状态 x , 定义 SG(x) = mex(S),其中 S 是 x 后继状态的SG函数值的集合。如 x 有三个后继状态分别为 SG(a),SG(b),SG(c),那么SG(x) = mex{SG(a),SG(b),SG(c)}。 这样 集合S 的终态必然是空集,所以SG函数的终态为 SG(x) = 0,当且仅当 x 为必败点P时

【实例】取石子问题

有1堆n个的石子,每次只能取{ 1, 3, 4 }个石子,先取完石子者胜利,那么各个数的SG值为多少?

SG[0]=0,f[]={1,3,4},

x=1 时,可以取走1 - f{1}个石子,剩余{0}个,所以 SG[1] = mex{ SG[0] }= mex{0} = 1;

x=2 时,可以取走2 - f{1}个石子,剩余{1}个,所以 SG[2] = mex{ SG[1] }= mex{1} = 0;

x=3 时,可以取走3 - f{1,3}个石子,剩余{2,0}个,所以 SG[3] = mex{SG[2],SG[0]} = mex{0,0} =1;

x=4 时,可以取走4-  f{1,3,4}个石子,剩余{3,1,0}个,所以 SG[4] = mex{SG[3],SG[1],SG[0]} = mex{1,1,0} = 2;

x=5 时,可以取走5 - f{1,3,4}个石子,剩余{4,2,1}个,所以SG[5] = mex{SG[4],SG[2],SG[1]} =mex{2,0,1} = 3;

以此类推.....

   x        0  1  2  3  4  5  6  7  8....

SG[x]    0  1  0  1  2  3  2  0  1....

由上述实例我们就可以得到SG函数值求解步骤,那么计算1~n的SG函数值步骤如下:

1、使用 数组f 将 可改变当前状态 的方式记录下来。

2、然后我们使用 另一个数组 将当前状态x 的后继状态标记。

3、最后模拟mex运算,也就是我们在标记值中 搜索 未被标记值 的最小值,将其赋值给SG(x)。

4、我们不断的重复 2 - 3 的步骤,就完成了 计算1~n 的函数值。

//f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理
//SG[]:0~n的SG函数值
//S[]:为x后继状态的集合
int f[N],SG[MAXN],S[MAXN];
void  getSG(int n){
    int i,j;
    memset(SG,0,sizeof(SG));
    //因为SG[0]始终等于0,所以i从1开始
    for(i = 1; i <= n; i++){
        //每一次都要将上一状态 的 后继集合 重置
        memset(S,0,sizeof(S));
        for(j = 0; f[j] <= i && j <= N; j++)
            S[SG[i-f[j]]] = 1;  //将后继状态的SG函数值进行标记
        for(j = 0;; j++) if(!S[j]){   //查询当前后继状态SG值中最小的非零值
            SG[i] = j;
            break;
        }
    }
}

例题:

Problem - 1848

#include <stdio.h>
#include <string.h>
#define MAXN 1000 + 10
#define N 20
int f[N],SG[MAXN],S[MAXN];
void getSG(int n){
    int i,j;
    memset(SG,0,sizeof(SG));
    for(i = 1; i <= n; i++){
        memset(S,0,sizeof(S));
        for(j = 0; f[j] <= i && j <= N; j++)
            S[SG[i-f[j]]] = 1;
        for(j = 0;;j++) if(!S[j]){
            SG[i] = j;
            break;
        }
    }
}
int main(){
    int n,m,k;
    f[0] = f[1] = 1;
    for(int i = 2; i <= 16; i++)
        f[i] = f[i-1] + f[i-2];
    getSG(1000);
    while(scanf("%d%d%d",&m,&n,&k),m||n||k){
        if(SG[n]^SG[m]^SG[k]) printf("Fibo\n");
        else printf("Nacci\n");
    }
    return 0;
}

上面例题内容出于下面大牛博客:SG函数和SG定理【详解】 - Angel_Kitty - 博客园 

博弈论——巴什博弈(C++) 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。 阅读详情

相关推荐

博弈论算法详解与Python实现

博弈论(Game Theory)是一门研究决策者如何在相互依赖的环境中进行决策的学科。其核心思想是,当多个参与者或“玩家”在做决策时,他们的决策不仅会影响到自己的收益,还会对其他玩家的选择产生影响。博弈论试图揭示,如何在这种互相依赖、互相影响的决策环境中,找到能够优化个人或集体收益的最佳决策方案。博弈论的应用广泛,涵盖了经济学、政治学、心理学、社会学、生物学等多个领域。在经济学中,博弈论被用来分析市场竞争、定价策略、合约设计等问题;在政治学中,它用于分析国家之间的博弈、选举策略等;

闲人编程的博客 2316

【算法与数据结构】—— 博弈论(初级篇之巴什博弈)

博弈论之巴什博弈 巴士博弈:有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个(m<n)。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个物品,所以无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,故后者必然取胜。根据这样的规律,我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,0≤s≤m),那么先取者首先拿走s个...

酱懵静的博客 8338

MATLAB实现博弈论算法与实战案例

零和博弈是博弈论中的一个基础概念,描述的是一个游戏中所有参与者利益相加总和为零的情形。也就是说,一个参与者的收益恰好等于其他参与者的损失。这个概念最早可以追溯到18世纪,由数学家吉罗拉莫·卡尔达诺提出,并且被约翰·冯·诺伊曼在20世纪进一步发展。零和博弈的显著特征包括:利益对立:参与者之间的利益是完全对立的,一方的胜利必然导致另一方的失败。信息不对称:在很多实际的零和博弈中,参与者所持有的信息是不对称的,即某些参与者拥有比其他人更多的信息。策略互动。

weixin_42522857的博客 1190

数学知识——博弈论(巴什博奕、尼姆博奕、威佐夫博奕)思路及例题

争先恐后地博弈

WSY444的博客 5万+

基于博弈论的通信系统功率控制算法实战:MATLAB实现

博弈论的起源可以追溯到19世纪末,当时的数学家Zermelo提出了解决两人零和游戏的数学方法。然而,真正意义上的博弈论是由冯·诺依曼和奥斯卡·摩根斯坦在1944年出版的著作《博弈论与经济行为》中奠定的。在这本书中,他们提出了一套严谨的数学框架,用以分析竞争和合作下的理性决策过程。早期发展中的博弈论主要集中在零和游戏上,即一方的获益等于另一方的损失。这种游戏模型虽然简单,但无法涵盖现实世界中更复杂的互动。

weixin_42514750的博客 1050

博弈论与Python:从收益矩阵到纳什均衡的算法实现指南

在多方决策场景中,个体理性并不必然带来集体最优,这一现象广泛存在于定价竞争、资源分配与安全对抗中。博弈论为分析这类策略互动提供了严谨的数学模型,其中收益矩阵是描述参与者收益依赖关系的基础工具,也是判断策略优劣的核心载体。通过原理分析,可以借助Python将智猪博弈、矩阵博弈等经典模型转化为可运行的算法代码,包括劣势策略剔除、鞍点判定、线性规划求解混合策略以及纯策略纳什均衡扫描。这些技术方法不仅降低了对纯数学推导的依赖,还让均衡分析具备工程可复现性,便于工程师在竞价拍卖、激励机制设计、自动化决策系统等实际场景

weixin_34246529的博客 296

博弈论及算法实现(三种基础博弈)

一、巴什博弈(Bash Game) 只有一堆n个物品,两个人从轮流中取出(1~m)个;最后取光者胜。 考虑到 若n=m+1 那么 第一个人不论如何取都不能取胜。 进一步我们发现 若 n=k*(m+1)+r; 先取者拿走 r 个,那么后者再拿(1~m)个 n=(k-1)*(m+1)+s; 先取者再拿走s 个 最后总能造成 剩下n=m+1 的局面...

Source_Roc 8328

演化博弈论MATLAB编程.zip_matlab博弈论_matlab演化博弈_steepxj4_worthk2s_博弈仿真模拟

基于演化博弈的模拟仿真,特别是对于双方博弈过程中的演化趋势进行分析

博弈论算法及实现

https://www.cnblogs.com/keam37/p/3403695.html(转自该博客) 在生活中五子棋也是一种先手有必赢策略的游戏,有人会说五子棋先手我也会输啊,所以 博弈论问题都有个类似如“参与者足够聪明”,“两人都不犯错"的前提。 在此前提下,讨论几种常见的博弈情形。 {====================} 一、巴什博弈(Bash Gam...

weixin_30553065的博客 232

Emotion-LLaMA实战指南:从零构建多模态情感识别系统(附Python代码)

本文提供了Emotion-LLaMA多模态情感识别系统的实战指南。通过详细的步骤,指导读者从零搭建开发环境、运行本地Demo、理解模型架构,并完成数据处理与模型训练。该创新模型融合视觉、听觉与文本信息,实现更精准、接近人类理解的情感分析与推理,并附有完整的Python代码实现。

weixin_29094775的博客 415

linux下docker 部署onlyoffice社区版

Onlyoffice 是一款功能丰富的在线 Office 工具,类似 WPS 和 微软的 Office 套件。OnlyOffice Workspace 是由 OnlyOffice 推出的基于云计算的企业级在线协作办公平台,由文档服务(Document Server)、控制面板(Control Panel)、社区服务(Community Server)和邮件服务(Mail Server)四个组件构成,提供了文档、项目、成员、邮件等功能模块,支持文档多人协作、历史版本控制等功能,旨在帮助用户提高工作效率和工作质

axiaowua的博客 2382

博弈论算法的实现

不妨设还剩下a′a′个,因为不能不拿,所以0≤a′

m0_63185171的博客 263

解决Windows 10更新失败错误代码0x80070643

在Windows 10操作系统的更新过程中,用户时常会遇到各类错误代码,这些代码通常成为顺利完成更新的绊脚石。其中,错误代码0x80070643是一个较为常见的更新失败提示,它可能导致系统更新停滞不前。面对这一挑战,本文将详细介绍如何有效解决这一错误,帮助用户顺利完成Windows 10的更新。

nntxthml的博客 1827

博弈论算法的实现2

mex():mex():设集合S是一个非负整数集合,定义mex(S)mex(S)为求出不属于S的最小非负整数的运算,即:mes(S)=min[x],其中xmes(S)=min[x],其中x属于自然数,且xx不属于SS(用人话说就是不存在SS集合中的数中,最小的那个数)=0 时,因为肯定存在一个SG(xi)SG(xi)^x

m0_63185171的博客 835

TruckSim与Simulink联合仿真中的车轮转角精确控制策略

本文深入探讨了TruckSim与Simulink联合仿真中实现车轮转角精确控制的关键策略。针对多轴车辆路径跟踪时转角指令失灵的常见问题,核心在于正确配置TruckSim转向轴的外部输入模式(Advanced Settings),并确保仿真接口的稳定搭建。文章详细解析了从单轴到多轴协同转向的配置方法,并提供了提升MPC路径跟踪精度的实战技巧与调试经验。

weixin_29035147的博客 367

补洞与fairing算法

对网格进行补洞,remesh, 平滑,fairing, 最小二乘优化平滑

闪电彬彬的博客 1047

如何通过CFR算法实现德州扑克博弈论最优策略计算?

当我们面对德州扑克中的复杂决策树时,传统的人工分析往往难以应对指数级增长的决策分支。TexasSolver通过**反事实遗憾最小化(CFR)算法**的工程化实现,为扑克策略分析提供了数学上可证明的纳什均衡解。这个开源项目不仅是一个GTO求解器,更是博弈论在现实世界中的技术实践。 ## 核心理念:从直觉决策到数学最优 在德州扑克中,每个决策点都构成了一个庞大的信息集树。TexasSolver的设

gitblog_00138的博客 195

Unity AR开发实战:从Vuforia图片识别到实体识别全流程解析

增强现实(AR)技术通过计算机视觉算法将虚拟信息叠加到现实世界,其核心原理在于对现实环境的感知与理解。在移动端AR开发中,图像识别与物体识别是实现虚实融合的关键技术,它们决定了虚拟内容能否准确、稳定地与现实对象对齐。Vuforia作为成熟的商业AR SDK,为开发者提供了从平面图像识别(Image Target)到三维实体识别(Model Target)的完整解决方案,极大降低了计算机视觉技术的应用门槛。在工程实践中,Vuforia通过封装复杂的特征提取与匹配算法,使开发者能够专注于交互设计与内容制作,广泛

weixin_30972263的博客 301

基于Q-learning与博弈论的WSN覆盖漏洞恢复算法及MATLAB实现

无线传感器网络(WSN)中,覆盖漏洞是影响监测质量的动态问题。传统集中式优化方法难以适应节点随机部署和能量受限的场景。Q-learning作为一种分布式强化学习技术,结合博弈论的纳什均衡概念,能够实现节点自主决策与协同优化。该方案通过局部状态感知和收益函数设计,在降低通信开销的同时提升覆盖恢复能力,适用于环境监测、应急通信等大规模WSN应用。本文详细阐述算法设计、MATLAB仿真及参数调优经验。

weixin_32181267的博客 151

手把手教你学Simulink——无刷直流电机(BLDC)霍尔传感器(Hall Sensor)信号处理电路仿真

在中,转子位置靠​ 给出,换相逻辑(Commutation Table)据此决定。实际霍尔输出是,且常有:比较迟滞(内置或外加分压)RC 低通(防 EMI 尖刺)与 MCU 间想让你霍尔三相 UVW 理想方波(120° each, 换相每 60°elec)经观察:原始 HU/HV/HW、滤波后波形、整形后 TTL 电平验证换相表(001→100→010…)与转子转向匹配是破局关键。

amy_mhd的博客 38

【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC

案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou

「汽车电子助手」的博客 1697

基于博弈论的小区分簇算法MATLAB实现

基于博弈论的小区分簇算法MATLAB实现

rit8432499的博客 243

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 2021牛客OI赛前集训营-普及组(第七场)(A+B+C+D)
下一篇: 算法竞赛入门经典 每日一题(牛牛和字符串的日常)
郭晋龙
博客等级 码龄6年 940粉丝 449原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值