有没有更聪明的方法来使用 ortools cp-sat 来限制连续任务的最大大小

问题描述 投票:0回答:1

在制药行业,转换/清洁事件通常很长,甚至可能需要不同级别的操作员资源。因此,当我们安排任务和事件时,他们需要仔细建模。这仍然是我们可以使用 CP-SAT 求解器轻松解决的问题。

但是有一个概念叫“Campaigning”。这意味着我们要尽可能连续地生产一种产品的订单。同一产品的连续生产数量有最大数量/限制:

Suppose we have 10 orders for product A and the campaign size is 4. Then we typically do:

[A->A->A->A] -> changeover/cleaning -> [A->A->A->A] -> changeover/cleaning -> [A->A]

Of course, there shall always be changeover/cleaning between different products.
Suppose we have 1 order for product A and B respectively. Then we still have to do:

A -> changeover/cleaning -> B  or B -> changeover/cleaning -> A

我们确实找到了一种通过创建活动来对此建模的方法,并可选择将候选任务分配到活动中,最后安排活动。但是这个解决方案的可扩展性真的很差。在下图中,当我有 5 个产品 A 和 B 的订单并且限制为 2 个订单时,我的笔记本电脑已经接近死机了。

代码在这里:https://github.com/jiayi9/cp/blob/main/study_04_campaigning.py

我们想知道有没有更聪明的方法来告诉模型如何去做。

scheduling or-tools cp-sat
1个回答
0
投票

我以前的做法:

  • 使用电路约束
  • 为每个节点创建一个上限为 4 的整数变量 cumul。
  • 对于每个正常弧 A -> A(任务 i 到任务 j)文字 => cumul[j] = cumul[i] + 1
  • 对于每个清洁弧 A -- 清洁 -> A(任务 i 到任务 j),添加
    • 文字 => 累积[j] = 0
    • literal => start[j] >= end[i] + 清洁时间
  • 对弧 A -> B 和 B -> A 执行相同操作
  • start_literal[i] => 累积[i] = 1

看这个例子.

© www.soinside.com 2019 - 2024. All rights reserved.