在 Google or-tools 中的机器任务之间添加设置时间

Posted

技术标签:

【中文标题】在 Google or-tools 中的机器任务之间添加设置时间【英文标题】:Adding setup time in between tasks of a machine in Google or-tools 【发布时间】:2021-12-16 06:13:01 【问题描述】:

这里是 Google or-tools 的新用户。我浏览了文档中的作业车间调度示例,并想尝试为分配给机器的作业添加设置时间。如何正确地做到这一点?

首先我为机器创建了一个任务列表

for jobId, job in enumerate(jobsdata):
        for taskId, (machine, duration) in enumerate(job):
            machinetasks[machine].append(alltasks[jobId, taskId])

我试过了

m = 0
print(machinelist[0])
for i in range(len(machinetasks[m])-1):
    task = machinetasks[m][i]
    nexttask = machinetasks[m][i+1]
    b = model.NewBoolVar("")
    model.Add(nexttask.start >= task.end + 1000)).OnlyEnforceIf(b)

但它不起作用。如果我这样做了

m = 0
print(machinelist[0])
for i in range(len(machinetasks[m])-1):
    task = machinetasks[m][i]
    nexttask = machinetasks[m][i+1]
    b = model.NewBoolVar("")
    model.Add(nexttask.start >= task.end + 1000)

它会在指定顺序 (i-->j) 的任务之间增加设置时间,但不适用于其他方向 (j-->1)。

感谢您的帮助

【问题讨论】:

【参考方案1】:

由于您没有在代码中显示它,我猜machinetasks[m][i] 是机器 m 上第 i 个任务的 IntervalVar。您似乎假设工作i+1 将是机器上i 之后的工作——这总是真的吗?我认为当工作 i+1 跟随工作 i 时,您必须限制 b 为真,否则为假。

我建议试试这个:

m = 0
print(machinelist[0])
for i in range(len(machinetasks[m])-1):
    task1 = machinetasks[m][i]
    task2 = machinetasks[m][i+1]
    b = model.NewBoolVar("")
    # b will be true when task2 follows task1, false otherwise
    # Now we constrain the relevant start and end to be separated by 1000
    model.Add(task2.start >= task1.end + 1000)).OnlyEnforceIf(b)
    model.Add(task1.start >= task2.end + 1000)).OnlyEnforceIf(b.Not())

如果b为真,task2在task1结束后1000开始,否则task1在task2结束后1000开始。由于 b 将始终为真或假,因此将强制执行其中一个约束,并且 b 的值将作为解决方案的一部分出现。

【讨论】:

或者你可以看看这个例子:github.com/google/or-tools/blob/stable/examples/python/… 非常感谢您的帮助!是的,您的建议似乎很有效。欣赏它

以上是关于在 Google or-tools 中的机器任务之间添加设置时间的主要内容,如果未能解决你的问题,请参考以下文章

Google OR-Tools简介

Google OR-Tools简介

google or-tools 无法获得最佳 LP 结果,如 gurobi 示例

如何通过 SCIP 求解器获得 Google OR-Tools 和 Python 中的相对 MIP 差距?

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

在 Eclipse 中使用 google or-tools