我想编写一个优化模型,根据一些约束选择两个任务中较小的一个。
minimize obj: (doT1 * T1) + (doT2*T2) + (additional variables)
现在,T1和T2表示任务的持续时间,doT1表示执行这些任务的标志。如果需要,我希望此优化仅选择其中一个。
当我放置约束
时s.t. c15: 0<= doT1 <= 1;
s.t. c15: 0<= doT2 <= 1;
我收到一条错误消息,在glpsol中说不允许线性形式的乘法。
是否可以在线性编程中表达OR条件?
答案 0 :(得分:1)
gplsol
最有可能抱怨变量doT1 * T1
和doT2 * T2
的产品。
我假设doT1
和doT2
是二进制变量,T1
和T2
是连续变量(表示任务的持续时间)。 (注意,这意味着您将不得不使用混合整数编程求解器而不是纯线性编程求解器。您可能还想尝试使用强大的MIP求解器,如Gurobi)。
您可以通过将约束和目标重写为
来构建模型 minimize T1 + T2 + (additional variables)
st T1 <= UT1*doT1
T2 <= UT2*doT2
doT1 + doT2 <= 1
doT1, doT2 binary
(plus any additional constraints)
其中UT1
是任务T1
持续时间的上限,UT2
是任务T2
持续时间的上限。如果doT1 = 0
然后T1 <= 0
,则任务将无法完成。如果doT1 = 1
,则为T1 <= UT1
,这意味着任务T1
可能需要一段时间。同样适用于T2
。
OR条件由约束doT1 + doT2 <= 1
表示。此约束意味着doT1
和doT2
不能都是1.这只能选择一个作业。请注意,<=
约束还允许您不执行任一任务。如果必须至少完成一项任务,则需要使用约束doT1 + doT2 == 1
。