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

How to use scipy's minimize within a class?

我是 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)。如果有人能够通过解释我到底做错了什么以及 运行ning 此类代码的正确方法是什么来帮助我,我将非常感激。提前致谢!

编辑:在代码中添加了导入

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

第二个错误参考minimize方法的documentation。我认为问题在于您需要更改调用 minimize 的方式。试试这个,请 post 结果:

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

以下是我的做法。将要优化的函数与 class 方法分开,并有一个私有的 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是正确的结果吗?