Я использую MathProg (язык, специфичный для библиотеки GLPK, напоминающий подмножество AMPL), чтобы найти топологическое ранжирование вершин графа. Это назначение для моего класса линейного программирования. Это вводное упражнение, чтобы мы могли сформулировать простую линейную программу и решить ее с помощью GLPK.Отпечатайте что-то совершенно другое, когда LP недопустимо в MathProg
Я написал сценарий 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: %d\n" else ""), i, v[i];
printf "#OUTPUT END\n";
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
. Я искал что-то вроде переменной в общих языках программирования.
Мой 'glpsol' принимает определение' Feasible' парам только после того, как 'solve' и' V [я] .val' заменен только 'V [ я] '. – Palec
MathProg не имеет функции 'print' и оператора' if'. Он имеет только оператор 'if'. Кроме того, 'solve_result', вероятно, не поддерживается, потому что' printf (if solve_result = 'infeasible' then 'Infeasible, имеет циклы или циклы. \ N "else" ");' дает мне 'solve_result not defined'. Но в любом случае спасибо, я не понимал, что логические значения не считаются числовыми (в отличие от, например, в C). – Palec
Я рад, что мне удалось помочь, несмотря на ограниченное знание glpk =). – vitaut