すべての整数変数をバイナリとして使用して、CPLEX の混合整数問題に対する多くの解決策を作成しようとしています。この問題には、約 1000 の連続変数と 1000 のバイナリ変数があり、インジケーターとして機能し、約 2500 の線形制約があります。
私の目的関数は指標変数の最小化であり、バイナリ変数に選択された値に関して互いに異なる、最適に近い多くのソリューションを生成したいと考えています。私の現在のコードは次のように要約できます-
IloCplex cplexModel = new IloCplex();
---build the problem, set objective---
cplexModel.setParam(IloCplex.IntParam.SolnPoolCapacity, N);
cplexModel.setParam(IloCplex.IntParam.PopulateLim, K*N);
cplexModel.setParam(IloCplex.IntParam.SolnPoolReplace, 2);
cplexModel.setParam(IloCplex.DoubleParam.SolnPoolGap, D);
cplexModel.setParam(IloCplex.IntParam.MIPEmphasis, 0);
cplexModel.populate();
ここで、N、K、および D は、目的の解の数の短縮名であり、解を求めているときに生成される解の数をスケーリングする係数と、最適な最小化から許容できる相対的なギャップです。また、問題に関連していないように思われる他のいくつかの CPLEX パラメーターも使用します。
私の問題は、ソリューションの多様性が連続変数を含むすべての変数で測定されることですが、バイナリ変数値が異なるソリューションにのみ関心があります。つまり、取得している結果のほとんどは、バイナリ変数に対して同じ値を共有し、私には区別がつかないことを意味します (バイナリ値にのみ関心があるため)。私の現在の回避策は、設定することです-
cplexModel.setParam(IloCplex.IntParam.SolnPoolCapacity, T*N);
cplexModel.setParam(IloCplex.IntParam.PopulateLim, T*K*N);
T は通常 50 であり、次に (うまくいけば) N を選択すると、バイナリ変数の値が互いに異なるソリューション プールから結果が得られます。
多様性計算をバイナリ変数に制限する方法として多様性フィルターをチェックしましたが、各ソリューションと参照ソリューションの間ではなく、ソリューション間の多様性を強制するために使用する方法がわかりません。それ以外に、私は他に何ができるかについて無知です。
助けていただければ幸いです。また、これは私の最初の質問なので、フォーマットが間違っていたら申し訳ありません。