Scipyoptimize.minimize似乎仅接受一维x0。我有一个问题,我的x0是shape(n,m)。存在约束,使得x0的每一行都应匹配某个值。
我可以简单地遍历每一行并对其进行优化;但是,我希望在某个时候向列添加约束。
有已知的处理方法吗?我找不到太多的讨论。我尝试了各种版本的广播,拼合等,但是在创建合理的结构方面运气不佳。
编辑:我添加了一个最小的代码示例。用test_x测试时,约束条件返回正确的零。
import numpy as np
import scipy.optimize
def cost(x, p):
x.reshape(3, 4)
p.reshape(3, 4)
return (x * p).sum()
def demand_constraint(x, d):
x = x.reshape(3, 4)
b = x.sum(axis=0) - d
return np.broadcast_to(b, (3, 4)).flatten()
demand = np.array([10, 14, 8, 26])
prices = np.array([[4, 4, 5, 5], [2, 8, 6, 2], [3, 2, 9, 8]])
x0 = np.zeros_like(prices).flatten()
p0 = prices.flatten()
test_x = np.array([[4, 14, 8, 26], [5, 0, 0, 0], [0, 0, 0, 0]])
cost(x0, p0)
cons = ({'type': 'eq', 'fun': demand_constraint, 'args': (demand,)})
output = scipy.optimize.minimize(cost, x0, args=p0, constraints=cons)
答案 0 :(得分:0)
对于在搜索中可能遇到此问题的任何人,处理它的方法是为每个单独的行添加一个约束。因此,上面的demand_constraint将采用row_index字段,并且将返回单个值。
然后可以将此单个值合并到添加的约束中。您继续为形状添加约束(每个约束都是自己的字典)。我的错误是假设约束可以适用于所有x。它更适合应用于单个x。