Ortools 在求解时设置约束
Ortools setting constraints while solving
我正在使用 ortools 的 CP-SAT 求解器
https://developers.google.com/optimization/cp/cp_solver
我正在使用回调对象执行求解器
solver = cp_model.CpSolver()
solution_agg = SolutionCollector(data, self.variables, self.products, self.vehicles)
status = solver.SearchForAllSolutions(self.model, callback=solution_agg)
Solution agg 应该过滤掉所有分配错误的解决方案,我无法将它们建模为线性不等式。
我所知道的是,生成的解可以收敛得更快,验证器上的 "hits" 可以做得更少。如果我可以在回调中随时添加约束。
我尝试在回调中执行此操作,添加一个约束以寻找比最小体积更小的解决方案。
self.__model.Add(volume_expression <= min_found_yet)
这不会给出错误,但验证者拒绝解决方案的次数仍然相同。
求解的时候可以形成约束吗?如果不在 Ortools 中,那么是否提供任何其他求解器?
不直接。求解器是无状态的,在求解开始时读取 cp_model 一次。
你所描述的似乎只是一个最小化 属性。为什么不直接最小化 volume_expression?
我正在使用 ortools 的 CP-SAT 求解器 https://developers.google.com/optimization/cp/cp_solver
我正在使用回调对象执行求解器
solver = cp_model.CpSolver()
solution_agg = SolutionCollector(data, self.variables, self.products, self.vehicles)
status = solver.SearchForAllSolutions(self.model, callback=solution_agg)
Solution agg 应该过滤掉所有分配错误的解决方案,我无法将它们建模为线性不等式。
我所知道的是,生成的解可以收敛得更快,验证器上的 "hits" 可以做得更少。如果我可以在回调中随时添加约束。
我尝试在回调中执行此操作,添加一个约束以寻找比最小体积更小的解决方案。
self.__model.Add(volume_expression <= min_found_yet)
这不会给出错误,但验证者拒绝解决方案的次数仍然相同。
求解的时候可以形成约束吗?如果不在 Ortools 中,那么是否提供任何其他求解器?
不直接。求解器是无状态的,在求解开始时读取 cp_model 一次。
你所描述的似乎只是一个最小化 属性。为什么不直接最小化 volume_expression?