1

我正在使用来自 ortools https://developers.google.com/optimization/cp/cp_solver的 CP-SAT 求解器

我正在使用回调对象执行求解器

solver = cp_model.CpSolver()
solution_agg = SolutionCollector(data, self.variables, self.products, self.vehicles)
status = solver.SearchForAllSolutions(self.model, callback=solution_agg)

解决方案 agg 应该过滤掉所有分配错误的解决方案,我无法将它们建模为线性不等式。

我所知道的是,生成的解决方案可以更快地收敛,并且可以减少验证者的“命中”。如果我可以在回调中随时添加约束。

我尝试在回调中执行此操作,添加一个约束以寻找比最小体积更小的解决方案。

self.__model.Add(volume_expression <= min_found_yet)

这不会给出错误,但验证者拒绝解决方案的次数仍然相同。

求解时是否可以形成约束?如果不在 Ortools 中,那么还有其他提供的求解器吗?

4

1 回答 1

2

不是直接的。求解器是无状态的,并在求解开始时读取 cp_model 一次。

您所描述的似乎只是一个最小化属性。你为什么不把volume_expression 最小化呢?

于 2019-03-12T12:59:37.163 回答