通过改变方向和优先级找到多种解决方案

时间:2013-01-17 16:02:14

标签: cplex

使用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 *方法来重置它,但这没有帮助。

2 个答案:

答案 0 :(得分:1)

分支优先级会更改哪些节点在分支剪切树上展开。虽然可能通过更改它们来获得不同的解决方案,但无法保证。事实上,第一个解决方案很可能是在根节点使用启发式算法,而根本没有发生分支。如果您遇到纯粹的0-1问题,可以执行以下操作

  1. 解决第一个解决方案(x *
  2. 设y = x * [i]
  3. 的总和
  4. 添加约束和(2 x * [i] - 1)x [i]< = y

答案 1 :(得分:0)

CPLEX还具有解决方案池功能,可在MIP优化期间累积多个解决方案。它具有控制细节的参数,因此您可以指示它仅接受一定百分比最优化的解决方案。由于解决方案池的基础树算法仅需要一个或两个分支和绑定通道来累积所请求的解决方案,因此这可能比重复优化和添加约束以排除先前找到的解决方案更快。有关更多信息,请参阅解决方案池的CPLEX文档并填充过程。