本文分为两部分:
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
^为此,不能采取与“信任的进化”相同的类型设定