我有一个用MathProg编写的线性程序。我的未知二进制变量是一个二维数组,定义如下:
var x{i in V, l in L}, >=0, <=1;
其中V和L是整数集。
但是,某些变量的值是事先已知的,我想为求解器指定这个值以减小ILP的大小。例如,我知道当l = 2时x [4,l]是1,而l的任何其他值都是0。目前,我将其指定为 约束 :
s.t. initial4{i in V: i=4}: sum{l in L}(l*x[i,l]) = 2;
我想知道这是否是预先指定未知数子集值的有效方法。
理想情况下,我希望将这些信息与数据部分一起放在一个单独的文件中,而不是放在模型文件中。
答案 0 :(得分:2)
为每个变量创建上限和下限:
var x{i in index_set}, >=x_L[i], <=x_U[i];
并调整已知值的下限和上限。
以下是将x[2]
修改为零的MathProg代码段:
set index_set;
param x_L{index_set};
param x_U{index_set};
var x{i in index_set}, >=x_L[i], <=x_U[i];
s.t.
dummy:
sum{i in index_set} x[i] = 2;
solve;
display x;
data;
set index_set := 1, 2, 3;
param x_L default 0;
param x_U default 1 :=
2 0;
end;
从(过滤的)输出中可以清楚地看出,预处理器非常智能,可以将x[2]
修复为0:
glpsol --math test.mod
OPTIMAL SOLUTION FOUND BY LP PREPROCESSOR
x[1].val = 1
x[2].val = 0
x[3].val = 1