小编Lau*_*ron的帖子

调度优化以最小化时隙数量(有约束)

我正在研究调度优化问题,其中我们有一组需要在特定时间范围内完成的任务。

每个任务都有一个时间表,指定可以执行该任务的时间段列表。每个任务的时间表可能因工作日而异。

这是小样本(减少了任务和时间段的数量):

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)

python algorithm linear-programming job-scheduling or-tools

5
推荐指数
1
解决办法
2712
查看次数

pip install ortools:没有匹配的发行版 - Alpine

在 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

关注此问题的进展:https://github.com/google/or-tools/issues/756

python pip or-tools alpine-linux

5
推荐指数
1
解决办法
7394
查看次数

从ortools获取SAT解决方案列表

我正在尝试找出如何从 中获取可能解决方案的完整列表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)

python integer-programming or-tools cp-sat

5
推荐指数
1
解决办法
3194
查看次数

为什么 or-tools 中的布尔变量不起作用?

我正在重新使用 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 工具的文档,而且我似乎忘记的东西比我想象的要多得多。

python constraint-programming or-tools cp-sat

5
推荐指数
1
解决办法
2375
查看次数

Mkdocs 无法找到模块

我正在尝试使用以下方法生成自动化文档:
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)

module mkdocs cp-sat

5
推荐指数
1
解决办法
1269
查看次数

CMake - 当源文件已存在于本地时 FetchContent 的替代选项

我尝试使用 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 可用于指向已包含源文件的目录吗?还有什么选择呢?

git dependencies build cmake or-tools

4
推荐指数
1
解决办法
2258
查看次数

具有二元变量的多个目标函数 Google OR-tools

我有一组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]

限制如下:

  • 容量约束:由于每台服务器i都有一定的容量,因此分配的j个用户不得超过该容量
  • 邻近约束:只有位于服务器范围内的用户才能分配给它。一个用户可以位于多个服务器的重叠范围内
  • 约束系列:确保每个用户最多分配到一台服务器。

使用这个库

from ortools.sat.python import cp_model
Run Code Online (Sandbox Code Playgroud)

到目前为止我已经做了:

  • 创建求解器变量(它们是布尔值)
  • 创建约束
  • 最大化 x[i,j] 变量
  • 获取目标函数

例如,如果我有 10 个用户和 4 台服务器,则所有 10 个用户都分配到 4 台服务器中

我需要但未能完成的事情:

  • 最大化x[i,j] …

python optimization constraint-programming or-tools cp-sat

3
推荐指数
1
解决办法
621
查看次数

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

设置

我使用 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:我无法立即在网上找到此信息,但根据我在此处的相关问题和此处另一个人的另一个相关问题上得到的答案找到了解决方案。我以问答的形式总结了我的发现,希望它们对某人有用。

constraint-programming or-tools cp-sat

2
推荐指数
1
解决办法
1115
查看次数

为什么 AddMultiplicationEquality 仅限于 2 个变量?

我正在构建一个具有一组复杂约束的轮班调度程序,并且为此使用 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)

python or-tools cp-sat

1
推荐指数
1
解决办法
2358
查看次数

如何修改现有 Google OR-Tools 约束编程模型的变量和约束?

我使用 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)

现在,在问题的第二次运行中,我想做以下更改。

  1. 将变量 c 的上限更改为5
  2. 删除约束a==b
  3. 创建新约束a==c

在不从头开始构建模型的情况下如何实现这一目标?

python mathematical-optimization constraint-programming or-tools cp-sat

1
推荐指数
1
解决办法
2187
查看次数

python 创建自定义语法

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)

python syntax or-tools cp-sat

1
推荐指数
1
解决办法
480
查看次数

这个 CP-SAT 模型会更快吗?

我的团队正在构建一个 CP-SAT 求解器,该求解器可以在一段时间内安排作业(例如家庭作业),并且可用性可变(可用于完成作业的时间)。我们正在努力加速我们的模型。

我们尝试了 num_search_workers 和其他参数调整,但想检查其他速度的提高。目标是在 5-10 秒内解决约 100 天的问题和最多 2000 个作业(以 M1 mac 为基准)。有任何想法吗?

问题描述:按照这些要求在 d 天内布置作业

  • 一天的分配时间不得超过当天的可用时间
  • 应尊重赋值依赖性(如果 A 需要 B,则 B 不应出现在 A 之后)
  • 作业可以分开(以便更好地适应时间很少的日子)
  • 针对一天中任务类型的多样性进行优化

# 天和 # 个作业后,解决问题的速度显着减慢。这是预料之中的,但我们想知道您是否可以提出可能的加速建议

这是一个单元测试示例。希望能够展示拆分、排序和时间限制。

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)

python operations-research or-tools cp-sat

1
推荐指数
1
解决办法
1721
查看次数