问题标签 [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 回答
92 浏览

or-tools - 如何在创建变量期间加速 Ortools

我有一个非常大的问题,即使在 OrTools(>10 分钟)中声明变量时,我也面临计算时间问题。

这是我的代码的和平

如果使用 Pyomo 创建相同的变量,我不会遇到这个问题,我相信我做错了什么。

有人可以帮我提高算法的性能吗?

谢谢

0 投票
1 回答
165 浏览

or-tools - ORTOOLS - CPSAT - 按间隔最小化值的目标

我在 ORTools CPSAT 中的模型,我正在计算一个名为salary_var 的变量(等等)。我需要最小化一个目标。我们称之为“税收”。

为了计算税收,公式不是线性的,而是这样组织的:

如果salary_var 低于10084,则税款对应于10085 和25710 之间的0% ,税款对应于 25711 和73516 之间
的11% ,税款对应于 以上的30% 和41%


例如,如果salary_var 为30000,则税为:

(25710-10085) * 0.11 + (30000-25711) * 0.3 = 1718 + 1286 = 3005

我的问题:如何有效地编码我的“税收”目标?

感谢您的帮助

0 投票
1 回答
88 浏览

python - 使用 OR 工具在 python 中进行约束优化:如何强制执行多级约束?

我有一个优化问题,我有一个“BoolVar”对象列表的列表。所以是这样的:

我需要评估以下内容:

我是否必须这样做:

我已经尝试过这段代码,它似乎可以工作,但由于“OnlyEnforceIf”功能,我对此表示怀疑。如果不执行会怎样?然后 and12 是否设置为 False,或者它可以是 False 还是 True,因为那时这个等式没有被强制执行?我根据这篇文章来到了这段代码。

0 投票
1 回答
39 浏览

or-tools - Google OR 工具:如何评估复杂或多级布尔约束

设置

我正在使用 google OR 工具作为约束编程求解器:

我已经定义了以下 BoolVars

问题

我需要为模型添加一个复杂的布尔约束。就像是

如何将这样的复杂布尔约束添加到模型中?

PS:我无法立即在网上找到此信息,但根据我在这里的一个相关问题和另一个人的另一个相关问题答案找到了解决方案。我在这里以问答方式总结了我的发现,希望它们对某人有用。

0 投票
0 回答
60 浏览

python - 将 OR 工具 IntervalVars 转换为二进制列表

早上好,

我正在尝试找到一种方法来使用或工具将 IntervalVars 转换为 BooleanVars 列表,以便将二进制列表用作一种字段,其中布尔值指示时间间隔在时间 0 和地平线之间的窗口中的位置。我只使用一个间隔,即当我打印所有解决方案时,它会显示所有可能位置的间隔:

所有组合/解决方案:

工作模式:

现在,如果我尝试将此方法扩展到两个间隔,它将不起作用。

我怀疑它的线条

我知道我缺少一些基本的东西,但目前我想不出另一种解决方案

任何意见和批评表示赞赏!<3

我在当前步骤中试图解决的具体问题是:

修改当前方法(使用 Google OR 工具),以便:给定持续时间列表和范围,找到所有可能的组合。具有序列由间隙/暂停与 . 分隔的约束duration_of_gap >= 1

示例 1:

示例 2:

0 投票
1 回答
57 浏览

c++ - 找到合适的 Google OR-Tools 算法

我必须找到integers最小化这个目标函数的集合:

在此处输入图像描述

成本约束是:

  • eachx必须是非负数integer
  • 在此处输入图像描述

TA并且Bdouble已知数。

为了解决这个问题,我一直在查看 OR-Tools C++ 库,特别是在 CP-SAT 求解器中。

  • 它是解决此类问题的正确工具吗?
  • 如果是,将所有的转换doubleint目标函数是否可行?
  • 如果没有,你还有什么建议?(我也对其他开源 C++ 库开放)
0 投票
1 回答
79 浏览

optimization - 在 Google OR-Tools 中使用 NewBool​​Var

我想知道 Google OR-Tools 中逻辑约束的语法。我有一个在 CPLEX 中完成的护士调度项目,我正在将其翻译到 Google OR-Tools。我在 Google OR-Tools 中遇到了有关通道约束的文档,但我很困惑。您能帮我理解如何在 Google OR-Tools 中实现这个 CPLEX 逻辑约束吗?我有一个尝试,但它没有按预期工作:(

语境:

working_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否在 15 分钟间隔 h(即下午 1:15)工作。

lunch_break_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否在 15 分钟间隔 h(即下午 1:15)休息。

simple_break_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否以 15 分钟间隔 h 休息。

因此,CPLEX 中的这个约束是说,如果给定护士的工作间隔为 31 次或更少,间隔 15 分钟,那么他们应该有 0 次午休和 1 次简单休息。

CPLEX 逻辑约束:

我在 OR-Tools 中尝试了以下代码:

虽然这并没有按预期工作:(因为我看到护士的工作间隔少于 32 15 分钟,既没有午休也没有简单的休息。非常感谢任何见解/帮助。我已经被这个问题困扰了很长时间了:(

0 投票
2 回答
78 浏览

python - 关于 or-tools 班次调度示例的概念问题

我对这个调度示例有一个概念性的问题:

https://github.com/google/or-tools/blob/master/examples/python/shift_scheduling_sat.py

它将域问题建模为布尔标志的 3 维张量 [employee, shift, day],表示特定员工在特定日期分配到特定班次。

几乎没有传达关于轮班本身的信息(除了是休息日、上午、下午还是夜班)。

然后,它add_soft_sequence_constraint与 一起使用negated_bounded_span,例如,将连续休假的天数限制为最多 1 或 2 天。

对于我的问题,我有未预定义的可变班次长度——解决方案的关键部分是每次班次的长度。总体思路是,全天都有不同的覆盖要求,例如从上午 8 点到上午 10 点只需要 1 名员工,从上午 10 点到下午 4 点需要 2 名员工,从下午 4 点到晚上 8 点需要 1 名员工。还有一份员工名单及其要求:他们每天的最小和最大工作时间是多少,他们可以分配到的最小和最大轮班时间,每天可以分配的最大轮班数,最短时间间隔班次等。不同员工的班次可以完全或部分重叠。

我可以用与上面示例类似的方式对此进行建模,在该示例中,我通过将每天分成 24 个时间窗口,每 1 小时长来增加班次维度的大小。员工被分配到这些固定的时间窗口。移位是分配给 True 的连续变量序列。为了使轮班符合一些常识(例如,早上 1 小时没有人进来,然后在午夜前又 1 小时),我可以使用与上述示例类似的方法,其中我需要特定的最小和最大轮班持续时间(分配给员工的连续时间窗口数)。

这可行,但感觉力适合这个 is-this-employee-assigned-to-this-shift 布尔张量模型。

我的问题是 - 是否有更自然的方法来使用整数、间隔或其他东西对约束进行建模,例如建模为每天的班次列表,其中“班次”是开始和结束时间以及分配的员工?

0 投票
1 回答
100 浏览

python - 使用 Google OR Tools CP-SAT Solver Log 来改进优化运行时 (Python)

我在理解如何使用我的 CP-SAT 求解器中的搜索日志通过设置子求解器、初始求解策略等来改善运行时有点挣扎。我不确定如何指定这些东西。我将搜索工作人员的数量设置为 16,但我在本地计算机上运行以获取此日志(云笔记本不会生成日志),所以我不确定这是否真的按预期工作......

这是日志:

有什么建议么?非常感谢任何见解!

0 投票
1 回答
12 浏览

or-tools - Google OR-Tools 库:类型错误 GetOrMakeIndex

我正在研究 google OR-Tools 库,我遇到了这个我无法理解的问题。首先,如果我从 官方指南中的 nqueens 示例中复制并粘贴代码,我会得到同样的错误。

我以经典的 n-queens 问题为例:

控制台给了我这个错误:

因此,查看 GetOrMakeIndex 方法的定义:

我想到该变量无法识别它作为参数接收的变量类型。知道如何解决问题吗?