python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程
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 代码实现一个简单的演化过程相关推荐
- 基于python的证件照_不到20行实现Python代码即可制作精美证件照
无论是我们上学时还之后的工作中,基本都需要用到电子证件照片,这类照片基本都对照片尺寸.背景色有要求,本文我们来看一下如何只用不到 20 行 Python 代码完成证件照片的制作. 简介 制作证件照我们 ...
- python 土拨鼠库_为了应对某人的需求,写了一个简单的聊天室内容
Python聊天室 背景 这是一篇水文,同时也是更换markdown后的第一篇,主要是为了测试markdown的情况. 服务器程序 #!/usr/bin/env python # -*- coding ...
- python编写登录_通过Python编写一个简单登录功能过程解析
通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...
- Python灰帽子_黑客与逆向工程师的Python编程之道
收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道
- python自学篇十[ 面向对象 (四) :王者荣耀小游戏+模拟一个简单的银行进行业务办理的类]
python基础系列: python自学篇一[ Anaconda3安装 ] python自学篇二[ pycharm安装及使用 ] python自学篇三[ 判断语句if的使用 ] python自学篇四[ ...
- python200行代码_如何用200行Python代码“换脸”
本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步: 检测面部标记. 旋转.缩放和转换第二张图像,使之与第一张图像相适应. 调 ...
- python第一行代码_“少年py”001:下载Python软件,写第一行代码
Python,网络上称之为人工智能时代的第一编程语言. 功能超级强大,能做科学计算.大数据处理.网络爬虫.游戏开发等等. 但是说实话,彬哥玩Python还没到这么厉害的程度,究竟怎么实现,我们不着急, ...
- python9行代码_如何用9行Python代码编写一个简易神经网络
原标题:如何用9行Python代码编写一个简易神经网络 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 学习人工智能时,我给自己定了一个目标--用Pyth ...
- python层次分析模型_不到70行Python代码,轻松玩转RFM用户分析模型
本文从RFM模型概念入手,结合实际案例,详解Python实现模型的每一步操作,并提供案例同款源数据,以供同学们知行合一. 注:想直接下载代码和数据的同学可以空降文末 看这篇文章前源数据长这样: 学完后 ...
最新文章
- 在.net中使用GDI+来提高gif图片的保存画质
- 青出于蓝而胜于蓝,这是一款脱胎于 Jupyter Notebook 的新型编程环境
- 《响应式Web图形设计》一13.2 缩放图像带来的问题
- MoSCow和Kano
- linux下通过命令来下载视频
- 概率论和数理统计 - 04 -
- 安卓错误: 找不到R符号_国际音标及附加符号读音amp;用法示例
- 2019年第一份DApp调查报告出炉
- nginx启动vue_Docker部署前端Vue
- 老徐WEB:js入门学习 - javascript对象之Date对象
- 蜗牛星际 完美安装 ESXI6.7 全面教程(一)
- 【图文教程】文件压缩和打包
- 微服务构建思路与方法论
- MATLAB之最优路径的查找
- 外贸行业找客户的三种方式和五种工具
- 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
- iOS 边学边记 直播SRT、UDT协议详解
- hadoop集群平台的搭建
- 【报告分享】吴晓波2022跨年演讲全文(附下载)
- 网页编程软件:Coda 2 for Mac
热门文章
- android 数据存储路径
- zoj 3791 An Easy Game
- Oracle 常用dump命令
- [Python图像处理] 八.图像腐蚀与图像膨胀
- [LeetCode] Add Digits - 数字各个位数求和
- 【数据结构与算法】之深入解析“序列化和反序列化二叉搜索树”的求解思路与算法示例
- 2013\Province_C_C++_A\7.错误票据
- PTA —— 基础编程题目集 —— 编程题 —— 7-1 厘米换算英尺英寸 (15 分)
- 【C/C++9】天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性
- Dsp BootLoader的学习