用Mathprog编写的线性程序中变量的已知值

时间:2012-05-16 13:17:47

标签: linear-programming ampl mathprog

我有一个用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;

我想知道这是否是预先指定未知数子集值的有效方法。

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

1 个答案:

答案 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