python - OR-TOOLS google 如何告诉求解器在达到某个结果时停止
问题描述
我有一个简单的 3d 分配问题。我为成本矩阵随机生成 0 到 100 之间的整数。
我注意到,当问题的大小足够大时,比如 40 个分配。(40X40X40 成本矩阵)。总成本达到 0。这是有道理的。
随着矩阵变大,我认为有更多方法可以达到预期的结果,并且我不希望求解时间成倍增加。但是id可以。
我认为这是因为算法不满足于零结果,直到它绝对确定它是最优的。
我的问题是有没有办法告诉求解器在达到一定的总成本时停止?我在文档中没有找到该选项
当我试图限制时间
solver.SetTimeLimit(TIME)
求解器根本找不到解决方案。
我尝试添加答案之一中建议的约束(总成本> = 0),但没有效果。
为 20X20X20 问题添加以下行时
solver.Add(solver.Objective().Value() >= 1)
求解器找不到解决方案,但添加时
solver.Add(solver.Objective().Value() >= 0)
它找到了一个总成本为 4 的解决方案,为什么它不能找到具有第一个约束的相同解决方案?
以及如何告诉它在达到 0 时停止?
解决方案
solver.Add(solver.Objective().Value() >= 0)
不符合您的预期。solver.Objective() 是 MPObjective 类型的一个类。调用 Value() 检查是否找到了解决方案,如果不是,则返回 0。
所以在实践中,你正在执行:
solver.Add(0 >= 0)
这是一个禁止操作。
为了限制目标,您应该创建一个new_var
从 0 到 的整数变量sum(cost_coefficients)
,然后添加new_var = sum(cost_coefficients * bool_vars)
,最后最小化new_var
。
推荐阅读
- rust - 返回对 Box 的引用
- c - C程序计算FILE中的特定单词
- javascript - 在没有浏览器工具栏的情况下获取最大可用浏览器高度 - javascript
- .net-core - 在 F# 中实现具有可为空引用类型的 C# 接口
- python - 查找不同符号/字母的边界框
- azure-devops - AzureDevops 中的任务之间访问变量失败
- ajax - 控制器 / ajax resquest 上的 HttpPostedFileBase null
- ios - 使用 Firebase 观察数据更新 UI (Swift)
- php - PHP 无限重定向
- azure - 用于在 Azure 门户上使用的配置 NLog.config 文件