Программный доступ к решениям MathProg в GLPK

У меня есть проблема, выраженная в MathProg, которую невозможно описать с помощью C API. В частности, у меня есть ограничения между переменными. Я создал файл MathProg и передал его в GLPK. Он находит правильное решение, но я не вижу, как получить доступ к этому решению программно. Возвращенная структура glp_prob не имеет ни строк, ни столбцов. Я мог бы просто проанализировать решение, напечатанное решателем, но я надеюсь, что есть лучший способ.

В качестве альтернативы, если можно выразить ограничения между переменными с помощью C API, я подозреваю, что это также решит мою проблему. Мой код MathProg ниже.

param T := 200;
set b, dimen 3;
set C, dimen 2;
set S, dimen 2;

set Q := setof{(i,j,c) in b : j == 1} i;
set I := setof{(i,s) in S} i;
set E := setof{(i,j) in Q cross I} (i, j);

var x{(i,j) in E}, >=0, <=1, binary;
var y{I}, >=0, <=1, binary;

maximize obj :
  sum{(i,j,c) in b} x[i,j] * c;

s.t. q1c:
  sum{(i,s) in S} x[1,i] <= 1;

s.t. q2c:
  sum{(i,s) in S} x[2,i] <= 1;

s.t. size :
  sum{(i,c) in C} c * y[i] <= T;

s.t. c111avail :
  x[1,1] <= y[1];

s.t. c122avail :
  x[1,2] <= y[2];

s.t. c131avail :
  x[1,3] <= y[1];

s.t. c132avail :
  x[1,3] <= y[2];

s.t. c243avail :
  x[2,4] <= y[3];

solve;

printf "set:";
printf {(i,s) in S: y[i] == 1} " %i", i;
printf "\nnot set:";
printf {(i,s) in S: y[i] == 0} " %i", i;
printf "\n";

data;

set C :=
  1 100
  2 100
  3 100
  4 100
;

set S :=
  1 100
  2 100
  3 200
  4 100
;

set b :=
  1 1 30
  1 2 30
  1 3 75
  1 4 0
  2 1 0
  2 2 0
  2 3 0
  2 4 35
;

end;

person Michael Mior    schedule 21.04.2014    source источник


Ответы (1)


Есть несколько дополнительных процедур API GLPK, которые вы можете использовать после решения проблемы. подобно

glp_get_row_prim(lp, i)
glp_get_col_prim(lp, i)

который вернет вам основное значение строки/столбца в виде числа с плавающей запятой.

Чтобы сгенерировать матричное представление ваших неравенств между двумя переменными (например, с помощью подпрограмм C API), вы должны переформулировать уравнения так, чтобы все переменные находились в левой части уравнения. Например

x[1, 1] <= y[1];

превратится в

y[1] - x[1, 1] >= 0;
person Paul G.    schedule 12.03.2015
comment
Спасибо за ответ. В конце концов я понял, что, конечно же, просто переформулировать все ограничения в сравнения, включающие 0. Почему-то в то время это не было для меня очевидным. - person Michael Mior; 12.03.2015