1

モデル ファイルに次の問題があります。CPLEX ソルバーが最初に括弧内のアクションを実行してから乗算したいと考えています。通常の数学と同様に....しかし、この制約でモデルファイルを実行すると:

subject to c4a {e in E, k in K, o in O}:
f[k,o] = 0
==>     
    delta[e,k,o] - p[k,e] * (sum{l in K}(b[l,e]*(1-f[l,o]))) = 0 
else  
    delta[e,k,o] = 0;

ここで、E、K、O はセットです。delta、f はバイナリ変数です。そして残りはパラメータです。この括弧で前に説明した問題があります: "(1-f[l,o])"。サンプル データ ファイルを解決しようとすると、次のバグが発生します。

CPLEX 11.2.0: logical constraint _slogcon[1] is not an indicator constraint.
expand _slogcon[1];
subject to c4a['1_2',2,'o1']:f[2,'o1'] == 0 ==> delta['1_2',2,'o1'] - (3 - f[2,'o1'] - f[3,'o1'] - 
f[4,'o1']) == 0 else delta['1_2',2,'o1'] == 0;

ここでは、最初の CPLEX ソルバーがブラケットの要素を b[l,e] で乗算し、それらを追加しようとしていることがわかります。私の質問は次のとおりです。この状況を回避するにはどうすればよいですか?

4

1 に答える 1

2

expandAMPLのコマンドは、制約式を簡素化します。特に、同種の用語を組み合わせます。例えば:

var x;
var y;
subject to c: 2 * (x + y) + 3 * x = 0;
expand c;

版画

subject to c:
    5*x + 2*y = 0;

あなたの場合、AMPLは加算/減算よりも乗算の分配a * (b - c) = a * b - a * c性を使用しています: . これが必要なのは、CPLEX や他の多くのソルバーが特定の形式 (線形式a1 * x1 + a2 * x2 + ... + an * xnなど) の制約式のみを受け入れ、任意の式ツリーを (少なくとも CPLEX で C API を使用して) 渡す方法がないためです。

于 2013-06-04T16:05:31.557 に答える