我有一个用MathProg表达的问题,这个问题似乎无法用have来描述。具体地说,我在变量之间有约束。我已经生成了一个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;发布于 2015-03-12 19:43:35
在解决问题之后,还可以使用一些额外的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;https://stackoverflow.com/questions/23199013
复制相似问题