问题标签 [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 投票
0 回答
141 浏览

or-tools - num_search_workers = 8 时 CP-SAT 求解器的 CPU 使用率

亲爱的,我有一个问题,如果我有一个 32 核 CPU 并使用 num_search_workers = 8 的 CP-SAT,我使用多少 CPU 内核?谢谢

0 投票
1 回答
480 浏览

python - 如何使用 Google 的 CP-SAT 求解器计算“AddAbsEquality”或“AddMultiplicationEqualit”以进行非线性优化?

我的目标是根据预测序列恢复数据序列。假设原始数据序列是x_org = [10, 20, 30, 40, 50]但我收到随机数据为x_ran = [50, 40, 20, 10, 30]。现在,我的目标是通过使它们最接近原始模式来恢复模式(最大限度地减少恢复损失)。

我使用了与 google OR-tool 网站 [https://developers.google.com/optimization/assignment/assignment_teams] 和 [https: //developers.google.com/optimization/cp/integer_opt_cp]。

我可以最小化损失(误差)的总和,但不能计算平方和/绝对和。

那么没有绝对误差和的输出是:

这表明即使损失的总和为零,恢复也不正确。但是,当我尝试添加另一个 int 变量来存储损失的绝对值时[如下所示],编译器会报错。

错误是回溯是:

您能否建议如何最小化恢复损失的绝对总和/平方和?谢谢。

0 投票
1 回答
111 浏览

python - 当 ORTOOLS 提出解决方案时评估自定义函数

我对 Python 中的 OR-TOOLS 很陌生。我已经制作了几个教程示例,但我在尝试为我的问题建模时遇到了问题。

让我们看看我们有一个装箱问题,我需要找到最少的箱子来容纳所有物品的重量。在这个典型问题中,我们希望最小化使用的 bin 数量。但是,假设我们有一个额外的目标:最大化垃圾箱的“质量”。问题来了:要评估那个箱子的质量,我们需要调用一个非线性函数来获取那个箱子里的物品并返回一个质量。我想我不能对 CP/SAT 使用多目标方法,因此我们可以对这两个目标进行加权建模。

因此,我面临的问题如下:

我不能将“质量”设置为变量,因为它取决于当前的解决方案(与垃圾箱关联的项目)

我怎样才能做到这一点?分配回调?可能吗?

0 投票
1 回答
263 浏览

optimization - ORTools CP-Sat Solver Channeling Constraint 依赖于 x

我尝试将以下约束添加到我的模型中。我的问题:函数 g() 期望 x 作为二进制 numpy 数组。所以结果 arr_a 取决于优化的每一步中 x 的当前值!之后,我希望这个数组乘以 x 的最大值小于 50。

如何动态添加此约束,以便在每次迭代时始终使用 x 的值正确计算 arr_a ,同时告诉模型保持约束 arr_a * x <= 50 ?目前我在向模型添加约束时遇到错误,因为 g() 期望 x 作为 numpy 数组来计算 arr_a、arr_b、arr_c ( g 在其计算中使用 np.where(x == 1) )。

之后我添加了自然也依赖于 x 的目标函数。

编辑

我的问题发生了一些变化,我设法让它毫无问题地工作。然而,我体验到约束从未真正得到满足!自定义函数是一个高度非线性函数,它需要 x==1 和 x == 0 的索引,并返回一个 numpy 数组。此外,无法使用 sat.solver 的预定义函数重新构建它。

即使我应用了更简单的功能,它也无法正常工作。

我还尝试了以下方法:

自定义函数的一些最小示例,我只是尝试说 n_closed 应小于 10。即使求解器不满足该条件:

0 投票
1 回答
306 浏览

java - 在 Java 中乘/加 Google OR 工具 IntVar 和常量

我目前开始使用 Java 中的 Google OR Tools CP-Sat Solver 并面临简单的数学方程式问题,包括常量和 OR-Tools 内部“IntVar”。

我的问题的一个小例子:

我习惯了 Python,这些类型的问题并不真正存在,有一个简单model.Add(a == a * c + b) 的工作。

Or-Tools LinearExpr.sum 或 LinearExpr.term 也根本没有帮助我。

有没有人在 Java 中处理过 CP-Sat 优化问题并知道解决方法?

0 投票
0 回答
48 浏览

python - 限制平衡每日覆盖率

这是我的问题表述的简化版本:

此外,我还想添加一个尝试平衡每日覆盖范围的条件:

通过添加此规则,它会导致运行时间增加 +20 倍,这意味着随着添加额外的约束,问题开始需要 10 多分钟才能解决。有没有更有效的方法来实施上述规则?

0 投票
1 回答
85 浏览

optimization - ORTools 任务分配优化与持续时间

我正在使用诸如https://github.com/google/or-tools/blob/master/examples/python/task_allocation_sat.py之类的 or-tools 解决方案将任务分配到每个任务具有周期性且每个时间槽具有容量的时隙(最多可以在时隙内放置多少任务)。现在我想用基于任务持续时间的约束替换容量约束,其中每个任务都有持续时间,每个槽都有最大持续时间,所以每个时间槽只能有与其在最大持续时间限制下一样多的任务。但我不明白如何建立约束,即“检查插槽中任务的持续时间总和,它应该小于 max_slot_duration”。

和解决方案打印机

0 投票
1 回答
58 浏览

java - 如何在 Java 中使用 IntVar 和 LinearExpression 实现 CPSat addDifferent

我回到了使用 Google 或 Tools CP Sat 在 Java 中的线性表达式。Clunky 甚至没有详细描述它,Java 在这里是一团糟。

我的目标是向我的 IntVar 添加一个常量,并为下一个 IntVar 排除该值。

(顺便说一句。我如何向我的 IntVar 添加一个常数已经很尴尬了,还有其他方法吗?)

如何使用 IntVar 和 LinearExpression 实现 addDifferent?

0 投票
1 回答
85 浏览

python - 如何使用 AddMultiplicationEquality 添加约束?

例如,我在下面有一个数字列表。并且约束是两个相邻数字的差距应该是正数或负数,或者两个数之一等于0,也就是说一个正数和一个负数(例如3和-1)是不可接受的。

列表编号:[15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 17, 20, 19, 22, 25, 25, 25, 25, 25, 25、25、25、22、20、23、22、21、18、15、15、15、15、15、15、15、18、21、24、24、24、27、30]

数字的差距: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -1, 3, -1, 3, 3, 0, 0, 0, 0 , 0, 0, 0, -3, -2, 3, -1, -1, -3, -3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 3 , 3]

所以我尝试使用AddMultiplicationEquality添加约束

但我得到了下面的结果。我该如何解决这个问题?提前致谢。

0 投票
1 回答
163 浏览

python - 如何在 Or-tools 中对变量进行排序?

我正在使用 or-tools 来解决 CP 问题。求解器给出了一个可行的解决方案,如下所示。它的意思是:

实际上我想获得如下排序的变量并将约束设置为相邻元素的间隙。例如,间隙应在 10 到 50 之间。那么这样设置约束是否可行?

谢谢你。