Переменная GLPK, кажется, изменилась после решения

Я столкнулся со странным поведением glpsol, точнее одной из его переменных. Я запускаю команду, используя glpsol -m sol.mod

Ввод в файле sol.mod:

set Points := (1..3);
var a{i in Points}, >= 0;
var x1{i in Points};
var x2{i in Points};
maximize obj: sum{i in Points} a[i];
px1: x1[1] = 0;
py1: x2[1] = 0;
px2: x1[2] = 2;
py2: x2[2] = 1;
px3: x1[3] = 3;
py3: x2[3] = 3;
p1x2: x1[1] + a[1] <= x1[2] - a[2];
p1x3: x1[1] + a[1] <= x1[3] - a[3];
p2x3: x2[2] + a[2] <= x2[3] - a[3];
solve;
printf "#OUTPUT:\n";
#printf{i in Points} "a_%d = %d\n", i, a[i];
printf "a[1]: %d\n", a[1];
printf "-a[1]: %d\n", -a[1];
printf "a[3]: %d\n", a[3];
printf "#OUTPUT END:\n";
end;

Выход:

    GLPSOL: GLPK LP/MIP Solver, v4.52
Parameter(s) specified in the command line:
 -m sol.mod
Reading model section from sol.mod...
22 lines were read
Generating obj...
Generating px1...
Generating py1...
Generating px2...
Generating py2...
Generating px3...
Generating py3...
Generating p1x2...
Generating p1x3...
Generating p2x3...
Model has been successfully generated
GLPK Simplex Optimizer, v4.52
10 rows, 9 columns, 21 non-zeros
Preprocessing...
3 rows, 3 columns, 6 non-zeros
Scaling...
 A: min|aij| =  1.000e+00  max|aij| =  1.000e+00  ratio =  1.000e+00
Problem data seem to be well scaled
Constructing initial basis...
Size of triangular part is 3
*     0: obj =   0.000000000e+00  infeas =  0.000e+00 (0)
*     3: obj =   3.500000000e+00  infeas =  0.000e+00 (0)
OPTIMAL LP SOLUTION FOUND
Time used:   0.0 secs
Memory used: 0.1 Mb (126476 bytes)
#OUTPUT:
a[1]: 2
-a[1]: -1
a[3]: 2
#OUTPUT END:
Model has been successfully processed

Проблема, похоже, в том, что a[1] оценивается как 2, а -a[1] оценивается как -1. Кроме того, a[3] также равно 2, поэтому ограничение p1x3 не выполняется.

В настоящее время я понятия не имею, как это исправить или даже что вызвало это.


person oblomov    schedule 08.04.2016    source источник


Ответы (1)


Измените спецификатор формата %d на %g и посмотрите, что произойдет. Обратите внимание, что a{i} — непрерывные переменные, которые могут иметь дробные значения.

person Tarantoga    schedule 10.04.2016