1

整数計画モデルがあり、CPLEXで線形緩和を解きたいです。当初、私は変数を次のように定義していました。

BoolVarMatrix X(env,I);
for(IloInt i = 0; i < I; i++){
  X[i] = IloBoolVarArray(env, J);
}

IloBoolVarArray y(env,J);

しかし今、私はそれらを、の範囲にリラックスさせる必要があり0<=x<=1ます0<=Y<=1。そのために、定義を次のように変更しました。

NumVarMatrix X(env,I, 0, 1);
for(IloInt i = 0; i < I; i++){
  X[i] = IloNumVarArray(env, J, 0, 1);
}

IloNumVarArray y(env,J, 0, 1);

しかし、それでも整数の解が得られます。代わりに何をすべきでしたか?

4

3 に答える 3

1

バイナリ変数を ILOFLOAT に変換する必要はありません。LPRelax などの新しいモデル インスタンスを定義し、以下のように IloConversion を使用します。

IloModel LpRelax(env); 
LpRelax.add(model); 
LpRelax.add(IloConversion(env, vars, ILOFLOAT));

IloCplex cplex(env); 
cplex.extract(LpRelax); 
cplex.solve();

それでも積分解が得られる場合、問題は積分である可能性があります。あなたの coefficinet には、TOTALY UNIMODULARITY のような特別なプロパティがあり、積分 RHS と一緒に積分ソリューションを生成することを意味します。

それが役立つことを願っています:-)。

于 2016-11-27T23:06:44.780 に答える
1

リラックスした LP にも整数である最適解がある可能性は十分にあります。これを確認する簡単な方法の 1 つは、バインディング カットを追加して、分数の値を想定させることです。

X1 の lb と ub を変更します。0 <= x1 <= 1取得して作成し (たとえば) 0.01 <= x1 <= 0.99、LP を解きます。元の定式化でバイナリであったすべての変数に対してこれを行います。

言い換えれば、 のublbIloNumVarArray分数にして、最適解で分数の値が得られれば、緩和を正しく行ったことがわかります。

于 2012-03-04T07:04:21.340 に答える
0

おそらく、制約係数行列 A (AX=b) はユニモジュラーです。

于 2012-08-06T05:38:57.067 に答える