首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我试图为“囚徒困境”中的学习算法创建相同类型的不同对象,但是python把它们搞混了。

我试图为“囚徒困境”中的学习算法创建相同类型的不同对象,但是python把它们搞混了。
EN

Stack Overflow用户
提问于 2020-05-14 23:09:11
回答 1查看 25关注 0票数 0

显然,我认为让他们感到困惑的不是Python。我就是找不到bug的来源。

下面是我的代码:

代码语言:javascript
复制
import numpy as np

class EW_learner:
    #p is the probability distribution (from which we chose action C or D)
    #pp are the potential payoffs (if 1 action was taken consistently)
    #s is my real payoff or score (i.e. negated total prison years)
    ##pp[0] and action = 0 is cooperate (C) => (0=C)
    ##pp[1] and action = 1 is defect (D) => (1=D)
    #ps is a list of the probability distribution at each round
    #ss is a list of the scores at each round
    def __init__(self, lr, p=[0.5,0.5], pp=[0,0], s=0, ps=[], ss=[]):
        self.lr = lr
        self.p = p
        self.pp = pp
        self.s = s
        self.ps = ps
        self.ss = ss

    #Return an action (C or D) => (0 or 1)
    def action(self):
        return int(np.random.choice(2, 1, p=self.p))

    def update(self, my_act, adv_act):
        if (my_act == 0) and (adv_act == 0):
            self.s -= 3
            self.pp[0] -= 3
            self.pp[1] -= 5
        elif (my_act == 1) and (adv_act == 0):
            self.s -= 5
            self.pp[0] -= 3
            self.pp[1] -= 5
        elif (my_act == 0) and (adv_act == 1):
            #self.s -= 0
            #self.pp[0] -= 0
            self.pp[1] -= 1
        elif (my_act == 1) and (adv_act == 1):
            self.s -= 1
            #self.pp[0] -= 0
            self.pp[1] -= 1

        self.p[0] = np.power(1.0+self.lr, self.pp[0])
        self.p[1] = 1 - self.p[0]

    def collect_data(self):
        (self.ps).append(self.p)
        (self.ss).append(self.s)

def play(p1, p2, n_rounds):
    for r in range(n_rounds):
        act1 = p1.action()
        act2 = p2.action()
        p1.update(act1, act2)
        p2.update(act2, act1)
        p1.collect_data()
        p2.collect_data()
    print('P1 Score: ' + str(p1.s) + ', P2 Score: ' + str(p2.s))
    print('P1 ProbDist: ' + str(p1.p) + ', P2 ProbDist: ' +  str(p2.p))
    return p1.ss, p2.ss, p1.ps, p2.ps

lucas = EW_learner(0.1)
paula = EW_learner(0.9)
sim = play(lucas, paula, 10)

当我调用sim时,它基本上应该输出p1.ss,这是lucas在每一轮的分数,它输出如下:

代码语言:javascript
复制
in [85]: sim[0]

out[85]: 
[-5,
 0,
 -6,
 -1,
 -6,
 -6,
 -7,
 -7,
 -8,
 -8,
 -9,
 -9,
 -10,
 -10,
 -11,
 -11,
 -12,
 -12,
 -13,
 -13]

其长度为20 (这没有意义,因为有10轮)。此外,这个输出似乎与sim1的输出完全相同,这应该是paula在每一轮中的分数。出于某种原因,他们合并到相同的列表中,并替换了卢卡斯和宝拉的分数。我知道我可以很容易地使用%2拆分列表,但我更愿意理解这个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 00:47:18

如下所示:

代码语言:javascript
复制
import numpy as np

class EW_learner():
    #p is the probability distribution (from which we chose action C or D)
    #pp are the potential payoffs (if 1 action was taken consistently)
    #s is my real payoff or score (i.e. negated total prison years)
    ##pp[0] and action = 0 is cooperate (C) => (0=C)
    ##pp[1] and action = 1 is defect (D) => (1=D)
    #ps is a list of the probability distribution at each round
    #ss is a list of the scores at each round
    def __init__(self, lr, p=[0.5,0.5], pp=[0,0], s=0):
        self.lr = lr
        self.p = p
        self.pp = pp
        self.s = s
        self.ps = []
        self.ss = []

sim[0]的结果是:

代码语言:javascript
复制
[0, -5, -6, -7, -8, -9, -10, -11, -12, -13]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61800828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档