当前位置: 首页 > news >正文

博弈论1:拿走游戏(take-away game)

假设你和小红打赌,玩“拿走游戏”,输的人请对方吃饭....

你们面前有21个筹码,放成一堆每轮你或者小红可以从筹码堆中拿走1个/2个/3个;第一轮你先拿,第二轮小红拿,你们两个人交替进行;拿走筹码堆中最后的一个的人赢得游戏。

是不是摩拳擦掌可以开始玩啦?你拿了两个,小红拿了三个...作为观众的我开始记录你们每轮交替拿走后,筹码堆中剩余筹码的数量(黑色代表你拿走之后的筹码剩余数,红色则代表小红拿走之后的):

19;16;15;12;11;8;6;4;2;0

omg,小红拿走了最后一个筹码(她拿完后剩余筹码数变成0)。小红完美获胜!

输了游戏的你得请吃饭了....(顺便请下我)bushi)

下次还玩吗?

我偷偷告诉你,这个游戏有“必胜策略”。

请带着耐心往下看。

(碎碎念:第一部分“无偏组合游戏”的定义会有些枯燥,如果只想看制胜策略的话,可以跳过第一部分,直接看第二部分

目录

一、无偏组合游戏(impartial combinational games)

1.组合游戏特点:

2.无偏游戏特点

3.组合游戏定义

二、拿走游戏的“制胜策略” 

1.逆向推理(反向归纳法)(难推)

2.P&N positions解法(推荐)


一、无偏组合游戏(impartial combinational games)

拿走游戏属于一种无偏组合游戏,所以下面先介绍无偏组合游戏。

1.组合游戏特点:

设定如下:

  • 两个玩家,I与II
  • 完整信息(perfect information)
  • 没有随机性(no chance move)
  • 要么赢,要么输

比如开头的拿走游戏,就是你与小红两个玩家,你们都能看到场上的筹码和对方每轮的动作,你们一旦确定拿走几个筹码,就一定能拿走几个筹码;最后不可能平局,总会有个人拿走最后一个筹码,成为赢家,而另一个人成为输家。

2.无偏游戏特点

要求:

  • 在每个位置,对于玩家I和玩家II的行动是同等的。也就是说,两个玩家的可选策略是相同的,且游戏的状态仅依赖于当前配置,而与玩家的身份无关。(比如上面提到的拿走游戏,不会因为你是小红还是小明,你是玩家I还是玩家II而影响策略)

有偏游戏则与无偏游戏的要求相反。(比如一些英雄游戏,你们的角色会影响你们的策略)

3.组合游戏定义

同时满足下列条件的游戏称作组合游戏:

  • 两个玩家,I与II
  • 一套通常有限的可能位置(positions)
  • 游戏规则指定了两个玩家的合法行动;若规则对于两个玩家没有差别,则为无偏游戏,反之为有偏游戏。
  • 玩家I和II交替行动
  • 抵达其中一个位置时,游戏结束,同时下一个玩家无法行动。一般(normal)游戏规则是,最后一个完成行动的玩家获胜;misère(不幸)游戏规则相反,最后一个完成行动的玩家输掉游戏。
  • 如果游戏永远不结束,陷入了平局(draw),必须要增加额外条件(也就是增加Ending Condition),来终结平局,评出胜负。
  • 无论两个玩家怎么行动,最终游戏都能在有限步内结束

二、拿走游戏的“制胜策略” 

1.逆向推理(反向归纳法)(难推)

19;16;15;12;11;8;6;4;..

回顾最开始你与小红的游戏过程,其实小红把筹码拿到只剩4个的时候,你就能意识到无论如何自己都输了。如果自己拿走1个,那么还剩3个;拿走2个剩2个;拿走3个剩1个。而无论自己拿走多少,剩的1/2/3个小红都能一次性全部拿走,取得游戏胜利。

于是逆向推理一下,如果自己想要赢,需要走到“4”的位置,也就是拿完筹码还剩4个。

我们要想拿完筹码还剩4个,出发点就得是5/6/7(也就是小红拿完后剩余的筹码数量)。

为了让小红拿完后还剩5/6/7,小红开始拿的时候就还得剩8个.....

我们把拿完就必胜的位置定义成“P-positions”,可以发现P-positions有:4,8,12,16,20.也就是说,只要你拿完了还剩4个或8个或其他P位置,只要你按制胜策略继续走下去,就一定能赢。

2.P&N positions解法(推荐)

P位置,即positions that are winning for the Previous player (the player who just moved),拿完走到这个位置的玩家获胜。

N位置,即 winning for the Next player to move,拿完之后走到这个位置,你的对手玩家(也就是下一轮行动的玩家)会获胜。

要想赢拿走游戏,我们只需要四个步骤:

 1)标记终点为P位置。(本游戏中,0为P位置)

2)有路径可以抵达P位置的标记为N位置。(1,2,3都可以抵达0,故1,2,3都为N)

3)只能到达N位置的标记为P位置。(4只能到达1,2,3,故4为P)

4)重复2)3)直至游戏中所有有限可达位置都被标记为P&N。

本游戏标记下来就是:

位置:0  1  2  3  4  5  6  7  8  9  10  11  12 13 14  15  16  17  18  19  20  21

P/N:    P N N  N  N  N N   N  N   N    N   N    N    P  N   N    N    P    

于是你可以总结规律(注意,不同游戏规则下这个规律不一样):

P位置是4k;N位置是4k+1, 4k+2,4k+3.你需要努力走到4k的位置。

怎么证明你找到的规律是正确的?

1)证明终点是P点(即走到终点一定能获胜)

2)证明任何N点都能走到P点(对应4k+1, 4k+2,4k+3,我们拿走1/2/3个筹码一定能走到4k) 

3) 证明任何P点都只能走到N点(对于4k,走不到4k的位置,只能走到4k+1或4k+2或4k+3的N位置)

学会了吗~学会了拿14个筹码,每次只能拿走1/3/4个筹码试一试哟~

相关文章:

博弈论1:拿走游戏(take-away game)

假设你和小红打赌,玩“拿走游戏”,输的人请对方吃饭.... 你们面前有21个筹码,放成一堆;每轮你或者小红可以从筹码堆中拿走1个/2个/3个;第一轮你先拿,第二轮小红拿,你们两个人交替进行;拿走筹码堆…...

Debezium OracleValueConverters 分析

Debezium OracleValueConverters 分析 目录 1. 概述2. 核心功能3. 数据类型映射4. 特殊场景处理5. 最佳实践6. 使用示例7. 常见问题8. 扩展建议9. 总结1. 概述 OracleValueConverters 是 Debezium Oracle 连接器中负责数据类型转换的核心类,它继承自 JdbcValueConverters。主…...

WPF 消息循环(二)

们已经知道,win32/MFC/WinForm/WPF 都依靠消息循环驱动,让程序跑起来。 这里就介绍 WPF 中是如何使用消息循环来驱动程序的。 1. 背景 只听说过 Dispatcher ,哪里来的消息循环? WPF 启动运行堆栈: > WpfApp1.…...

ubuntu上更改ext4格式的硬盘为 windows的 NTFS 格式参考

1. ubuntu上安装 sudo apt-get install gparted 2. 参考如下,下面是转换后的样例。 3.windows上添加识别新硬盘参考 先在设备管理器中 找到下面 磁盘管理 如下:找到类似下面的磁盘2 查看相关信息 右键可以新建卷和格式化,下面是已经新建…...

Fastapi教程:使用 aioredis 连接池执行Redis 的高效异步操作

在构建高性能的 Web 应用时,缓存系统是一个至关重要的组成部分。Redis 是最常见的缓存系统之一,它提供了高效的存储与读取机制。然而,在与 Redis 进行频繁交互时,创建和销毁连接可能会成为瓶颈。为了优化这一问题,我们…...

配置mysqld(读取选项内容,基本配置),数据目录(配置的必要性,目录下的内容,具体文件介绍,修改配置)

目录 配置mysqld 读取选项内容 介绍 启动脚本 基本配置 内容 端口号 数据目录的路径 配置的必要性 配置路径 mysql数据目录 具体文件 修改配置时 权限问题 配置mysqld 读取选项内容 介绍 会从[mysqld] / [server] 节点中读取选项内容 优先读取[server] 虽然服务…...

docker 容器相互访问

目前采用 network 方式 1. 创建自定义网络 docker network create network-group 如下 2. 相互访问的容器更改(目前演示redis 以及netcore api 访问redis ) //redis 原有容器删除 跟之前区别就是加入 --network network-group docker run \ -p 6379:…...

算法1(蓝桥杯18)-删除链表的倒数第 N 个节点

问题: 给你一个链表,删除链表的倒数第 n 个节点,并且返回链表的头节点。 输入:head 1 -> 2 -> 3 -> 4 -> 5 -> null, n 2 输出:1 -> 2 -> 3 -> 5 -> null输入:head 1 ->…...

【PyTorch】动态调整学习率 torch.optim.lr_scheduler.StepLR 调度器

文章目录 1. torch.optim.lr_scheduler.StepLR 官方文档详解2. 使用示例2.1 官方提供使用示例2.2 自己写代码测试方法2.2.1 get_last_lr() 方法2.2.2 state_dict() 方法2.2.3 load_state_dict() 保存和加载调度器 3. 思考3.1 为什么需要state_dict()3.2 get_lr() 与 get_last_l…...

AIGC drug design 人工智能生成式药物设计:基于 GPT 的 SMILES 生成与应用

人工智能生成式药物设计:基于 GPT 的 SMILES 生成与应用 1. 人工智能生成模型:解密 GPT 的工作原理 目录 引言 1.1 背景介绍 1.2 人工智能生成模型的兴起 1.3 GPT 系列模型的地位与影响 GPT 模型概述 2.1 什么是 GPT 2.2 GPT 的发展历程 2.3 GPT 与其…...

Python面试常见问题及答案4

一、内存管理相关 问题:Python中的垃圾回收机制是如何工作的? 答案:Python主要使用引用计数来进行垃圾回收,当对象的引用计数为0时,该对象就会被垃圾回收器回收。此外,Python还有一个循环垃圾收集器来处理循…...

开启第二阶段---蓝桥杯

一、12.10--数据类型的范围及转化 今天是刚开始,一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型,如果数值超出了 int 的范围,就会发生溢出错误。为了避免这个问题,可以将数字表示为 long 类型,方法…...

npm内存溢出

项目过大运行项目内存溢出 报错代码 运行内存溢出 increase-memory-limit ‘“node --max-old-space-size8192”’ 不是内部或外部命令,也不是可运行的程序 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of m…...

回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 CNN-BiGRU,即卷积神经网络(CNN)与双…...

Android系统卡启动问题排查

Android系统启动正常来说会涉及到如下几个过程: 引导加载程序(Bootloader)Linux内核(Kernel),负责硬件抽象、内存管理、进程管理、网络堆栈等init进程 init进程读取init.rc配置文件,用于启动各…...

STP(生成树协议)

STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动…...

【前端面试】随机、结构赋值、博弈题

解构赋值(Destructuring Assignment)是 JavaScript ES6 引入的一项非常有用的特性,它允许我们快速地从数组或对象中提取值,并将它们赋给变量。这种方式使得代码更加简洁、易读,并且能够减少重复的访问和赋值操作。 1.…...

Volta——开箱即用的Node.js 版本管理工具

Volta volta 是一个较新的 Node.js 版本管理器,旨在简化 Node.js 和其他工具的安装和管理,在 2019 年出世,仍在积极开发中。Volta 采用了与 nvm 不同的方法:它不是管理 Node.js 的多个版本,而是管理项目及其依赖项。当…...

ubuntu 磁盘空间满,找不到占用文件的目录

解决方法: 检查磁盘空间: 执行 df -h 查看各分区磁盘使用情况。 查找大文件或目录: 执行 du -sh /* 2>/dev/null 查找根目录下的大文件或目录,再逐一进入子目录使用相同命令查找。 清理缓存和临时文件: 清理 /t…...

1. 机器学习基本知识(5)——练习题(参考答案)

20.🔗本章代码笔记📓链接(需要🪜):(01_the_machine_learning_landscape.ipynb - Colab (google.com)) 如果你不想通过上面的官方网址下载本章的笔记,还可以在本篇博文的…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...