这是LP格式CPLEX整数程序中指标约束的有效使用吗?

时间:2013-09-20 18:24:54

标签: linear-programming cplex integer-programming

我正在尝试了解CPLEX中指标约束的使用。我在CPLEX Interactive Optimizer中指定了一个简单的整数编程问题。由于各种原因,我无法使用任何CPLEX API执行此任务。

真正的问题是一个简单的最大覆盖集问题,但有大量的变量。有许多类型的THING,可以在一个或多个BOXES中找到。我想在我的解决方案中最大化THING类型的数量,同时保持BOXES的数量低于约束。所有变量都是二进制文件。

真正的问题显然要大得多。我在这里制作了一个简单的版本,约束为3个BOXES。

MAXIMIZE
obj: THING1 + THING2 + THING3 + THING4 + THING5 + THING6 + THING7 + THING8 + THING9 + THING10
SUBJECT TO
nboxes: BOX1 + BOX2 + BOX3 + BOX4 + BOX5 + BOX6 <=3
box1_indicator: BOX1 = 1 -> THING1 + THING2 + THING3 = 3
box2_indicator: BOX2 = 1 -> THING4 + THING5 + THING6 = 3
box3_indicator: BOX3 = 1 -> THING7 + THING8 + THING9 = 3
box4_indicator: BOX4 = 1 -> THING10 + THING1 = 2
box5_indicator: BOX5 = 1 -> THING1 + THING5 + THING9 + THING10 = 4
box6_indicator: BOX6 = 1 -> THING3 + THING4 = 3
thing1_indicator: THING1 = 1 -> BOX1 + BOX4 + BOX5 >=1
thing2_indicator: THING2 = 1 -> BOX1 >=1
thing3_indicator: THING3 = 1 -> BOX1 + BOX6 >=1
thing4_indicator: THING4 = 1 -> BOX2 + BOX6 >=1
thing5_indicator: THING5 = 1 -> BOX2 + BOX5 >=1
thing6_indicator: THING6 = 1 -> BOX2 >=1
thing7_indicator: THING7 = 1 -> BOX3 >=1
thing8_indicator: THING8 = 1 -> BOX3 >=1
thing9_indicator: THING9 = 1 -> BOX3 + BOX5 >=1
thing10_indicator: THING10 = 1 -> BOX4 + BOX5 >=1

BINARIES
THING1
THING2
THING3
THING4
THING5
THING6
THING7
THING8
THING9
THING10
BOX1
BOX2
BOX3
BOX4
BOX5
BOX6

END

我的第一个问题是:这个问题的表述只使用指标约束有效吗?在我的实际例子中,它可以愉快地与CPLEX一起运行,我还没有发现它产生意想不到的解决方案。回答这个问题是下面问题的先决条件。

我的第二个问题是:我想引入一个约束,我只想要两次采样THING1的解决方案。我替换了指标约束

   thing1_indicator: THING1 = 1 -> BOX1 + BOX4 + BOX5 >=1

   thing1_indicator: THING1 = 1 -> BOX1 + BOX4 + BOX5 >=2

在我真正的问题中,这种约束的RHS似乎被忽略了。 CPLEX在没有抱怨的情况下读取和优化,并且返回的解决方案将THING1的值赋予1,但是(例如)将BOX1 = 1,BOX4 = 0,BOX5 = 0。

这使我担心要么我完全错过了在LP格式程序中使用指标约束的观点,要么就是处理指标约束的优先级导致了这个问题。

我发生的另一件事是,CPLEX的预解析程序可能会在某个地方移除约束,但我想在挖掘预求解输出之前我会检查明显的。

1 个答案:

答案 0 :(得分:1)

您可以将这些写为线性约束,可以由cplex处理。可以编写约束box1_indicator

box1_indicator: THING1 + THING2 + THING3 - 3 * BOX1 >= 0

如果BOX1为1,则约束变为THING1 + THING2 + THING3 >= 3并且只有在和为3时才能满足。如果BOX1为零,则约束变为THING1 + THING2 + THING3 >= 0,它始终为真。 / p>

同样

thing1_indicator: BOX1 + BOX4 + BOX5 - THING1 >= 0