【问题标题】:Programmatic access to MathProg solutions in GLPK以编程方式访问 GLPK 中的 MathProg 解决方案
【发布时间】:2015-03-12 19:43:34
【问题描述】:

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

【问题讨论】:

    标签: c glpk mathprog


    【解决方案1】:

    在解决问题后,您可以使用一些额外的 GLPK API 例程。喜欢

    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;
    

    【讨论】:

    • 感谢您的回答。我最终意识到,将所有约束重新表述为涉及 0 的比较当然很简单。不知何故,这在当时对我来说并不明显。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多