首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在LP格式的CPLEX整数程序中,这是指示器约束的有效使用吗?

在LP格式的CPLEX整数程序中,这是指示器约束的有效使用吗?
EN

Stack Overflow用户
提问于 2013-09-21 02:24:54
回答 1查看 1.4K关注 0票数 1

我试图理解在CPLEX中指示器约束的用法。我已经指定了一个要在CPLEX交互式优化器中解决的简单整数编程问题。由于各种原因,我无法使用任何CPLEX API来完成此任务。

真正的问题是一个简单的最大覆盖集问题,但是对于大量的variables.There,有许多类型的东西,这些东西可以在一个或多个盒子中找到。我想最大化我的解决方案中的事物类型的数量,同时将框的数量保持在一个约束之下。所有的变量都是二进制的。

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

代码语言:javascript
复制
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采样两次的解决方案。我替换了指示器约束

代码语言:javascript
复制
   thing1_indicator: THING1 = 1 -> BOX1 + BOX4 + BOX5 >=1

使用

代码语言:javascript
复制
   thing1_indicator: THING1 = 1 -> BOX1 + BOX4 + BOX5 >=2

在我的实际问题中,这个约束的RHS似乎被忽略了。CPLEX读取和优化没有任何问题,返回的解决方案给出了THING1的值为1,但是(例如) BOX1 = 1,BOX4 = 0,BOX5 = 0。

这让我担心,要么是我完全忽略了LP格式程序中指示器约束的使用要点,要么是处理指示器约束的优先级问题导致了这个问题。

我想到的另一件事是,CPLEX的预解算例程可能正在删除某个约束,但我认为在深入研究预解算输出之前,我应该先检查一下显而易见的情况。

EN

回答 1

Stack Overflow用户

发布于 2013-09-23 04:32:20

你可以把它们写成cplex可以处理的线性约束。可以编写约束box1_indicator

代码语言:javascript
复制
box1_indicator: THING1 + THING2 + THING3 - 3 * BOX1 >= 0

如果BOX1为1,则约束变为THING1 + THING2 + THING3 >= 3,并且仅当和恰好为3时才能满足。如果BOX1为零,则约束变为THING1 + THING2 + THING3 >= 0,始终为真。

同样地,

代码语言:javascript
复制
thing1_indicator: BOX1 + BOX4 + BOX5 - THING1 >= 0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18923427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档