博弈论入坑

2024-02-17 22:38
文章标签 博弈论 入坑

本文主要是介绍博弈论入坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

我喜欢游戏,我知道有些游戏无论我怎样努力最后的结果一定是输的,或者是无论怎样玩我都是赢得,这样的一类游戏从一开始就知道结果的游戏,一定会有一种数学方法去描述。

Nim博弈

所谓的Nim的博弈就是一种从一开始就知道胜负的游戏。这是一种两个人玩的游戏,玩家双方面对一堆硬币(或者石头或者豆粒)。(假设有k>=1堆硬币,每堆分别有 n 1 , n 2 , n 3 … … n k {n_1,n_2,n_3……n_k} n1,n2,n3nk枚硬币。游戏的目标就是取得最后一枚硬币。每个玩家只能任选一堆去拿不少于1个硬币。率先拿完所有硬币的玩家获胜。

我们来看其中的某种特殊情况:

首先是如果只有一堆,先手一下全拿完,先手必胜。第二种是有两堆,数量为n1、n2,如果n1!=n2先手的策略就是拿多的那一堆,拿完后使得两堆相等,这样重复让两堆相等那么肯定先手会赢;反之如果n1==n2先手必败。

而如果是很多堆,或者是玩法并不是拿任意>=1的硬币,而是规定硬币的个数怎么办呢???

SG函数

这里我就不给出证明过程了,直接说结论和解题方法。

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

我们就可以定义一下sg(x) = mex{sg(y)|y是x的后继}这里的后继指的是存在x转换成y的方法,即对于1堆硬币来说原先有y个硬币,能通过一次move得到y枚硬币。sg(x)是对于一个游戏的子问题来说的,也就是其中一堆硬币,最后我们需要算出所有的sg值,然后进行异或运算g(G1)g(G2)…^g(Gn) = 0先手必败,不为0先手必胜。

get_sg代码

int f[maxn];      // 可以取的石子个数 idx[1~n]
int sg[maxn];     // 0 ~ n sg函数的值
int isin[maxn];   // mex{} 
void getSG(int n)
{memset(sg, 0, sizeof(sg));for(int i = 1; i <= n; i++) {memset(isin, 0, sizeof(isin));for(int j = 1; f[j] <= i; j++) {isin[sg[i-f[j]]] = 1;}for(int j = 0; j <= n; j++) {if(isin[j]==0) {    sg[i] = j;break;}}}
}

一些特例

1.可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1) 这其实就是巴什博奕。

2.可选步数为任意步,SG(x) = x,这其实是Nim博弈原型。

3.可选步数为一系列不连续的数,用getSG()计算,这是Nim博弈变式。

一道题

小米OJhttps://code.mi.com/problem/list/view?id=117&cid=4

这道题是在堆的数量为2,只能拿斐波那契数的一个特例。

代码:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int maxn = 1e4 + 10;
int f[maxn];      // 可以取的石子个数 idx[1~n]
int sg[maxn];     // 0 ~ n sg函数的值
int isin[maxn];   // mex{} 
void get_f() {f[1] = 1;f[2] = 2;for(int i = 3; f[i-1] < maxn; i++) {f[i] = f[i-1] + f[i-2];}
}int main() 
{get_f();getSG(maxn);int num1, num2;while(cin >> num1 >> num2) {if((sg[num1]^sg[num2])==0) {cout << "Xiaobing Win" << endl;}else {cout << "Xiaoai Win" << endl;}}return 0;
}

这篇关于博弈论入坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/719194

相关文章

博弈论(Nim 游戏)

公平组合游戏ICG 若—个游戏满足: 由两名玩家交替行动;在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;不能行动的玩家判负; 则称该游戏为一个公平组合游戏。 NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件 2 2 2 和条件 3 3 3。 可以看出,公平组合游戏不存在平局,而且

博弈论+递推+调和级数枚举,CF 1033C - Permutation Game

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1033C - Permutation Game 二、解题报告 1、思路分析 我们考虑一个位置符合什么条件可以必胜? 如果可以跳到一个必败的位置 考虑最大的格子一定是必败 而每个格子只能跳到比自己大的格子 于是我们就可以倒序处理状态 对于每个格子枚举比自己大

前端新手小白的Vue3入坑指南

昨天有同学说想暑假在家学一学Vue3,问我有没有什么好的文档,我给他找了一些,然后顺带着,自己也写一篇吧,希望可以给新手小白们一些指引,Vue3欢迎你。 目录 1 项目安装 1.1 初始化项目 1.2 安装初始化依赖 1.3 启动项目  2  一定会用的第三方库 2.1 js-tool-big-box 2.2 less或者sass预处理器 2.3 axios请求库 2.4 UI

PyTorch 入坑十:模型泛化误差与偏差(Bias)、方差(Variance)

问题 阅读正文之前尝试回答以下问题,如果能准确回答,这篇文章不适合你;如果不是,可参考下文。 为什么会有偏差和方差?偏差、方差、噪声是什么?泛化误差、偏差和方差的关系?用图形解释偏差和方差。偏差、方差窘境。偏差、方差与过拟合、欠拟合的关系?偏差、方差与模型复杂度的关系?偏差、方差与bagging、boosting的关系?偏差、方差和K折交叉验证的关系?如何解决偏差、方差问题? 本文主要参考知

专业学习|博弈论-博弈论概述

(一)认识博弈论:解析复杂决策与策略 (1)认识博弈         博弈论广泛应用于分析个体间因利益冲突而产生的决策问题。通过构建不同模型来探讨如经贸关系、军事威胁等问题,旨在寻找均衡解并提供新知,相较于计量经济学方法更为困难。政策制定与个体响应构成典型的博弈问题,反映上层政策与下层对策间的动态互动。         采用博弈建模是希望首先这个模型是可驾驭的,即一定是能够分析出均衡均衡

【读书笔记】《博弈论》ing

《博弈论》 朱富强著 June 7th ,2014 生活中的博弈论(game theory)   1.基于长远利益视域的理性理解   “一般的,人类与动物的重要区别就在于:人具有追求长期利益的理性,从而能约束自己的短视行为;相反,如果个体在采取行动时只是权衡一次性互动的功利量,那么也就等同动物的每一次斗争行为了。”    贪嘴一次,因猎奇心抽一次烟,偷吃一次禁果……这些按照现代主流经济

专业学习|博弈论-课程沿革

学习来源:北京大学刘霖《博弈论》MOOC公开课 备注:仅做学习分享,请勿转载,转载必究! (一)博弈论的预备知识         基本的微积分的知识和概率论的知识。简单的说会求导数,会求简单的积分,知道概率分布的含义、几种简单的概率分布,会求数学期望,了解贝叶斯法则。         博弈论本身的思维方式跟常规的思维方式不一样,要求你具有比较好的逻辑思维能力,以及基本的这个数学知识。内

耶鲁博弈论公开课笔记

这两周我看完了耶鲁大学的博弈论公开课,收获非常大,系统地了解了博弈论中的主要概念和方法,主要包括以下内容:    1. 首先是了解了很多的博弈模型,包括同步博弈中的古诺模型、伯川德模型、候选人-选民模型、谢林模型和序贯博弈中的最后通牒和讨价还价博弈、stackberg博弈、消耗战博弈以及不完整信息下的博弈、信息不对称博弈、重复博弈等众多博弈类型。我觉得最重要的是对问题进行抽象建立博弈模

策梅洛定理 (博弈论): Zermelo's theorem

很有意思的一个定理。 转载地址为http://blog.sina.com.cn/s/blog_4b91d3b501010hcj.html 策梅洛定理(英语:Zermelo's theorem)是博弈论的一条定理,以恩斯特·策梅洛命名。定理表示在二人的有限游戏中,如果双方皆拥有完全的资讯,并且运气因素并不牵涉在游戏中,那先行或后行者当中必有一方有必胜/必不败的策略。若应用至国际象棋,则策梅

博弈论习题分析

博弈论习题分析       推荐文章论文:http://wenku.baidu.com/view/b0a2421ca76e58fafab00359.html   一:URAL1180.取石子游戏 1180.取石子游戏 两个Nikifor在玩一个好玩的游戏。 这里有一堆总数为n的石子。 两个Nikifor轮流从石子堆中取石子。 每一个人可以取任意2的非负整数次幂个石子。 取到最后一个石子的