Ortools 在求解时设置约束

Posted

技术标签:

【中文标题】Ortools 在求解时设置约束【英文标题】:Ortools setting constraints while solving 【发布时间】:2019-03-12 10:49:54 【问题描述】:

我正在使用 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 应该过滤掉所有分配错误的解决方案,我无法将它们建模为线性不等式。

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

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

self.__model.Add(volume_expression <= min_found_yet)

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我想但是 SearchForAllSolutions 不支持任何最小化。我需要所有可行的解决方案,以便功能最合适。能否通过CP SAT或MIP求解器的Solve方法得到所有使表达式最小化的可行解? 如果您使用目标和解决方案回调解决,您将收集找到的所有解决方案,可能只有一个。现在,如果您最小化目标,存储最优值,然后搜索没有任何目标但对 volume_expression 有约束的模型的所有解,您将找到所有接近最优的解。

以上是关于Ortools 在求解时设置约束的主要内容,如果未能解决你的问题,请参考以下文章

使用ortools时如何获取cpsolver的变量和约束

如何在 ortools 中更改约束参数的类型

在 google ortools 中添加析取约束

如何在ortools python中设置约束

ortools如何添加非线性约束

找到一组布尔约束的所有可行解决方案的有效方法