0

我对 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 格式中没有这样的东西(我什至不确定我是否可以在 CPX 界面上做到这一点,但我试图避免它)ANDNOT

我发现的唯一解决方法是:

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 的速度吗?有没有更好的方法来做到这一点?

谢谢

4

1 回答 1

2

你说得很对。LP 和 MILP 方法不直接允许这些类型的逻辑约束。相反,您通常需要在模型中创建可用于捕获这些条件的辅助变量。在许多情况下,这些将是布尔变量或 0/1 整数变量。编写 MILP 模型的大部分艺术和工艺是找到用 LP 和 MILP 模型相当严格的“语言”重写这些条件的好方法。这可能会导致一些相当有趣的心理体操!请注意,这是 MILP 方法的限制,而不仅仅是 CPLEX。支持这些逻辑关系的建模语言大多只是围绕这些具有辅助二进制/整数变量的相同建模技术提供语法糖。

MILP求解器可以处理具有数百万个变量和约束的非常大的问题;但这是因为潜在的数学结构和假设。约束编程等技术确实允许对逻辑和其他关系进行直接建模,但通常仅限于更小的问题实例。

至于这是否会减慢 CPLEX(或任何其他求解器)的速度,答案可能是肯定的。但是,如果您使用 MILP 求解器,则可能别无选择 - 解决正确的问题比解决错误的问题要好。

于 2016-07-07T13:36:21.947 回答