【问题标题】:Specifying complex constraints in cvxpy yields strict inequalities error在 cvxpy 中指定复杂的约束会产生严格的不等式错误
【发布时间】:2020-12-22 22:48:15
【问题描述】:

我正在尝试使用我在 Excel - 中概述的 cvxpy 重新创建整数线性优化问题。请注意,这是一个虚拟示例,实际数据集将包含数千个变量。请忽略电子表格单元格 K5 中的解决方案,因为 Excel Solver 无法提供整数解决方案。

考虑将 9 个变量分成 3 个桶。请注意,我对约束 1-3 的目标是,对于一个变量桶,3 个 1 中至少有 2 个,或者所有值都是 0。例如,a、b、c 应该是 1、1、1或 1, 1, 0 或 1,0,1 或 0, 1, 1, 或 0, 0, 0。

import numpy as np
import cvxpy as cp
import cvxopt 

coefs= np.array([0.7, 0.95, 0.3, 2, 1.05, 2.2, 4, 1, 3])

dec_vars = cp.Variable(len(coefs), boolean = True)

constr1 = np.array([1,1,1,0,0,0,0,0,0]) @ dec_vars == 2 * max(dec_vars[0:3]) 
constr2 = np.array([0,0,0,1,1,1,0,0,0]) @ dec_vars == 2 * max(dec_vars[3:6])
constr3 = np.array([0,0,0,0,0,0,1,1,1]) @ dec_vars == 2 * max(dec_vars[6:9])
constr4 = np.ones(len(coefs)) @ dec_vars >= 2

当我跑到这里时,我得到一个 NotImplementedError: Strict inequalities are not allowed.错误

【问题讨论】:

    标签: python cvxpy integer-programming


    【解决方案1】:

    核心问题是你对 python 的max 的使用,它试图在到达 cvxpy 之前进行评估。你不能在 cvxpy-objects 上使用任何 python-native 函数。不支持 max(cvx_vars)abs(cvx_vars) 等等。

    在 cvxpy 中有 max-function,即:cp.max(...),但我不明白你想要做什么,也不知道如何通过利用 max 来实现这一点。见下文...

    请注意,我对约束 1-3 的目标是,对于一个变量桶,3 个 1 中至少有 2 个,或者所有值都是 0。例如,a、b、c 应该是 1, 1,1 或 1, 1, 0 或 1,0,1 或 0, 1, 1 或 0, 0, 0。

    这通常需要某种析取推理

    方法 A

    一般的方法是使用一个二进制指示变量和一个基于big-M的表达式:

    is_zero = binary aux-var
    
    sum(dec_vars) <= 3 * is_zero
    sum(dec_vars) >= 2 * is_zero
    

    方法 B

    或者,也可以通过(不带辅助变量)进行建模:

    a -> b || c
    b -> a || c
    c -> a || b
    

    含义:如果有一个非零,至少还需要一个非零。这看起来像:

    (1-a) + b + c >= 1
    (1-b) + a + c >= 1
    (1-c) + a + b >= 1
    

    【讨论】:

    • 方法 B 有效。对于方法A,您能否详细说明语法binary aux-var
    • is_zero 只是一个新变量,例如 aux_var = cp.Variable(1, boolean = True) (可能每个存储桶都有一个)。这个二元变量决定:全零或其他情况(然后约束在任何地方施加 0 或对总和施加限制)
    • 这主要是因为方法 A 似乎更加优雅。考虑到我实际上有数千个变量,方法 B 要求我为每个变量编写一个规则,而不是为存储桶编写一个通用规则
    • 是的,这些方法的用例不同。
    • 你有一个辅助/辅助/单独变量你需要的每个析取推理(不是每个变量!)。如果你有n 元素/桶/任何东西(由m 内部的二进制变量组成)需要强制执行0 or bounds on the sum of m_of_n,你将需要n aux-vars。这两种方法都只是一些分离空间的线性化,无论如何都需要。一个使用额外的变量,另一个不使用,但在某些情况下的约束条件更差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多