私は最適化プロジェクトに取り組んでおり、小さな問題に直面しました。私のプロジェクトでは、AMPL と CPLEX をソルバーとして使用しています。私のコードには、e1、e2、...、en で示されるいくつかの要素があります。これらの要素内にタプルを含むセットもあります。moveTuples セット内の 1 つのタプル内の 2 つの要素ごとの距離を最大化するように、各要素に 1 から 'n' までの数値を割り当てる必要があります (それらを順序付ける必要がありますが、同じタプル内の要素間の距離を保つようにしてください)。 .
すべての要素には割り当てられた番号が 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
また
e1 -> 3
e2 -> 1
e3 -> 2
タプル (e1,e2) を使用して e2 から e1 を移動するだけでよいためです。前のコードを実行すると、次のエラーが表示されます: ... 非二次非線形制約 (間違いなく "moveApart" 制約) が含まれています。この問題を解決する方法を教えてください。前もって感謝します。