浅谈博弈论之Nim初步(xor正确性的浅显证明)
引入
在许多地方曾流行过这样一个小游戏:摆出三堆硬币,分别包含3枚,5枚,7枚。两人轮流行动,每次可任选一堆,从中取走任意多枚硬币,可把一堆取光,但不能不取,取走最后一枚硬币者获胜。
概念
\(先手:\)当前行动的一方
\(局面:\)面临的游戏状态
\(必败:\)指在当前局面下无论采取什么策略,都会输掉游戏
\(先手必胜:\)指当前局面下,采取最优策略能让对手面临必败局面的状态
\(Nim游戏:\)给定\(n\)堆物品,第\(i\)堆有\(A_{i}\)个,两名玩家轮流行动,每次可任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手能否必胜。
\(Nim\)博弈需要判断是否先手必胜,那么该如何来判断呢?
结论
\(Nim博弈\)先手必胜,当且仅当\(A_{1} xor A_{2} xor...xor A_{n}\ne0\)
证明
首先我们可以知道,当所有物品已经被取完时,是个必败局面
这时有\(A_{1} xor A_{2} xor...xor A_{n}=0\)
而当\(A_{1} xor A_{2} xor...xor A_{n}\ne0\),我们显然可以取走某一堆石子上二进制上的某几个'1',来使它异或和为0(关于证明网上有很多,不再于此作出赘述)。
那么问题来了,为什么通过把各堆石子数异或起来判断是否为先手必胜的方法是对的呢?
我们知道,当石子堆数为偶数且各堆石子数相同时,先手必败(为了便于称呼,我在这里把它称为同偶局面),因为无论我做什么,只要对手和我使用一样的策略,那最后输的肯定是我。(~自己yy一下就明白了拉)
此时显然有\(A_{1} xor A_{2} xor...xor A_{n}=0\)
那么对于任意满足\(A_{1} xor A_{2} xor...xor A_{n}=0\)的局面,都能看作同偶局面
我每作一次操作,对手总能作出相应的操作来让异或和保持为0(在二进制下找到相对应的1)
那么我们可以把它看作在同偶局面下取同样数目的石子(~感性理解一下拉)
举个例子:
两堆石子:2 2 二进制:10 10
三堆石子:1 2 3 二进制:1 10 11
若我们把第二组例子下的11变为10,那么只要把1变成0就能成为同偶局面
再举个例子
2 5 7 二进制:10 101 111
无论怎么取,我们都能找到对应位上的1,再进一步转换为同偶局面
(可以理解为每一种满足\(A_{1} xor A_{2} xor...xor A_{n}=0\)的局面总能转换为某个同偶局面)
而对于异或和不为0的局面呢?
通过上述证明,我们可以得到,当异或和不为0时,此局面必然无法转换为同偶局面
而我们可以通过某种策略(必然存在)让对手面临异或和为0的局面(只要把多余的1取走就好了)
到这里,我们可以的到,异或是对的
证毕
浅谈博弈论之Nim初步(xor正确性的浅显证明)的更多相关文章
- 浅谈博弈论中的两个基本模型——Bash Game&&Nim Game
最近在数学这一块搞了蛮多题目,已经解决了数论基础,线性代数(只有矩阵,行列式待坑),组合数学中的一些简单问题.所以接下来不可避免的对博弈论这一哲学大坑开工. 当然,由于我很菜,所以也只能从最基础最容易 ...
- 浅谈公平组合游戏IGC
浅谈公平组合游戏IGC IGC简介 一个游戏满足以下条件时被叫做IGC游戏 (前面三个字是自己YY的,不必在意) 竞争性:两名玩家交替行动. 公平性:游戏进程的任意时刻,可以执行的操作和操作者本人无关 ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
- 浅谈HTTPS以及Fiddler抓取HTTPS协议
最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...
- 浅谈struts2之chain
转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...
- 关于AngularJS学习整理---浅谈$scope(作用域) 新手必备!
作为初次接触 AngularJS的新手,想要深层理解里面的内容短时间还是不可能的,所以标题写了浅谈字样,以下内容是参考各位大神以及相关书籍整理加个人理解,出现错误的地方请大家指正. $scope(作用 ...
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- 浅谈Java线程安全
浅谈Java线程安全 - - 2019-04-25 17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...
- MVC模式浅谈
MVC模式浅谈 一.MVC模式概述 模型-视图-控制器(MVC模式)是一种非常经典的软件架构模式,在UI框架和UI设计思路中扮演着非常重要的角色.从设计模式的角度来看,MVC模式是 一种复合模式,它将 ...
随机推荐
- JUC——并发集合类
如果要进行多个数据的保存,无疑首选类集(List.Set.Queue.Map),在类集的学习的时候也知道一个概念:许多集合的子类都具有同步与异步的差别,但是如果真的要在多线程之中去使用这些类,是否真的 ...
- 2.深入解析数据类型与变量——《Excel VBA 程序开发自学宝典》
2.1 数据类型 数据类型 所占字节 Byte 1 Boolean 2 Integer 2 Long 4 Single 4 Double 8 Currency 8 Decimal 14 Date 8 ...
- 多表查询sql语句
多表查询sql语句 1 --解锁SCOTT用户 2 alter user scott account unlock 3 --检索指定的列 4 select job,ename,empno from e ...
- python如何与以太坊交互并将区块链信息写入SQLite
关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀.因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物.今天我们将观察 ...
- Linux常用软件安装与配置——目录
http://blog.csdn.net/clevercode/article/details/45740431
- 接着继续(OO博客第四弹)
.测试与JSF正确性论证 测试和JSF正确性论证是对一个程序进行检验的两种方式.测试是来的最直接的,输入合法的输入给出正确的提示,输入非法的输入给出错误信息反馈,直接就能很容易的了解程序的运行情况.但 ...
- 第二阶段每日站立会议First Day
昨天我进行了用户界面的修改,例如按钮的大小,位置,使界面看起来更美观.更简洁 今天准备安装在手机端进行界面效果测试以及进一步完善 遇到的问题:有些按钮由于在之前固定好的布局之中,所以没法移动其位置
- Python写一个根据日期计算是星期几的模块
import datetimedef get_week_day(date): week_day = { 0: '星期一', 1: '星期二', 2: '星期三', 3: '星期四', 4: '星期五' ...
- oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)
语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...
- springmvc 映射重复
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springfr ...