我是整数优化新手。我正在尝试解决以下大型(虽然不是那么大)二元线性优化问题:
max_{x} x_1+x_2+...+x_n
服从:A*x <= b ; x_i is binary for all i=1,...,n
如你所见,
。控制变量是长度为 x 的向量,例如 n=150; x_i 是所有 i=1,...,n
的二进制。我想最大化 x_i 的总和
。在约束中,A 是一个 nxn 矩阵,b 是一个 nx1 向量。所以我有 n=150 线性不等式约束。
我想获得一定数量的解,NS。比如说,NS=100。(我知道有不止一种解决方案,而且可能有数百万个。)
我正在使用 Google 的 Python OR-Tools。我能够写出问题并获得一种解决方案。之后我尝试了很多不同的方法来获得更多解决方案,但我就是做不到。例如:
# Define the constraints (A and b are lists)
for j in range(n):
constraint_expr = [int(A[j][l])*x[l] for l in range(n)]
model.Add(sum(constraint_expr) <= int(b[j][0]))
V = 112
constraint_obj_val = [-x[l] for l in range(n)]
model.Add(sum(constraint_obj_val) <= -V)
# Call the solver:
solver = cp_model.CpSolver()
solution_printer = VarArraySolutionPrinterWithLimit(x, NS)
solver.parameters.enumerate_all_solutions = True
status = solver.Solve(model, solution_printer)
不幸的是,我的问题有点模糊,但问题是:获得多个解决方案来解决我的优化问题的最佳方法是什么?
如果我不够清楚或者您需要更多/其他代码块等,请告诉我。这是我第一次在这里发布问题:)
提前致谢。
你的矩阵 A 是积分吗?如果没有,您就无法使用 scip 和 CP-SAT 解决同样的问题。
此外,为什么要使用scip?您应该使用相同的求解器来求解这两部分。
此外,我相信 scip 中的默认解决方案池实现将以相反的顺序返回找到的所有解决方案,从而按质量顺序递减。
在 Gurobi 中,你可以这样做来获得多个最佳解决方案:
solver->SetSolverSpecificParametersAsString("PoolSearchMode=2"); // or-tools [Gurobi]
来自 Gurobi 参考资料 [第 20.1 节]:
默认情况下,Gurobi MIP 求解器将尝试为您的模型找到一个经过验证的最佳解决方案。
您可以使用 PoolSearchMode 参数来控制用于查找解决方案的方法。 在默认设置 (0) 下,MIP 搜索只是旨在找到一个 最优解。将参数设置为 1 会导致 MIP 搜索 花费额外的努力来寻找更多的解决方案,但在 非系统的方式。你会得到更多的解决方案,但不一定 最佳解决方案。将参数设置为 2 会导致 MIP 执行 系统地搜索n个最佳解决方案。对于非默认 设置中,PoolSolutions 参数设置数字的目标 需要找到的解决方案。
寻找多个最优解的另一种方法是首先将原始问题求解至最优,然后添加目标函数作为约束,下限和上限作为最优目标值。