Неквадратичные нелинейные ограничения AMPL с cplex

Я работаю над проектом оптимизации и столкнулся с небольшой проблемой. В своем проекте я использую 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). Не могли бы вы посоветовать мне, как решить эту проблему? Заранее спасибо.


person user3787524    schedule 23.11.2014    source источник
comment
Если вы используете квадратную разницу вместо абсолютной разницы, вернет ли это решение? Я также не понимаю, почему вы беспокоитесь об использовании ограничения, невозможно ли просто использовать maximize obj: sum {(A, B) в moveTuples} abs (sum {i in Numbers} (assign [A, i] * i) - (сумма {j в числах} x [B, j] * j)); (или соответствующая целевая функция разности квадратов)?   -  person Ron Kaminsky    schedule 24.11.2014
comment
Спасибо, сэр. Использование предложенной цели не помогло, поэтому мне пришлось немного изменить ее, чтобы она работала. 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


Ответы (1)


Ограничение moveApart является нелинейным (и неквадратичным), потому что оно содержит вызов abs. Однако, поскольку ваша проблема является чисто целочисленной, вы можете решить ее с помощью CPLEX CP. Оптимизатор (ilogcp).

person vitaut    schedule 11.04.2015