2.6-组合博弈入门
组合博弈入门
组合游戏
要求
- 有两个玩家;
- 游戏的操作状态是一个有限的集合(比如:限定大小的棋盘);
- 游戏双方轮流操作;
- 双方的每次操作必须符合游戏规定;
- 当一方不能将游戏继续进行的时候,游戏结束,同时,对方为获胜方;
- 无论如何操作,游戏总能在有限次操作后结束。
必败点和必胜点(P点&N点)
必败点(P点):上一个选手(Previous player)将取胜的位置成为必败点。
必胜点(N点):下一个选手(Next player)将取胜的位置成为必胜点。
必败(必胜)点属性
-
所有终结点是必败点(P点);
-
从任何必胜点(N点)操作, 至少有一种方法可以进入必败点(P点);
-
无论如何操作,从必败点(P点)都只能进入必败点(P点)。
取子游戏的算法实现
步骤1:将所有终结位置标记为必败点(P点);
步骤2:将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点),则将该点标记为必败点(P点);
步骤4:如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。
NIM游戏
NIM游戏是组合博弈中的经典游戏。游戏场景如下:有若干堆石子,每堆石子的数量都是有限的,游戏双方轮流从某一堆中取走任意数量的石子(至少取1个),取走最后一个石子的玩家获胜。
NIM游戏的二进制证明
设游戏中有 n n n 堆石子,各堆石子数分别为 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an。将这些石子数都表示成二进制形式。
定义NIM - 和为 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a n a_1\oplus a_2\oplus\cdots\oplus a_n a1⊕a2⊕⋯⊕an( ⊕ \oplus ⊕ 表示按位异或运算)。
-
定理:NIM游戏中,当且仅当 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a n = 0 a_1\oplus a_2\oplus\cdots\oplus a_n = 0 a1⊕a2⊕⋯⊕an=0 时,当前局面为必败局面;当 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a n ≠ 0 a_1\oplus a_2\oplus\cdots\oplus a_n\neq0 a1⊕a2⊕⋯⊕an=0 时,当前局面为必胜局面。
-
证明
-
终结局面:当所有堆石子数都为 0 0 0 时, 0 ⊕ 0 ⊕ ⋯ ⊕ 0 = 0 0\oplus0\oplus\cdots\oplus0 = 0 0⊕0⊕⋯⊕0=0,此时是必败局面。
-
必胜局面可转化为必败局面:若 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a n = k ≠ 0 a_1\oplus a_2\oplus\cdots\oplus a_n = k\neq0 a1⊕a2⊕⋯⊕an=k=0,则 k k k 的二进制表示中至少有一位为 1 1 1。在 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an 中一定存在一个 a i a_i ai,其对应的二进制位上也为 1 1 1。通过从第 i i i 堆中取走一定数量的石子,使得取走后这堆石子数变为 a i ′ a_i' ai′,满足 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a i − 1 ⊕ a i ′ ⊕ a i + 1 ⊕ ⋯ ⊕ a n = 0 a_1\oplus a_2\oplus\cdots\oplus a_{i - 1}\oplus a_i'\oplus a_{i+1}\oplus\cdots\oplus a_n=0 a1⊕a2⊕⋯⊕ai−1⊕ai′⊕ai+1⊕⋯⊕an=0。
-
必败局面只能转化为必胜局面:若 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a n = 0 a_1\oplus a_2\oplus\cdots\oplus a_n = 0 a1⊕a2⊕⋯⊕an=0,假设从第 i i i 堆取走石子后变为 a i ′ a_i' ai′,那么 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a i − 1 ⊕ a i ′ ⊕ a i + 1 ⊕ ⋯ ⊕ a n ≠ 0 a_1\oplus a_2\oplus\cdots\oplus a_{i - 1}\oplus a_i'\oplus a_{i+1}\oplus\cdots\oplus a_n\neq0 a1⊕a2⊕⋯⊕ai−1⊕ai′⊕ai+1⊕⋯⊕an=0。因为异或运算的性质决定了,改变其中一个数后,异或和必然改变。
-
SG函数
对于一个组合游戏的每个状态 x x x,定义其SG函数值 S G ( x ) SG(x) SG(x)。
-
计算方法:
-
首先,对于所有的终结状态 x x x, S G ( x ) = 0 SG(x)=0 SG(x)=0。
-
对于非终结状态 x x x,设 x x x 能通过一步操作到达的所有状态为 y 1 , y 2 , ⋯ , y k y_1,y_2,\cdots,y_k y1,y2,⋯,yk,则 S G ( x ) = m e x ( { S G ( y 1 ) , S G ( y 2 ) , ⋯ , S G ( y k ) } ) SG(x)=mex(\{SG(y_1),SG(y_2),\cdots,SG(y_k)\}) SG(x)=mex({SG(y1),SG(y2),⋯,SG(yk)}),其中 m e x mex mex 函数是求一个集合中未出现的最小非负整数。例如,若集合为 { 0 , 1 , 3 } \{0,1,3\} {0,1,3},则 m e x ( { 0 , 1 , 3 } ) = 2 mex(\{0,1,3\}) = 2 mex({0,1,3})=2。
-
-
作用:
- 当一个组合游戏可以拆分为多个子游戏时,整个游戏的胜负情况可以通过各个子游戏的SG函数值的异或和来判断。设整个游戏由 n n n 个子游戏组成,每个子游戏的当前状态对应的SG函数值分别为 S G 1 , S G 2 , ⋯ , S G n SG_1,SG_2,\cdots,SG_n SG1,SG2,⋯,SGn,则当 S G 1 ⊕ S G 2 ⊕ ⋯ ⊕ S G n = 0 SG_1\oplus SG_2\oplus\cdots\oplus SG_n = 0 SG1⊕SG2⊕⋯⊕SGn=0 时,当前游戏局面为必败局面;当 S G 1 ⊕ S G 2 ⊕ ⋯ ⊕ S G n ≠ 0 SG_1\oplus SG_2\oplus\cdots\oplus SG_n\neq0 SG1⊕SG2⊕⋯⊕SGn=0 时,当前游戏局面为必胜局面。这使得我们可以将复杂的组合游戏分解为简单子游戏来分析胜负情况。
组合游戏的并
定义:组合游戏的并是指将多个组合游戏同时进行的一种游戏形式。假设有 k k k 个组合游戏 G 1 , G 2 , ⋯ , G k G_1, G_2, \cdots, G_k G1,G2,⋯,Gk,组合游戏的并 G = G 1 + G 2 + ⋯ + G k G = G_1 + G_2 + \cdots + G_k G=G1+G2+⋯+Gk。在游戏 G G G 中,玩家的一步操作是在 G 1 , G 2 , ⋯ , G k G_1, G_2, \cdots, G_k G1,G2,⋯,Gk 中的某一个游戏中进行一步合法操作。
SG 定理:对于组合游戏的并 G = G 1 + G 2 + ⋯ + G k G = G_1 + G_2 + \cdots + G_k G=G1+G2+⋯+Gk,其某状态的 S G SG SG 值等于各个子游戏在相应状态下 S G SG SG 值的异或和,即 S G ( G ) = S G ( G 1 ) ⊕ S G ( G 2 ) ⊕ ⋯ ⊕ S G ( G k ) SG(G)=SG(G_1)\oplus SG(G_2)\oplus\cdots\oplus SG(G_k) SG(G)=SG(G1)⊕SG(G2)⊕⋯⊕SG(Gk)。这个定理非常重要,它使得我们可以通过分别计算各个子游戏的 S G SG SG 值,再求异或和来判断组合游戏并的胜负情况。
以下是一个简单示例代码,展示如何利用 SG 定理计算组合游戏的并的胜负情况(假设已有 sg 函数用于计算单个游戏状态的 S G SG SG 值)
#include<bits/stdc++.h>using namespace std;// 假设已经有了计算单个游戏 SG 值的函数 sgint sg(int state) {// 具体实现省略,根据实际游戏规则编写return 0; }计算组合游戏的并的 SG 值int combinedSG(int numGames, int* states) {int result = 0;for (int i = 0; i < numGames; ++i) {result ^= sg(states[i]);}return result;}// 判断胜负示例函数void determineWinner(int numGames, int* states) {int combinedSgValue = combinedSG(numGames, states);if (combinedSgValue == 0) {cout << "当前局面为必败局面" << endl;}else {cout << "当前局面为必胜局面" << endl;}}int main() {int numGames = 3; // 假设有 3 个子游戏int states[3] = {1, 2, 3}; // 各个子游戏的状态determineWinner(numGames, states);return 0;}
相关文章:
2.6-组合博弈入门
组合博弈入门 组合游戏 要求 有两个玩家;游戏的操作状态是一个有限的集合(比如:限定大小的棋盘);游戏双方轮流操作;双方的每次操作必须符合游戏规定;当一方不能将游戏继续进行的时候…...
【教学】推送docker仓库
引言 Docker Hub 这个最常见的公共 Docker 仓库为例,本文将介绍如何把本地 Docker 镜像推送到公共 Docker 仓库 1. 注册 Docker Hub 账号 如果你还没有 Docker Hub 账号,需要先在 Docker Hub 官网 进行注册。注册完成后,记住你的用户名和密…...
【大数据技术】本机PyCharm远程连接虚拟机Python
本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …...
3060显卡掉帧是为什么?3060掉帧卡顿解决方法
NVIDIA GeForce RTX 3060是一款性能强劲的显卡,它可以在高画质的情况下运行大多数的游戏,但是也有一些用户反映,3060玩游戏时会出现掉帧和卡顿的现象,这让很多玩家感到困扰。那么,3060显卡掉帧是什么原因呢?…...
Kubernetes集群通过Filebeat收集日志
Filebeat收集容器日志,其中NODE_NAME配置,是将node信息添加到日志中,所以需要serviceAccount权限,如果不需要配置NODE信息,可以不创建serviceAccount,其他内容可根据实际情况修改 apiVersion: v1 kind: Ser…...
SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具
SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具 一、SQLAIchemy的介绍二、数据库引擎1、支持的数据库1.1、sqlite数据库1.2、MySQL数据库1.3、数据库引擎的参数 三、定义模型类1、定义模型2、engine负责数据库迁移 四、alembic数据库迁移⼯具1、安装alembic2、初始化alemb…...
[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统
软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术:JavaScript、VUE.js(2.X)、css3 开发工具:pycharm、Visual Studio Code、HbuildX 数据库:MySQL 5.7.26&am…...
Python3中异常处理:try/except语句
一. 简介 什么是异常处理 ? 在 Python中,异常处理是一种用于管理程序运行时错误的机制。通过使用异常处理,你可以编写更加健壮和可靠的代码。 Python 提供了 try,except,else和 finally关键字来处理异常,…...
[ Spring] Integrate Spring Boot Dubbo with Nacos 2025
文章目录 Dubbo Project StructureDeclare Plugins and RepositoriesIntroduce DependenciesDubbo Consumer PropertiesDubbo Provider ApplicationDubbo Provider ServiceDubbo Consumer PropertiesDubbo Consumer ApplicationDubbo Consumer ControllerCommand References Du…...
【3分钟极速部署】在本地快速部署deepseek
第一步,找到网站,下载: 首先找到Ollama , 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 ,文件不是很大,下载也比较的快 第二部就是安装了 : 安装完成后提示…...
【QT笔记】使用QScrollArea实现多行文本样式显示
目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够,无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域,允许用户滚动查看比当前可视区域更大的内容…...
大模型中提到的超参数是什么
在大模型中提到的超参数是指在模型训练之前需要手动设置的参数,这些参数决定了模型的训练过程和最终性能。超参数与模型内部通过训练获得的参数(如权重和偏置)不同,它们通常不会通过训练自动学习,而是需要开发者根据任…...
【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据
一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址: https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动,会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…...
UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理
UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理? 问题描述: UE成功打包APK并安装过后,启动应用时提示: No Google Play Store KeyNo OBB found and no store key to try to download. Please setone …...
OKHttp拦截器解析
OKHttp涉及到拦截器大概的执行步骤为: 1.通过newCall生成RealCall对象 具体代码如下: Override public Call newCall(Request request) {return new RealCall(this, request, false /* for web socket */);}2.调用Call的execute方法 当然这也可以是执…...
STM32标准库移植RT-Thread nano
STM32标准库移植RT-Thread Nano 哔哩哔哩教程链接:STM32F1标准库移植RT_Thread Nano 移植前的准备 stm32标准库的裸机代码(最好带有点灯和串口)RT-Thread Nano Pack自己的开发板 移植前的说明 本人是在读学生,正在学习阶段&a…...
c++11总结26——std::regex
std::regex 是 C11 引入的 正则表达式库,用于 字符串匹配、搜索和替换。 🔹 头文件:#include <regex> 🔹 命名空间:std 🔹 支持的匹配模式:ECMAScript(默认)、POS…...
langchain教程-12.Agent/工具定义/Agent调用工具/Agentic RAG
前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...
leetcode_双指针 125.验证回文串
125.验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s,如果它是回文串 ,返回 true ÿ…...
ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
文章目录 (文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练目标项目概述代码结构概述1. **主要类和文件**2. **命名空间和使用指令**3. **数据类 (TransactionObservation)**4. **主程序入口 (Main 方法)**5. **数据预处理 (DataPrepr…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
