2015-03-28 7 views
1

Я использую 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. Я искал что-то вроде переменной в общих языках программирования.

ответ

1

В 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; 
+1

Мой 'glpsol' принимает определение' Feasible' парам только после того, как 'solve' и' V [я] .val' заменен только 'V [ я] '. – Palec

+0

MathProg не имеет функции 'print' и оператора' if'. Он имеет только оператор 'if'. Кроме того, 'solve_result', вероятно, не поддерживается, потому что' printf (if solve_result = 'infeasible' then 'Infeasible, имеет циклы или циклы. \ N "else" ");' дает мне 'solve_result not defined'. Но в любом случае спасибо, я не понимал, что логические значения не считаются числовыми (в отличие от, например, в C). – Palec

+0

Я рад, что мне удалось помочь, несмотря на ограниченное знание glpk =). – vitaut

 Смежные вопросы

  • Нет связанных вопросов^_^