在 Google 或工具中的机器任务之间添加设置时间
Adding setup time in between tasks of a machine in Google or-tools
这里是 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)。
感谢您的帮助
由于您没有在代码中显示它,我猜测 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 将始终为 true 或 false,因此将强制执行其中一个约束,并且 b 的值将作为解决方案的一部分出现。
这里是 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)。
感谢您的帮助
由于您没有在代码中显示它,我猜测 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 将始终为 true 或 false,因此将强制执行其中一个约束,并且 b 的值将作为解决方案的一部分出现。