使用 LP 文件格式的 CPLEX:使用布尔运算符的指标约束
CPLEX using LP file format: indicator constraints with boolean operators
我是 CPLEX 的新手,远非 MIP 专家,但我正在尝试使用此技术 (CPLEX 12.4) 解决问题。
我已经决定在 .lp 文件中创建 MIP 模型并将其提供给 CPLEx,这样我就可以获得大量输入并测试不同的求解器等。但是我发现关于指标约束的一件事有点问题。
我想要这样的东西:
c1: a AND NOT(b)-> i1 - 100 v1 = 0
c2: b AND NOT(a)-> i1 - 120 v1 = 0
c3: a AND b -> i1 - 80 v1 =0
但是在 LP 格式中没有 AND
或 NOT
这样的东西(我什至不确定我是否可以在 CPX 界面上这样做,但我试图避免它).
我发现的唯一解决方法是:
ca: a_not_b = 1 <-> a - b = 1
cb: b_not_a = 1 <-> a - b = -1
cab: a_and_b = 1 <-> a + b = 2
c1: a_not_b-> i1 - 100 v1 = 0
c2: b_not_a-> i1 - 120 v1 = 0
c3: a_and_b = 1-> i1 - 80 v1 =0
我可以接受这个,因为我将用另一个程序生成这个 LP,但这会减慢 CPLEX 吗?有更好的方法吗?
谢谢
你说得很对。 LP 和 MILP 方法不直接允许这些类型的逻辑约束。相反,您通常需要在模型中创建可用于捕获这些条件的辅助变量。在许多情况下,这些将是布尔值或 0/1 整数变量。编写 MILP 模型的艺术和工艺的很大一部分是寻找在 LP 和 MILP 模型的相当严格的 'language' 中重写这些条件的好方法。这可能会导致一些相当有趣的心理体操!请注意,这是 MILP 方法的限制,而不仅仅是 CPLEX。支持这些逻辑关系的建模语言大多只是围绕这些具有辅助 binary/integer 变量的相同建模技术提供语法糖。
MILP 求解器可以处理具有数百万个变量和约束的非常大的问题;但那是因为潜在的数学结构和假设。约束编程等技术确实允许对逻辑和其他关系进行这种直接建模,但通常仅限于小得多的问题实例。
至于这是否会降低 CPLEX(或任何其他求解器)的速度,答案可能是肯定的。但是,如果您使用的是 MILP 求解器,可能别无选择 - 解决正确的问题总比解决错误的问题好。
我是 CPLEX 的新手,远非 MIP 专家,但我正在尝试使用此技术 (CPLEX 12.4) 解决问题。 我已经决定在 .lp 文件中创建 MIP 模型并将其提供给 CPLEx,这样我就可以获得大量输入并测试不同的求解器等。但是我发现关于指标约束的一件事有点问题。
我想要这样的东西:
c1: a AND NOT(b)-> i1 - 100 v1 = 0
c2: b AND NOT(a)-> i1 - 120 v1 = 0
c3: a AND b -> i1 - 80 v1 =0
但是在 LP 格式中没有 AND
或 NOT
这样的东西(我什至不确定我是否可以在 CPX 界面上这样做,但我试图避免它).
我发现的唯一解决方法是:
ca: a_not_b = 1 <-> a - b = 1
cb: b_not_a = 1 <-> a - b = -1
cab: a_and_b = 1 <-> a + b = 2
c1: a_not_b-> i1 - 100 v1 = 0
c2: b_not_a-> i1 - 120 v1 = 0
c3: a_and_b = 1-> i1 - 80 v1 =0
我可以接受这个,因为我将用另一个程序生成这个 LP,但这会减慢 CPLEX 吗?有更好的方法吗?
谢谢
你说得很对。 LP 和 MILP 方法不直接允许这些类型的逻辑约束。相反,您通常需要在模型中创建可用于捕获这些条件的辅助变量。在许多情况下,这些将是布尔值或 0/1 整数变量。编写 MILP 模型的艺术和工艺的很大一部分是寻找在 LP 和 MILP 模型的相当严格的 'language' 中重写这些条件的好方法。这可能会导致一些相当有趣的心理体操!请注意,这是 MILP 方法的限制,而不仅仅是 CPLEX。支持这些逻辑关系的建模语言大多只是围绕这些具有辅助 binary/integer 变量的相同建模技术提供语法糖。
MILP 求解器可以处理具有数百万个变量和约束的非常大的问题;但那是因为潜在的数学结构和假设。约束编程等技术确实允许对逻辑和其他关系进行这种直接建模,但通常仅限于小得多的问题实例。
至于这是否会降低 CPLEX(或任何其他求解器)的速度,答案可能是肯定的。但是,如果您使用的是 MILP 求解器,可能别无选择 - 解决正确的问题总比解决错误的问题好。