微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在一个类中使用scipy的最小化?

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

鉴于其他玩家的动作,我正在尝试为玩家找到最佳反应。这种情况就是您对于那些熟悉经济学的典型Bertrand价格竞争。代码如下:

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)。如果有人能够通过解释我到底在做错什么以及运行这种代码的正确方法来帮助我,我将非常感激。预先谢谢你!

编辑:在代码添加了导入

解决方法

这就是我要做的。将要优化的函数与类方法分开,并具有专用的static method来进行两种方法都可以利用的收益计算。

import numpy as np
from scipy.optimize import minimize

class 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的结果正确吗?

,

payoff是一种方法,您不能使用方法进行数学运算,而只能使用它们的返回值。就像Python无法计算-print是什么一样,它也无法计算-self.payoff是什么。

对于第二个错误,请参考minimize方法的documentation。我认为问题在于您需要更改呼叫方式minimize。试试这个,然后发布结果:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。