如何在类中使用 scipy 的最小化?

我是 python 新手,所以这可能是一个愚蠢的问题,但是我在任何地方都找不到答案。


我试图根据另一个玩家的动作找到一个玩家的最佳反应。对于那些熟悉的经济学,这种情况是典型的伯特兰价格竞争。代码如下:


import numpy as np

from scipy.optimize import minimize


class Player:

    def __init__(self):

        self.action = np.random.choice(np.linspace(0, 1, 11))


    def payoff(self, other):

        if self.action < other.action:

            return (1 - self.action) * self.action

        elif self.action == other.action:

            return 0.5 * (1 - self.action) * self.action

        else:

            return 0


    def best_reply(self, other):

        br = minimize(-self.payoff, 0.5, other)

        return br['x']


A = Player()

B = Player()


print(A.best_reply(B))

当我运行上面的代码时,我收到以下错误:


TypeError: bad operand type for unary -: 'method'

有人可以向我解释这是为什么吗?我能够通过将收益乘以 -1 并从 best_reply 函数中删除“-”来规避这个问题。但是,当我运行代码时,我得到:


TypeError: payoff() takes 2 positional arguments but 3 were given

怎么会?我给出的唯一参数是自己(A)和另一个玩家(B)。如果有人能够通过解释我到底做错了什么以及运行此类代码的正确方法是什么来帮助我,我将非常感激。先感谢您!


编辑:将导入添加到代码中


HUX布斯
浏览 137回答 2
2回答

弑天下

我就是这样做的。将要优化的函数与类方法分开,并使用两个方法都可以使用的用于收益计算的私有静态方法。import numpy as npfrom scipy.optimize import minimizeclass Player:    def __init__(self):        self.action = np.random.choice(np.linspace(0, 1, 11))    @staticmethod    def _calc_payoff(a, b):        if a < b:            return (1 - a) * a        elif a == b:            return 0.5 * (1 - a) * a        else:            return 0    def payoff(self, other):        return self._calc_payoff(self.action, other.action)    def best_reply(self, other):        f = lambda x: 1 - self._calc_payoff(x, other.action)        br = minimize(f, 0.5)        return br.x.item()A = Player()B = Player()print(A.best_reply(B))是0.5正确的结果吗?

犯罪嫌疑人X

payoff是一种方法,您不能使用方法进行数学运算,只能使用它们的返回值。就像Python无法计算实情一样-print,它也无法计算实情-self.payoff。对于第二个错误,我认为问题在于你需要改变你的通话方式minimize。尝试一下并请发布结果:br = minimize(self.payoff, 0.5, (other,))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python