本文分为两部分:

1.基本信息;2.实现思路与部分代码(较长,故只放部分,如需要请联系答主)

(随手敲的;未完坑,因为计划加入结果统计与可视化的代码,当然这一部分需要调用一些库(哪天想到了再来填坑))

1.基本信息

进化博弈(Evolutionary Gaming)又译为演化博弈

书中介绍了两种:

1)进化模型

决策直接由类型(或曰gene)决定,

好的类型可以继承,坏的被淘汰。

2)学习模型

决策由 以往博弈经验+对对手行为的判断 决定。

本文仅对第一种模型做实现,且只做了博弈参与人类型的博弈结果,未加入其进化过程。(当然,在定义博弈人类型的时候就可以对不同的类型采取某种定义方式部分实现“进化”的意义,如本文作为例子的'fail_betray'类型在失败后会自动转变为'always_be'类型)

2.代码实现思路

首先有两点考虑:

由于非信息博弈,所有决策在博弈当期均内生给出。

所有人与其他所有人在每一期都进行博弈

未使用需要额外下载的库。

1.定义博弈的参与人(class的部分代码):

人定义为类,包括其标号,类型,记忆// 决策。

人的决策定义为函数,其应当有如下属性:输入类型和博弈收益的记忆list,然后从(1,2)中选择一项输出。

class Role:

def __init__(self, n, typ, memo):

self.num = n

self.type = typ

self.memory = memo

def show(self):

print('tag:{}, type:{}, historical gains:{}'.format(self.num,self.type,self.memory)

,'\ngain sum in every term:{}'.format(self.gain_sum()))

def stra(self, times=1):

if self.type == 'always_co':

return 1

elif self.type == 'always_be':

return 2

elif self.type == 'random_guy':

# 初始设置:两种决策概率均为1/2

return random.randint(1,2)

#...(此处省略若干类型)

elif self.type == 'fail_betray':

# 第一次合作,之后每次对上一期博弈收益和加总,如果是非负数,就保持,反之永远拒绝

if times == 1:

return 1

elif self.stra(times - 1) == 2:

return 2

elif sum(self.memory[times - 1]) < 0:

return 2

else:

return 1

2.定义一个2*2博弈的收益矩阵,与两人博弈的函数,输入两个博弈人信息,产生(x1,x2)策略集,输出(gain1,gain2)收益集

gain_matrix = [[[1,1],[-2,2]],[[2,-2],[-1,-1]]] # 一个简单的收益矩阵

def gamble(r1 =role1, r2 =role2, gain=None, times=1):

# 1 means cooperate, 2 means betray

if gain is None:

gain = gain_matrix

x1 ,x2= r1.stra(times)-1, r2.stra(times)-1 # 大意了啊,list的index从0开始

if times in r1.memory:

r1.memory[times].append(gain[x1][x2][0])

else:

r1.memory[times]=[]

r1.memory[times].append(gain[x1][x2][0])

3.定义一个包括所有参与人的集:为方便博弈轮的定义,用list。此处给出一个函数生成参与人列表的函数。

def generate_roles():

# 通过输入个数建立一个博弈参与者列表

ro_list = []

roles = []

for i in all_types:

ro_num = int((input('please input num of "{}":'.format(i))))

ro_list += [i]*ro_num

for i in range(len(ro_list)):

roles.append(Role(i ,ro_list[i] ,{}))

return roles

4.定义一轮博弈:所有人与其他人博弈并记录博弈收益。

def all_play(roles, times=1):

for i in roles:

for j in roles:

if j == i:

continue

else:

gamble(i, j ,None ,times)

5*.定义多轮博弈:即4的重复。注意上面所用的times就是为了用于多轮博弈。略

6.定义main函数,输入博弈初始设定,输出博弈的结果,打印结果。略

7*.定义进化,即一些较特殊的类型会根据记忆采取其他已知类型的决策函数(或者直接修正其类型,比如文章开头所述),之后可能对这一点做一个改进。

文末给出一个输入和输出的例子部分打码因为措辞是暂时瞎写的x,数据部分能用就行

结尾部分:

(虽然和本文不一致,但是提供了一些灵感)

参考^参考《微观经济理论:基本原理与拓展》8.14

^为此,不能采取与“信任的进化”相同的类型设定

python博弈论_基于原生python的进化博弈实现相关推荐

  1. python小波变换_基于python的信号小波分析

    小波分析(时频域分析)--python 本实验基于deap数据对eeg信号某个人的fp1通道信号进行不同频段分解 小波分解 (1)导入pywt以及numpy库 import numpy as np i ...

  2. python 切片_全面解读Python高级特性切片

    大家好,欢迎来到Crossin的编程教室! 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slic ...

  3. 2018年python薪资_最好的Python:2017和2018年至今我最喜欢的文章集

    2018年python薪资 我打算发布此收藏集 (My intention with publishing this collection) Last year I only used Medium ...

  4. python马尔可夫链_[译] 用 Python 实现马尔可夫链的初级教程

    马尔可夫链是通常用一组随机变量定义的数学系统,可以根据具体的概率规则进行状态转移.转移的集合满足 马尔可夫性质 ,也就是说,转移到任一特定状态的概率只取决于当前状态和所用时间,而与其之前的状态序列无关 ...

  5. 少儿编程python教材_少儿编程|Python环境安装

    一.为什么要学Python? 小学 山东,浙江,北京地区小学已将Python内容纳入教材 高中 浙江省已将信息技术教材编程语言替换为Python 大学 计算机二级考试加入"Python 语言 ...

  6. python程序_正确配置Python应用程序

    让我们来讨论一下如何配置Python应用程序,特别是那些可能存在于多个环境中的应用程序--开发环境.模拟环境.生产环境等等-- 应用程序中使用的工具和框架并不是特别重要,因为我将在下面概述的方法是基于 ...

  7. 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程

    学习python课程 Python is a popular, versatile and easy-to-learn language. It's the go-to language for AI ...

  8. cuda编程python接口_混合编程[python+cpp+cuda]

    很多时候,我们是基于python进行模型的设计和运行,可是基于python本身的速度问题,使得原生态python代码无法满足生产需求,不过我们可以借助其他编程语言来缓解python开发的性能瓶颈.这里 ...

  9. 哪个专业学python语言_想学Python编程?你真的适合吗?

    原标题:想学Python编程?你真的适合吗? 有的人说我想学什么.我想干什么,很多时候都是头脑发热,单凭一腔热血,可是这样的路即便走上去你又能坚持多久呢?所以,每每有人问我学Python编程怎么样,我 ...

  10. python书籍_最好的Python书籍,让您像专业程序员一样编程

    Python是一种值得学习的语言.学习Python不仅会激发你用最简单的方式完成高度复杂的任务,还会打破传统编程范型的藩篱.Python是能够改变你的编程方式进而改变你看问题的角度的一种语言. Pyt ...

最新文章

  1. 微软企业服务部华东区招聘顾问/架构师/.NET高级开发员
  2. Wireshark非标准分析port无流量
  3. Cocos2d-xna : 横版战略游戏开发实验5 TiledMap实现关卡地图
  4. javascript 数字格式化
  5. 自然语言处理库——NLTK
  6. Visual C++——《可视化编程技术》课程考核
  7. Android 7.0 获取相机拍照图片,适配三星手机拍照,解决三星手机拍照屏幕旋转,判断设备是否有摄像头
  8. Ubuntu上 anaconda的卸载
  9. Mysql逻辑架构简介
  10. java web 密码加密_JavaWeb日记——Shiro之密码加密
  11. 给opensuse安装文泉驿字体
  12. [企业信息化大家学系列]处于变革边缘的中国供应链管理
  13. python 批量下载 代码_Python实现的批量下载RFC文档
  14. day 84 Vue学习四之过滤器、钩子函数、路由、全家桶等
  15. 随机游走模型 matlab,随机游走matlab程序
  16. 一张图看懂MTK 芯片命名规则
  17. 【nlp学习】中文命名实体识别(待补充)
  18. 启动、停止elasticsearch的脚本(没有技术含量)
  19. ElementUI项目使用pdf.js预览pdf文件
  20. 工业互联网与制造控制生产网络学习总结

热门文章

  1. MCU程序布局----优化升级方式
  2. 物联网 毕业设计——方案选择
  3. 呼吸机吸气触发:压力触发与流量触发
  4. ORACLE 提取汉字拼音首字母及汉字排序
  5. 在MAC OSX系统中删除、添加、恢复、管理launchpad的STEAM游戏图标
  6. mysql中 怎么插入反斜杠_MySQL中如何插入反斜杠,反斜杠被吃掉,反斜杠转义(转)...
  7. 第五章 国内著名网络数据库系统
  8. Java web项目目录结构以及作用详解
  9. Origin软件的安装
  10. python下载哪个好_tensorflow用python哪个版本更好?