当LP在MathProg中不可行时,打印一些完全不同的东西



我正在使用MathProg(一种特定于GLPK库的语言,类似于AMPL的子集)来查找图的顶点的拓扑排序。这是我的线性规划课的作业。这是一个入门练习,以确保我们可以制定一个简单的线性程序,并使用GLPK解决它。

我已经编写了一个Perl脚本,它用MathProg为给定的图生成线性程序。它通过printf打印变量(顶点列)的值。如果可行,那正是我想要的;否则它会打印所有的零,但我只想打印Infeasible, has cycles or loops.

我设法以一种巧妙的方式做到了(见下文)如何做到更优雅,而不重复可行性的条件?有没有一种方法可以检测不可行性,而不取决于正在解决的问题

param Vsize := 3;
set V "Vertices" := (0..Vsize-1);
set E "Edges" within V cross V := {(0, 1), (1, 2), (2, 0)};
var v{i in V} >= 0;
minimize rank_total: sum{i in V} v[i];
edge{(i, j) in E}: v[j] - v[i] >= 1;
solve;
printf "#OUTPUT:n";
printf (if ((exists{i in V} v[i] >= 1) or card(E) = 0) then "" else "Infeasible, has cycles or loops.n");
printf{i in V} (if ((exists{j in V} v[j] >= 1) or card(E) = 0) then "v_%d: %dn" else ""), i, v[i];
printf "#OUTPUT ENDn";
end;

我试图声明param Feasible binary := (exists{i in V} v[i] >= 1) or card(E) = 0;,但GLPK用Model processing error拒绝了它。当我在solve之前声明它时,它说operand preceding >= has invalid type,而在expression following := has invalid type之后声明它。我在普通编程语言中寻找一个类似变量的东西。

在AMPL中,您可以检查内置参数solve_result,看看问题是否不可行:

if solve_result = 'infeasible' then
  print 'Infeasible, has cycles or loops.';

然而,我不确定GLPK是否支持此参数,在这种情况下,您可能需要手动检查可行性。

至于错误,由于exists是一个逻辑表达式,所以不能将其用作数字表达式。修复方法是简单地将逻辑表达式放在if:中

param Feasible binary :=
  if (exists{i in V} v[i].val >= 1) or card(E) = 0 then 1;

相关内容

  • 没有找到相关文章

最新更新