python - 矩阵 x0 上的 Scipy 最小化函数

标签 python optimization scipy

Scipy optimize.minimize 似乎只接受单维 x0。我有一个问题,我的 x0 是形状(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)

最佳答案

对于在搜索中可能遇到此问题的任何人,处理它的方法是为每个单独的行添加约束。因此上面的demand_constraint将采用row_index字段并返回单个值。

然后可以将该单个值合并到添加的约束中。您继续为形状添加约束(每个约束都有自己的字典)。我的错误是假设约束可以适用于所有 x。它更适合应用于单个 x。

关于python - 矩阵 x0 上的 Scipy 最小化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55476963/

相关文章:

Python:创建一个函数来通过引用而不是值来修改列表

c - 在 C 中使用输入参数而不是局部变量是否更有效?

python - 来自 gda94 的 affine_transform xy 坐标

Python RegEx-刽子手算法

python - 动态更改遗产树中的给定类并将其替换为另一个并初始化它

python - 无法在浏览器上打开 jupyter(ipython) notebook

java - 字节数组上的 Karatsuba 乘法优化

mysql - 让我的 SQL 查询更有效率

python - Griddata 创建坏形状 scipy

python - 如何在 EPD 中升级 scipy 或 numpy?