2

我有一个用MathProg编写的线性程序。我未知的二进制变量是一个二维数组,定义为:

var x{i in V, l in L}, >=0, <=1;

其中 V 和 L 是整数集。

然而,一些变量的值是预先知道的,我想为求解器指定它以减小 ILP 的大小。例如,我知道当 l=2 时 x[4,l] 为 1 并且对于 l 的任何其他值为零。目前,我将其指定为约束

s.t. initial4{i in V: i=4}:   sum{l in L}(l*x[i,l]) = 2;

我想知道这是否是提前指定未知子集值的有效方法。

理想情况下,我想将此类信息与数据部分一起放在单独的文件中,而不是放在模型文件中。

4

1 回答 1

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
于 2012-05-16T15:57:10.703 回答