Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

在纳米比亚的 PyCon 会议上,我发表了一篇名为 《使用 Python 解决“升级版的剪刀石头布”》(Rock, Paper, Scissors, Lizard, Spock with Python )的文章。在这篇文章中,介绍到用Nashpy 来计算两个玩家的平衡是很简单的事情,但是其中只是涉及了一点点演化稳定性的内容。 在这篇博文中,我将阐述一下如何在 Python + Numpy 环境下,使用大概 40 行代码来建立一个简单的演化过程模型。

我想讲的第一个游戏是“旅行者困境”问题。这里给出一个简化的版本:

我不想过多的讲解这个游戏的数学模型如何建立。在建模后,我们只需要知道一件事情,那就是我们有两个玩家:

行玩家:选择我们处于哪一行;

列玩家:选择我们处于哪一列。

如果,行玩家选择的是第二行,列玩家选择的是第三列,则得分为:5,1。即行玩家得 5 分,而列玩家得 1 分。这个时候列玩家可能会倾向于选择第一列,这样的话得分就是 0,4 了。

下面,我们可以使用 Nashpy 来计算这个游戏的平衡位置。

我们可以看到,纳什平衡是由两个向量组成的单个集合,向量表明了玩家应该如何玩这个游戏:

行玩家应该按照 [1,0,0] 来玩

列玩家也应该按照 [1,0,0] 来玩

在这里,[1,0,0] 是概率向量,表示一个玩家的游戏策略的概率。所以,在这种情况下,两位玩家都应该选择第一个选择,这样的话得分为 2,2。这位置称为纳什平衡,因为所有玩家都不能偏离这个点(一旦偏离,就可能得到比别人低的分数)。

我们可以对“升级版的剪刀石头布”这个游戏进行同样的建模,其数学模型如下:

接下来,使用如下的程序计算其纳什平衡:

我们可以看到每个位置都是 1/5 的概率,所以两位玩家可以随意的选择。这完全可以凭借个人直觉,因为当两位玩家都这么做的时候,实际上就是随机不可预测的。

所有结果都很合理。纳什平衡是博弈论中一个很有用且很重要的概念,但是当我们以演化的视角看这些游戏的时候,会发生什么呢?

如果我们有一大群人,并且这群人总是会选择与他们人数相同的多种选择。他们每个都和另外一大群人玩这个游戏,如果他们比对手得分要高,他们继续。反之则他们的对手继续。

下面是我们使用 Python 和 Numpy 来进行模拟的代码。

首先,得到一个随机的人数:

然后开始游戏:

接下来进行变化(将那些获胜的策略进行汇总):

最后将上面的这些进行汇总,给定一个游戏的迭代次数,重复的运行 mutate 函数:

下面让我们看看最后画出来的曲线图(点击这里下载 Jupyter notebook):

首先我们看看玩“旅行者困境”这个游戏时会发生什么(回顾上面讲的纳什平衡,两位玩家应该选择第一种策略):

我们可以看到,人群中的玩家很快都选择了第一种策略。当然这也可能是我们使用了特定的随机数种子所引起的人为结果。下面的图片展示了使用不同的随机数种子所得到的结果图片。

他们的初始条件皆不相同但是结果相同:人群中的人们使用都是纳什平衡策略。

接下来的是比较酷的一部分了,让我们看看在“升级版的剪刀石头布”的曲线图中会发生了什么:

我们可以看到结果不是很稳定。下面的图片显示了不同随机数种子的结果:

关于两者稳定性的差异有个直观的解释:在“旅行者困境”游戏中纳什平衡策略是非常强的:如果每个人都按照纳什平衡来决策,我们就没法作出改变,我们只能跟别人一样。在“升级版的剪刀石头布”游戏中:如果每个人都是随机的玩,或者所谓的人群是由玩家或者策略进行随机的组合,你就很有可能碰见那些战胜你的人。

从这篇文章中,我们有两点需要注意:

这只是使用 Python 模拟一个简单的演化过程。

人数的动态变化为这个游戏添加了一个迷人的维度。我在这里使用的演化过程非常的简单,一般情况都是使用马尔科夫随机过程来研究这类问题。你也可以使用 Python 的库来研究这类“囚徒困境”问题,使用的库的链接为: axelrod.readthedocs.io/en/latest/tutorials/getting_started/moran.html

英文原文:http://vknight.org/unpeudemath/mathematics/2017/03/08/simple-evolutionary-process.html

译者:无

python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程相关推荐

  1. 基于python的证件照_不到20行实现Python代码即可制作精美证件照

    无论是我们上学时还之后的工作中,基本都需要用到电子证件照片,这类照片基本都对照片尺寸.背景色有要求,本文我们来看一下如何只用不到 20 行 Python 代码完成证件照片的制作. 简介 制作证件照我们 ...

  2. python 土拨鼠库_为了应对某人的需求,写了一个简单的聊天室内容

    Python聊天室 背景 这是一篇水文,同时也是更换markdown后的第一篇,主要是为了测试markdown的情况. 服务器程序 #!/usr/bin/env python # -*- coding ...

  3. python编写登录_通过Python编写一个简单登录功能过程解析

    通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...

  4. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  5. python自学篇十[ 面向对象 (四) :王者荣耀小游戏+模拟一个简单的银行进行业务办理的类]

    python基础系列: python自学篇一[ Anaconda3安装 ] python自学篇二[ pycharm安装及使用 ] python自学篇三[ 判断语句if的使用 ] python自学篇四[ ...

  6. python200行代码_如何用200行Python代码“换脸”

    本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步: 检测面部标记. 旋转.缩放和转换第二张图像,使之与第一张图像相适应. 调 ...

  7. python第一行代码_“少年py”001:下载Python软件,写第一行代码

    Python,网络上称之为人工智能时代的第一编程语言. 功能超级强大,能做科学计算.大数据处理.网络爬虫.游戏开发等等. 但是说实话,彬哥玩Python还没到这么厉害的程度,究竟怎么实现,我们不着急, ...

  8. python9行代码_如何用9行Python代码编写一个简易神经网络

    原标题:如何用9行Python代码编写一个简易神经网络 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 学习人工智能时,我给自己定了一个目标--用Pyth ...

  9. python层次分析模型_不到70行Python代码,轻松玩转RFM用户分析模型

    本文从RFM模型概念入手,结合实际案例,详解Python实现模型的每一步操作,并提供案例同款源数据,以供同学们知行合一. 注:想直接下载代码和数据的同学可以空降文末 看这篇文章前源数据长这样: 学完后 ...

最新文章

  1. [poj3041]Asteroids(二分图的最小顶点覆盖)
  2. Linux学习——shell编程之变量
  3. 分享一篇关于陌生人社交的竞品分析报告
  4. Javascript返回顶部和砸金蛋,跑马灯等游戏代码实现
  5. python提取cad坐标_从CAD图里提取坐标的方法
  6. 支付宝小程序复制到剪贴板
  7. 1.为什么要使用token,token是什么?
  8. 游戏公司可能碰到哪些知识产权问题?
  9. Groovy - Groovy ambiguous method overload
  10. 上偏续关系哈斯图_A={a,b,c}定义在P(A)上的包含关系是一个偏序关系,哈斯图怎么画?...
  11. 超详细 LaTex数学公式
  12. python-matplotlib库绘制饼形图专题(从一般饼状图到内嵌环形图)
  13. “撒旦”勒索病毒再曝4.2变种 腾讯电脑管家文档守护者可一招解密
  14. 访问网站报错‘您目前无法访问XXXX 因为此网站使用了 HSTS
  15. 判断点在三角形内部方法
  16. 如何在iPhone上将实时照片转换为视频或GIF
  17. DOC文件丢失怎么恢复?用这7种方法找回
  18. 下载GoolgeMap卫片程序 GMID更新
  19. 聊聊OpenStack运维架构
  20. Mysql的Rownum使用示例

热门文章

  1. tablefunc 行转列
  2. C++程序员必读的经典著作
  3. jqgrid学习(1)
  4. insert with special ID
  5. 博客开通了....激动 呵呵
  6. 【python数据挖掘课程】十六.逻辑回归LogisticRegression分析鸢尾花数据
  7. Label Studio 入门
  8. P1111 修复公路
  9. Uncaught TypeError: Cannot read property 'value'' of null
  10. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1065:奇数求和