Я работаю над проектом оптимизации и столкнулся с небольшой проблемой. В своем проекте я использую AMPL и CPLEX в качестве решателя. В моем коде есть некоторые элементы, обозначенные e1, e2, ..., en. У меня также есть набор, который содержит кортежи внутри этих элементов. Я должен присвоить каждому элементу число от 1 до 'n', чтобы максимизировать расстояние между каждыми двумя элементами в 1 кортеже в наборе moveTuples (мне нужно их упорядочить, но постарайтесь сохранить расстояние между элементами в одном кортеже) .
Каждому элементу ДОЛЖЕН быть присвоен ТОЛЬКО 1 номер, и каждый номер должен быть присвоен ТОЛЬКО 1 элементу. Для этого я написал следующий код:
set Elements;
set moveTuples dimen 2;
set Numbers;
var assign {Elements,Numbers} binary;
var maximizer{moveTuples} integer >= 0;
maximize obj: sum {(A,B) in moveTuples} maximizer[A,B];
subject to assign1NumberPerElement {i in Element}: sum {c in Numbers} assign[i,c] = 1;
subject to assign1ElementPerNumber {c in Numbers}: sum {i in Element} assign[i,c] = 1;
subject to moveApart {(A,B) in moveTuples}: abs(sum{i in Numbers}(assign[A,i]*i) - (sum{j in Numbers}x[B,j]*j)) - maximizer[A,B] = 0 ;
data;
set Elements:= e1 e2 e3;
set Numbers:= 1 2 3;
set moveTuples: e1 e2 e3:=
(e1, e2);
solve;
display assign;
Теперь проблема ясна, и для предыдущего примера вывод должен быть либо:
e1 -> 1
e2 -> 3
e3 -> 2
or
e1 -> 3
e2 -> 1
e3 -> 2
поскольку требуется только переместить e1 из e2, используя кортеж (e1, e2). При запуске предыдущего кода я получаю сообщение об ошибке: ... содержит неквадратичное нелинейное ограничение (определенно ограничение moveApart). Не могли бы вы посоветовать мне, как решить эту проблему? Заранее спасибо.
maximize obj: sum {(A,B) in moveTuples, i in Numbers, j in Numbers: i != j} (assign[B,j]*assign[A,i]*num(i) - assign[A,i]*assign[B,j]*num(j));
. Единственная проблема заключается в предположении, что кортежи были (e1, e2), (e3, e4), (e2, e5). Теперь цель - 6, и это правильно, но правильная последовательность должна быть (e1, e3, e2, e4, e5), чтобы никакие 2 элемента в одном кортеже не следовали друг за другом, а цель оставалась 6. AMPL создает последовательность (e5, e4, e2, e1, e3) == ›obj = 6, но e1 и e2 идут подряд. - person user3787524   schedule 24.11.2014