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

mer*_*rsu 5 python scipy scipy-optimize scipy-optimize-minimize

我是 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))
Run Code Online (Sandbox Code Playgroud)

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

TypeError: bad operand type for unary -: 'method'
Run Code Online (Sandbox Code Playgroud)

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

TypeError: payoff() takes 2 positional arguments but 3 were given
Run Code Online (Sandbox Code Playgroud)

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

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

Bil*_*ill 3

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

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))
Run Code Online (Sandbox Code Playgroud)

0.5正确的结果吗?