我正在研究调度优化问题,其中我们有一组需要在特定时间范围内完成的任务。
每个任务都有一个时间表,指定可以执行该任务的时间段列表。每个任务的时间表可能因工作日而异。
这是小样本(减少了任务和时间段的数量):
task_availability_map = {
"T1" : [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"T2" : [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"T3" : [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"T4" : [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, …Run Code Online (Sandbox Code Playgroud) 在 Docker 中,我尝试运行 pip install ortools 但找不到。其他 pip 安装包可以完美运行。我在 Dockerfile 中使用“FROM python:3.6.8-alpine”
bash-4.4# pip install ortools
Collecting ortools
ERROR: Could not find a version that satisfies the requirement ortools (from versions: none)
ERROR: No matching distribution found for ortools
bash-4.4# pip install --upgrade pip
Requirement already up-to-date: pip in /usr/local/lib/python3.6/site-packages (19.1.1)
Run Code Online (Sandbox Code Playgroud)
根本原因: Gooogle OR 工具不支持 alpine,因为 alpine 不支持 pypi
我正在尝试找出如何从 中获取可能解决方案的完整列表ortools.sat.python.cp_model。我知道我可以打印它们,如下例所示,但我不清楚如何获取这些值,例如作为嵌套列表或字典列表。我尝试通过修改 并将解决方案附加到列表属性来编写自己的回调类VarArraySolutionPrinter,但由于某种原因,这始终导致 python 内核崩溃。无论如何,必须有更直接的方法。我不认为解析打印输出是一个选项。
from ortools.sat.python import cp_model
model = cp_model.CpModel()
x00 = model.NewBoolVar('x00')
x01 = model.NewBoolVar('x01')
x02 = model.NewBoolVar('x02')
model.AddBoolOr([x00, x01, x02.Not()])
model.AddBoolOr([x00.Not(), x02.Not()])
# Create a solver and solve.
solver = cp_model.CpSolver()
solution_printer = cp_model.VarArraySolutionPrinter([x00, x01, x02])
solver.SearchForAllSolutions(model, solution_printer)
## Prints:
Solution 0, time = 0.00 s
x00 = 0 x01 = 1 x02 = 0
Solution 1, time = 0.01 s
x00 = 0 x01 = 0 x02 = 0
Solution 2, …Run Code Online (Sandbox Code Playgroud) 我正在重新使用 Google 的 OR 工具并尝试(相对)简单的优化。我正在使用 CP SAT 求解器,但我可能在这里遗漏了一些基本内容。我有一些变量 x、y 和一些常量 c。如果 y 小于 c,我希望 x 等于 1,否则等于 0。
from ortools.sat.python import cp_model
solver = cp_model.CpSolver()
model = cp_model.CpModel()
c = 50
x = model.NewBoolVar(name='x')
y = model.NewIntVar(name='y', lb=0, ub=2**10)
model.Add(x == (y < c))
model.Maximize(x+y)
status = solver.Solve(model)
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息
TypeError: bad operand type for unary -: 'BoundedLinearExpression'
Run Code Online (Sandbox Code Playgroud)
看来我在这里滥用 OR 工具语法来限制我的约束。我很难理解在线 OR 工具的文档,而且我似乎忘记的东西比我想象的要多得多。
我正在尝试使用以下方法生成自动化文档:
mkdocs = "^1.4.2"
mkdocstrings = "0.19.0"
mkdocs-material = "8.5.8"
mkdocstrings-python = "0.7.1"
我的 mkdocs.yml 看起来像这样:
site_name: Optimization Services Documentation
site_url: "https://example.com"
theme:
name: "material"
nav:
- 'index.md'
- 'reference.md'
plugins:
- search
- mkdocstrings:
handlers:
python:
setup_commands:
- import sys
- sys.path.append('../')
selection:
new_path_syntax: true
Run Code Online (Sandbox Code Playgroud)
index.md 仍然是 mkdocs new 生成的默认文件。
Reference.md 看起来像这样:
# Reference
::: modelling.constraints
Run Code Online (Sandbox Code Playgroud)
和 modelling.constraints.py:
def init_constraints(groupes_chantiers: list[GroupeChantiers],
digraph_precedence: nx.DiGraph,
graph_coactivite: nx.Graph,
model: cp_model.CpModel,
**kwargs) -> None:
"""
Adds constraints to cp_model
Args:
groupes_chantiers:
digraph_precedence:
graph_coactivite: …Run Code Online (Sandbox Code Playgroud) 我尝试使用 cmake 在本地构建 ORTools github 包,并且构建没有任何错误。然而,我们计划最终使用的环境没有出站网络连接。我看到的问题是https://github.com/google/or-tools/blob/v9.4/cmake/dependency/CMakeLists.txt执行 Git 克隆来下载依赖项并添加它们。由于没有出站网络访问,此步骤失败,我无法构建依赖关系。为了避免这种情况,我们计划手动下载依赖项并将其添加到https://github.com/google/or-tools/blob/v9.4/cmake/dependency/文件夹中。我对 CMake 还很陌生,我不确定需要进行哪些更改才能适应这一点。
例如,如果我克隆 Zlib v1.2.11 存储库并将其添加到https://github.com/google/or-tools/blob/v9.4/cmake/dependency/,则以下代码片段需要更改为什么?
# ##############################################################################
# ZLIB
# ##############################################################################
if(BUILD_ZLIB)
message(CHECK_START "Fetching ZLIB")
list(APPEND CMAKE_MESSAGE_INDENT " ")
FetchContent_Declare(
zlib
GIT_REPOSITORY "https://github.com/madler/ZLIB.git"
GIT_TAG "v1.2.11"
PATCH_COMMAND git apply --ignore-whitespace "${CMAKE_CURRENT_LIST_DIR}/../../patches/ZLIB.patch")
FetchContent_MakeAvailable(zlib)
list(POP_BACK CMAKE_MESSAGE_INDENT)
message(CHECK_PASS "fetched")
endif()
Run Code Online (Sandbox Code Playgroud)
FetchContent_Declare 可用于指向已包含源文件的目录吗?还有什么选择呢?
我有一组U用户和一组S服务器。我想最大化分配给服务器的用户数量,同时最小化使用的服务器数量(这意味着我有两个目标函数)。
每个用户都有一些需求w ,每个服务器的总容量为C。
求解器变量如下:
# x[i,j] = True if user u[j] is allocated to server s[i]
# x[i,j] = False otherwise
# y[i] = True if server s[i] is used to serve users
# y[i] = False otherwise
Run Code Online (Sandbox Code Playgroud)
如前所述,我想最大化x[i,j],同时最小化y[i]
限制如下:
使用这个库
from ortools.sat.python import cp_model
Run Code Online (Sandbox Code Playgroud)
到目前为止我已经做了:
例如,如果我有 10 个用户和 4 台服务器,则所有 10 个用户都分配到 4 台服务器中
我需要但未能完成的事情:
x[i,j] …设置
我使用 google OR 工具作为约束编程求解器:
from ortools.sat.python import cp_model
Run Code Online (Sandbox Code Playgroud)
我定义了以下 BoolVars
model = cp_model.CpModel()
a = model.NewBoolVar("a")
b = model.NewBoolVar("b")
c = model.NewBoolVar("c")
d = model.NewBoolVar("d")
e = model.NewBoolVar("e")
f = model.NewBoolVar("f")
g = model.NewBoolVar("g")
Run Code Online (Sandbox Code Playgroud)
问题
我需要向模型添加复杂的布尔约束。就像是
(a || b) && (d || e) == g
Run Code Online (Sandbox Code Playgroud)
如何将这样的复杂布尔约束添加到模型中?
PS:我无法立即在网上找到此信息,但根据我在此处的相关问题和此处另一个人的另一个相关问题上得到的答案找到了解决方案。我以问答的形式总结了我的发现,希望它们对某人有用。
我正在构建一个具有一组复杂约束的轮班调度程序,并且为此使用 CP-SAT 求解器。我有一个像这样的数组:
num_vals = 3
for n in all_employees:
for d in all_timeslots:
shifts[(n, d)] = model.NewIntVar(0, num_vals - 1, 'shift_n%id%i' % (n, d))
Run Code Online (Sandbox Code Playgroud)
我试图设置一个约束,其中 5 个 IntVar 值的后续行的乘积始终等于零,所以我使用如下所示的内容:
sq_r = model.NewIntVar(0, 1,'sq_r')
for wind in range(0,11):
model.AddMultiplicationEquality(sq_r, [shifts[(n, wind)], shifts[(n, wind+1)], shifts[(n, wind+2)], shifts[(n, wind+3)], shifts[(n, wind+4)]])
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
Check failed: vars.size() == 2 (5 vs. 2) General int_prod not supported yet.
*** Check failure stack trace: ***
@ 00007FF98D2B8C45 PyInit__pywrapsat
@ 00007FF98D2B6F82 PyInit__pywrapsat
@ 00007FF98D550E50 PyInit__pywrapsat
@ 00007FF98D54D8FF …Run Code Online (Sandbox Code Playgroud) 我使用 Google OR Tools in Python 编写了一个约束编程模型,它使用 CP 求解器。我需要多次运行该模型,并且在每次运行中我都会修改约束。目前,每次我想运行模型时,我都会从头开始创建模型对象。无论如何,我可以修改现有模型的变量/约束,这样我就不需要每次都从头开始构建模型吗?
为了提供更好的上下文,请考虑以下示例模型。
from ortools.sat.python import cp_model
model = cp_model.CpModel()
num_vals = 3
a = model.NewIntVar(0, num_vals -1, 'a')
b = model.NewIntVar(0, num_vals -1, 'b')
c = model.NewIntVar(0, num_vals -1, 'c')
model.Add(a == b)
solver = cp_model.CpSolver()
solver.Solve(model)
Run Code Online (Sandbox Code Playgroud)
现在,在问题的第二次运行中,我想做以下更改。
5a==ba==c在不从头开始构建模型的情况下如何实现这一目标?
python mathematical-optimization constraint-programming or-tools cp-sat
python 中的or-tools模块添加了自定义语法,其中函数可以采用任意表达式作为参数(如下所示),该语法不是立即求值,而是稍后作为约束解决
model.Add(x + 2 * y -1 >= z)
Run Code Online (Sandbox Code Playgroud)
当我从函数中打印参数的类型时,它显示
<class 'ortools.sat.python.cp_model.BoundedLinearExpression'>
Run Code Online (Sandbox Code Playgroud)
一种简单的方法是将表达式作为字符串传递,但感觉更好。我想了解这是如何实现的。这是在 python 中创建自定义语法的方法吗?是否需要更新解析器或类似的东西?
这是简单的程序
from ortools.sat.python import cp_model
def foo(expr):
print(expr, type(expr))
def main():
model = cp_model.CpModel()
var_upper_bound = max(50, 45, 37)
x = model.NewIntVar(0, var_upper_bound, 'x')
y = model.NewIntVar(0, var_upper_bound, 'y')
z = model.NewIntVar(0, var_upper_bound, 'z')
a = 0
b = 0
c = 0
model.Add(2*x + 7*y + 3*z == 50)
solver = cp_model.CpSolver()
status = solver.Solve(model)
if status == cp_model.OPTIMAL:
print('x value: ', …Run Code Online (Sandbox Code Playgroud) 我的团队正在构建一个 CP-SAT 求解器,该求解器可以在一段时间内安排作业(例如家庭作业),并且可用性可变(可用于完成作业的时间)。我们正在努力加速我们的模型。
我们尝试了 num_search_workers 和其他参数调整,但想检查其他速度的提高。目标是在 5-10 秒内解决约 100 天的问题和最多 2000 个作业(以 M1 mac 为基准)。有任何想法吗?
问题描述:按照这些要求在 d 天内布置作业
# 天和 # 个作业后,解决问题的速度显着减慢。这是预料之中的,但我们想知道您是否可以提出可能的加速建议
这是一个单元测试示例。希望能够展示拆分、排序和时间限制。
days = [{"secondsAvailable": 1200}, {"secondsAvailable": 1200}, {"secondsAvailable": 1200}, {"secondsAvailable": 1200}]
assignments = [
{"id": 1, "resourceType": "Type0", "seconds": 2400, "deps": [], "instances": 2},
{"id": 2, "resourceType": "Type0", "seconds": 1200, "deps": [1], "instances": 1},
{"id": 3, "resourceType": "Type0", "seconds": 1200, "deps": [1, 2], "instances": 1},
]
result …Run Code Online (Sandbox Code Playgroud) or-tools ×11
cp-sat ×9
python ×9
algorithm ×1
alpine-linux ×1
build ×1
cmake ×1
dependencies ×1
git ×1
mkdocs ×1
module ×1
optimization ×1
pip ×1
syntax ×1