首页 > 解决方案 > 如何在要最小化的 Numpy 产品中使用 CVX 变量?

问题描述

我正在尝试优化配置 X(布尔值),以使配置上的总价格:base_price + discount 最小化,但问题公式给出了 Matmul 错误,因为 x 是 cvxpy 变量,因此不符合Numpy 形状,即使它是用正确的长度定义的。

n = len(Configuration)
x = cp.Variable(n, boolean=True)
problem = cp.Problem(cp.Minimize(base_price + price@(price_rules_A@x <= price_rules_B)), [
        config_rules_A@x <= config_rules_B, 
        config_rules_2A@x == config_rules_2B
    ])
# where price@(price_rules_A@x <= price_rules_B) is the total discount 
# and price, price_rules_A and price_rules_B are numpy arrays 

我得到的错误是

ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)

我希望它能够为 x ( 0010110...) 找到最佳配置,从而使折扣最小化,但事实并非如此。知道可能是什么原因造成的吗?

标签: optimizationgurobicvxpycvxopt

解决方案


假设目标函数中不等式的评估被假设为 的索引price,您可以将函数重写为

cp.Minimize(base_price + price@(1-(price_rules_B - price_rules_A@x))

然后将不等式成立的价格元素相加。


推荐阅读