为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2023-06-27 18:19:22
我是 python 新手,所以这可能是一个愚蠢的问题,但是我在任何地方都找不到答案。我试图根据另一个玩家的动作找到一个玩家的最佳反应。对于那些熟悉的经济学,这种情况是典型的伯特兰价格竞争。代码如下:import numpy as npfrom scipy.optimize import minimizeclass 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)。如果有人能够通过解释我到底做错了什么以及运行此类代码的正确方法是什么来帮助我,我将非常感激。先感谢您!编辑:将导入添加到代码中
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

我就是这样做的。将要优化的函数与类方法分开,并使用两个方法都可以使用的用于收益计算的私有静态方法。

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


查看完整回答
反对 回复 2023-06-27
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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

对于第二个错误,我认为问题在于你需要改变你的通话方式minimize。尝试一下并请发布结果:

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


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信