跳转到内容

GLPK/条件约束

来自维基教科书,开放世界中的开放书籍

取决于参数的约束

[编辑 | 编辑源代码]

有时,约束只有在满足可以用参数表达的条件时才有效。

以下不是合法的 GMPL

if (flag) {
    s.t. c : x <= 5;
} else {
    s.t. c : x <= 3;
}

但我们可以在 GMPL 中使用以下方式建模

/*
 * This model demonstrates how to let the existence of simple constraints
 * depend on a parameter.
 */

/* This flag controls if constraint c0 or contraint c1 is active */
param flag := 1;

var x;

maximize obj: x;

s.t. c0{i in {1} : flag == 0} : x <= 3;
s.t. c1{i in {1} : flag == 1} : x <= 5;

solve;

display x;

end;

对于索引条件,我们可以做同样的事情

/*
 * This model demonstrates how to let the existence of indexed constraints
 * depend on a parameter.
 */

/* This flag controls if constraint c0 or contraint c1 is active */
param flag := 0;

set I := {1..3};
var x{I}, <= 10; 

maximize obj: sum{i in I} x[i];

s.t. c0{i in I : i < 3 && flag == 0} : x[i] <= 3;
s.t. c1{i in I : i > 1 && flag == 1} : x[i] <= 5;

solve;

display x;

end;

取决于二元变量的约束

[编辑 | 编辑源代码]

如果约束的相关性取决于二元变量,我们可以使用 BigM 方法

/*
 * This model demonstrates how to let the relevance of indexed constraints
 * depend on a binary variable.
 */

/* Big M, chosen as small as possible */
param M := 7;

set I := {1..3};
var x{I}, <= 10; 

/* Binary variable controlling which constraint is active */
var y, binary;

maximize obj: sum{i in I} x[i];

s.t. c0{i in I : i < 2} : x[i] <= 3 + M * y;
s.t. c1{i in I : i > 1} : x[i] <= 5 + M * (1 - y); 

solve;

display x, y;

end;
华夏公益教科书