问题标签 [cp-sat-solver]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
361 浏览

c# - 员工轮班问题 - 将任务联系在一起

我有一个列表Employee和一个列表Mission。每个任务都有开始时间和持续时间。

在 cp 模型(Google CpSat,来自 or-tools 包)中,我定义shifts = Dictionary<(int,int),IntVar>了,shifts[(missionId, employeeId)] == 1当且仅当该任务由该员工实现时。

我需要将每个任务分配给一个员工,显然一个员工不能同时实现两个任务。我已经写了这两个硬约束并且它们工作正常。


问题:

现在,一些任务被“联系”在一起,应该由同一名员工来实现。它们存储如下:

linkedMissions = {{1,2}, {3,4,5}}

在这里,任务一和任务二必须由同一个员工共同完成,任务三、四、五也一样。


为了编写最后一个约束,我为每个员工收集了应该链接在一起的所有班次的列表,然后我让它们都相等。

然而,求解器告诉我该模型是不可行的,但是用纸和笔我可以很容易地找到一个工作计划。我有 35 名员工和 25 个任务,连接在一起的任务不重叠,所以应该没有问题。


编辑:

作为一种替代方法,正如@Laurent Perron 所建议的那样,我尝试对必须在一起的所有班次使用相同的布尔变量:

但是现在,约束根本不起作用:关联的班次不是由同一名员工实现的。


我的推理有什么问题?为什么我的模型不可行?

0 投票
0 回答
766 浏览

c# - OR-Tools、CP-SAT 求解器 - 最大化然后最大化

我使用https://developers.google.com/optimization/cp/cp_solver尝试解决约束规划问题,我想最大化一个函数,然后最大化另一个。

我尝试调用 Maximize 两次,但它似乎不起作用。

这是一个最小的示例代码:

我希望我的求解器将最大值设置为 var2 (500),因为它具有最高的 prio#,然后将最大值设置为 var3 (400),因为它具有最高的 secondPrio#。然后,剩余的 (100) 将分配给 var1。

提前致谢。

0 投票
1 回答
760 浏览

python - 播种 CP-SAT 求解器

在 google 的 OR-tools 库中,可以使用.ReSeed(). 但是,较新的版本 CP-SAT 不能。

我的假设是 CP-SAT 将详尽地尝试您问题中的每个选项,从可行的选项中获取最大值或最小值(取决于您的优化目标)。因为它会尝试所有这些,所以不需要播种,因此您无法使用该选项。

这种理解正确吗?如果我是,为什么原始求解器有种子?如果我不正确,.ReSeed()那么新 CpSolver 中的缺失是否是疏忽?

0 投票
1 回答
4767 浏览

or-tools - Googles OR-Tools Modules for CSP 和 VRP 使用哪个求解器?

我目前正在评估谷歌或工具,只是注意到它本身并不是真正的求解器,而主要是与其他求解器的接口。我想知道的是这个框架使用哪些求解器来解决约束和路由问题。

我已经彻底浏览了https://developers.google.com/optimization/,但只发现

  • 对于线性优化,使用 Google 的“内部开源 GLOP”
  • 对于网络流优化,似乎使用了自己的求解器(“OR-Tools 在其图形库中为网络流问题提供了几个求解器。”)
  • 对于混合整数编程,默认使用开源程序“COIN OR branch&cut”(但可以集成 SCIP、GLPK 和 Gurobi)

但在 CP 和 VRP 信息/指南网站上,并没有说明使用什么求解器来解决这些问题......

有没有人碰巧知道 CSP / VRP 使用了哪个求解器,或者你有没有发现我过度阅读的东西?

0 投票
1 回答
872 浏览

python - CP求解器可以在特定点初始化吗?

我正在使用 CP-Sat 求解器来优化我正在制定的时间表。然而,这现在需要很长时间才能解决。是否可以使用旧结果作为求解器的种子,作为起点,以减少找到最佳结果所需的时间?

0 投票
1 回答
578 浏览

python - 将 CP-SAT Solver 用于非线性目标函数

我正在尝试使用带有一些变量的 CP-SAT 求解器:x, y. 我想在x**2-y*x一些约束条件下最大化表单的目标函数。我越来越

类型错误:** 或 pow() 不支持的操作数类型:'IntVar' 和 'int'

错误信息。我是否正确假设我不能对 CP-SAT 使用非线性目标函数,因为我找不到任何使用非线性目标的文档或示例?或者有什么方法可以做到这一点?

0 投票
1 回答
272 浏览

python - CP-SAT 的天花板

在调度问题中。我想根据工作天数按比例分配假期。现在我有一个使用多个布尔标志的工作解决方案,但它不能很好地扩展。

有什么建议么?

编辑:一个更普遍的问题是,是否有更好的方法来实现一个变量到另一个变量的预先计算的任意映射。

0 投票
2 回答
498 浏览

python - CP-SAT 中的性能问题

亲爱的,我在下面的代码中遇到了性能问题。我知道预测 435 个变量是具有挑战性的,但是如果我找到运行下面大量变量的模型的方法,那对我来说会很棒,否则如果你能提出替代方法,我将不胜感激。这里的代码:

如果下面该约束的限制值是 330000,那么如果限制是 250000,它会非常快,一小时后它永远不会响应:

0 投票
1 回答
135 浏览

optimization - addDivisionEquality with Java google or-tools CP-SAT

我需要使用谷歌 CP-SAT 求解器添加以下约束:

(x+y+z)/(x+y+z+k) < 10

addDivisionEquality方法签名是:

在哪里

但是现在我需要将分子和分母定义为IntVar类型,而它们是多个 intVar 的总和。

Java 包提供了一个名为SumOfVariables的类来对 intVars 求和,但该addDivisionEquality方法需要IntVar. 我希望它会得到LinearExpr

如何将分子和分母定义为IntVar类型?

0 投票
1 回答
446 浏览

python - Or-Tools CP-SAT 求解器导出/导入:加载模型后如何访问变量?

使用 OR-Tools CP-CAT 求解器的 Python 接口(参考),我希望能够保存 cp_model,稍后或从不同的进程加载它,并继续与之交互。

我能够将模型序列化为 Protubuf,然后加载并解决它:

(资源)

但是,我想在加载模型后继续与模型交互。例如,我希望能够执行以下操作:

问题是最后一行不起作用,因为a没有定义;而且我找不到任何方法来访问现有模型的变量。

我正在寻找类似的东西:a = new_model.getExistingVariable("var_a")这将允许我在加载模型后继续与模型中预先存在的变量进行交互。