• 浅谈博弈论之Nim初步(xor正确性的浅显证明)


    引入

    在许多地方曾流行过这样一个小游戏:摆出三堆硬币,分别包含3枚,5枚,7枚。两人轮流行动,每次可任选一堆,从中取走任意多枚硬币,可把一堆取光,但不能不取,取走最后一枚硬币者获胜。

    概念

    (先手:)当前行动的一方

    (局面:)面临的游戏状态

    (必败:)指在当前局面下无论采取什么策略,都会输掉游戏

    (先手必胜:)指当前局面下,采取最优策略能让对手面临必败局面的状态

    (Nim游戏:)给定(n)堆物品,第(i)堆有(A_{i})个,两名玩家轮流行动,每次可任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手能否必胜。


    (Nim)博弈需要判断是否先手必胜,那么该如何来判断呢?

    结论

    (Nim博弈)先手必胜,当且仅当(A_{1} xor A_{2} xor...xor A_{n} e0)

    证明

    首先我们可以知道,当所有物品已经被取完时,是个必败局面
    这时有(A_{1} xor A_{2} xor...xor A_{n}=0)
    而当(A_{1} xor A_{2} xor...xor A_{n} e0),我们显然可以取走某一堆石子上二进制上的某几个'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取走就好了)
    到这里,我们可以的到,异或是对的
    证毕

  • 相关阅读:
    APP性能之终端兼容优化分享
    Java反射机制
    语音编码的WAVE文件头格式剖析
    【原创】ASP.NET MVC3开发中遇到问题以及解决方法
    linux常用命令(基础)
    vue中粘贴板clipboard的使用方法
    解决部署zabbix中zabbixagent的状态为灰色现象
    IAR Embedded Workbench for ARM: Porting code from V4 to V5 ( for stm32)
    MSDN帮助文档 "无法显示该网页" 的问题解决方案(转)
    二叉排序树求每个结点平衡因子程序
  • 原文地址:https://www.cnblogs.com/NLDQY/p/10218610.html
Copyright © 2020-2023  润新知