0

cplexを使用して、SATの問題を数回解決し、変数の方向(IloCplex.BranchDirection.Up | IloCplex.BranchDirection.Down)と優先順位を変更してさまざまな解決策を取得したいと思います。しかし、私はいつも同じ解決策を手に入れます(数千が存在します)。

私は多かれ少なかれ次のことをします:

IloCplex solver = new IloCplex();
solver.addEq(...);
solver.addGe(...);
solver.addLe(...);

while (true) {
  Collections.shuffle(vars);

  for (IloIntVar var : vars) {
    solver.setDirection(variables.get(object), random.nextBoolean() ? IloCplex.BranchDirection.Up : IloCplex.BranchDirection.Down);
    solver.setPriority(variables.get(object), vars.indexOf(var));
  }

  solver.solve();

  for (IloIntVar var : vars) {
      value = solver.getValue(var);
  }
}

各反復で変数ごとに異なる(可能であれば)値を取得したいと思います。誰かが私のせいがどこにあるかわかりますか?すべてのsolver.clear*メソッドを試してリセットしましたが、これは役に立ちませんでした。

4

2 に答える 2

1

ブランチの優先順位は、ブランチアンドカットツリーで展開されるノードを変更します。それらを変更することで異なる解決策が得られるかもしれませんが、保証はありません。実際、ルートノードでヒューリスティックを使用して最初のソリューションが見つかり、分岐がまったく発生しない可能性があります。あなたが持っているような純粋な0-1の問題の場合、あなたは以下を行うことができます

  1. 最初の解を解く(x *
  2. y=xの合計* [i]とします。
  3. 制約の合計を追加します(2 x * [i]-1)x [i] <= y
于 2013-01-17T19:39:00.603 に答える
0

CPLEX には、MIP 最適化中に複数のソリューションを蓄積するためのソリューション プール機能もあります。詳細を制御するパラメーターがあるため、特定のパーセンテージの最適性内のソリューションのみを受け入れるように指示できます。ソリューション プールの基礎となる 1 ツリー アルゴリズムは、要求されたソリューションを蓄積するために 1 つまたは 2 つの分岐およびバインド パスのみを必要とするため、これは、以前に見つかったソリューションを除外するために制約を繰り返し最適化および追加するよりも高速に実行される可能性があります。詳細については、ソリューション プールと設定手順について CPLEX のドキュメントを参照してください。

于 2013-05-17T19:58:28.823 に答える