全景图网站怎么做/石家庄自动seo
组合博弈入门
组合游戏
要求
- 有两个玩家;
- 游戏的操作状态是一个有限的集合(比如:限定大小的棋盘);
- 游戏双方轮流操作;
- 双方的每次操作必须符合游戏规定;
- 当一方不能将游戏继续进行的时候,游戏结束,同时,对方为获胜方;
- 无论如何操作,游戏总能在有限次操作后结束。
必败点和必胜点(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…...

【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合
一、题目描述 某公司研发了一款高性能AI处理器,每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0~3的处理器处于同一链路中,编号4~7的处理器处于另外一个链路中,不同链路中的处理器不能通信,如…...

edu小程序挖掘严重支付逻辑漏洞
edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号,直接搜索引擎搜索即可得到,这就不用多说了,但是这里的手机号可以任意输入,只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…...

力扣 279. 完全平方数
🔗 https://leetcode.cn/problems/perfect-squares 题目 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量完全平方数可以拆解为两个相同数的乘积 思路 dp 公式,就是从看用哪个完全平方数 1 2 4 9…… 到当前 sum 的数量最少 代码 …...

鸿蒙生态潮起:开发者的逐浪之旅
鸿蒙生态潮起:开发者的逐浪之旅 在全球科技的澎湃浪潮中,鸿蒙生态宛如一座正在崛起的新大陆,熠熠生辉,吸引着无数开发者扬帆起航,探寻其中蕴藏的无限机遇,也直面诸多挑战。 鸿蒙生态的机遇,首先…...

Diskgenius系统迁移之后无法使用USB启动
前言 本文用于记录系统迁移中遇到的问题及解决方法,如有不对请指出,谢谢! 现象 使用DiskGenius进行系统迁移后,使用USB启动失败,反复在品牌logo和黑屏之间切换,期间还会在左上角显示”reset system“报错…...

Kafka 可靠性探究—副本刨析
Kafka 的多副本机制提升了数据容灾能力。 副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据;服务副本指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。 1 副本刨析 1.1 相关概念 AR&…...

我的博文天地测试报告
我的博文天地测试报告 文章目录 我的博文天地测试报告 一.项目背景 二.项目功能 2.1 功能介绍 三.测试分类 3.1 功能测试 3.1.1 测试用例 3.1.2 实际执行测试的部分操作步骤/结果的截图 3.2 自动化测试 3.3 性能测试 3.1.2 用户登录 jmeter性能测试结果 性能测试遇到的困难 …...

EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析
EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析 0 预览一 该文件功能`pdo_list.c` 文件功能函数预览二 函数功能介绍`pdo_list.c` 中主要函数的作用1. `ec_pdo_list_init`2. `ec_pdo_list_clear`3. `ec_pdo_list_clear_pdos`4. `ec_pdo_list_total_size`5. `ec_pdo_list_a…...

嵌入式开发神器:Buildroot的介绍和使用方法
目录 引言**Buildroot 能做什么?****1. 生成交叉编译工具链(Toolchain)****2. 生成嵌入式 Linux 根文件系统(RootFS)****3. 编译 Linux 内核和设备树文件****4. 编译 Bootloader(U-Boot)****5. …...

JavaScript系列(61)--边缘计算应用开发详解
JavaScript边缘计算应用开发详解 🌐 今天,让我们深入探讨JavaScript的边缘计算应用开发。边缘计算是一种将计算和数据存储分布到更靠近数据源的位置的架构模式,它能够提供更低的延迟和更好的实时性能。 边缘计算基础架构 🌟 &am…...