1

情况:我正在使用 scipy 来解决优化问题。由于需要许多约束,系数位于 pandas.dataframe 对象中。我正在尝试使用循环输入所有这些约束。问题是在下一个周期,参数已经改变,所以实际上只剩下了约束。

为了更清楚地表达问题,我举个例子(在这个例子中,只给出了几个参数。但在实际情况下,可能有50多个参数)。Step1:我使用的代码如下:约束是w1 + w2 * 2 >= 0; w1 * 3 + w2 * 5 >= 0

cons = []
d = {
        'type': 'ineq', 
        'fun': ''}
a = np.array([1,2])
d['fun'] = lambda w: a.dot(w)
cons.append(d.copy())
a = np.array([3,5])
d['fun'] = lambda w: a.dot(w)
cons.append(d.copy())
cons

Step2:使用如下所示的代码测试cons:只使用w作为[1, 1],我预计cons中存储的fun会输出3和8,但实际上是8和8。

w = np.array([1,1])
for each in cons:
    fun = each['fun']
    print(fun(w))

任何人都可以就如何解决这个问题提供一些帮助吗?或者只是出了点问题。

4

1 回答 1

1

问题是你重新定义a.

此代码将您的第二个定义重命名为atob并给出您期望的结果:

import numpy as np

cons = []
d = {
        'type': 'ineq', 
        'fun': ''}
a = np.array([1, 2])
d['fun'] = lambda w: a.dot(w)
cons.append(d.copy())
b = np.array([3, 5])
d['fun'] = lambda w: b.dot(w)
cons.append(d.copy())
print(cons)

c = np.array([1, 1])
for each in cons:
    fun = each['fun']
    print(fun(c))

请注意,这解决了您当前的问题,但这并不意味着这是您尝试解决的问题的最佳或非常强大的解决方案。

我想你在这里寻找的是functools.partial. 这是您的代码,但重写为使用partial

import numpy as np
from functools import partial


def get_dot(a, w):
    return a.dot(w)


cons = []
d = {
    'type': 'ineq',
    'fun': None
}

d['fun'] = partial(get_dot, np.array([1, 2]))
cons.append(d.copy())

d['fun'] = partial(get_dot, np.array([3, 5]))
cons.append(d.copy())

print(cons)

g = np.array([1, 1])
for each in cons:
    fun = each['fun']
    print(fun(g))
于 2020-01-02T05:06:26.457 回答