Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 具有持续时间的ORTools任务分配优化_Optimization_Or Tools_Cp Sat Solver - Fatal编程技术网

Optimization 具有持续时间的ORTools任务分配优化

Optimization 具有持续时间的ORTools任务分配优化,optimization,or-tools,cp-sat-solver,Optimization,Or Tools,Cp Sat Solver,我使用的工具或解决方案喜欢将任务分配到每个任务具有周期性且每个时间段具有容量的时间段(在时间段内最多可以放置多少任务)。现在我想用基于任务持续时间的约束替换容量约束,其中每个任务都有持续时间,每个时隙都有最大持续时间,因此每个时隙只能有其在最大持续时间限制下的任务数。但我不明白如何构建约束,即“检查一个插槽中任务的持续时间之和,它应该小于最大插槽持续时间” def main(): 可用=[ [1, 0, 0, 0, 0, 1, 0], [1, 1, 1, 1, 1, 0, 0], [0, 1,

我使用的工具或解决方案喜欢将任务分配到每个任务具有周期性且每个时间段具有容量的时间段(在时间段内最多可以放置多少任务)。现在我想用基于任务持续时间的约束替换容量约束,其中每个任务都有持续时间,每个时隙都有最大持续时间,因此每个时隙只能有其在最大持续时间限制下的任务数。但我不明白如何构建约束,即“检查一个插槽中任务的持续时间之和,它应该小于最大插槽持续时间”

def main():
可用=[
[1, 0, 0, 0, 0, 1, 0],
[1, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 0, 0],
]
周期性=[
2, 2, 1, 1, 3
]
容量=3
最大时隙持续时间=124
任务持续时间=[
15, 20, 30, 50, 10
]
ntasks=len(可用)
nslots=len(可用[0])
所有任务=范围(ntasks)
所有插槽=范围(nslots)
model=cp_model.CpModel()
赋值={}
对于所有_任务中的任务:
对于所有_插槽中的插槽:
分配[(任务,插槽)]=model.NewBoolVar('x[%i][%i]''%(任务,插槽))
count=model.NewIntVar(0,nslots,'count')
slot\u used=[model.NewBoolVar('slot\u used[%i]'%s)用于所有\u插槽中的s]
对于所有_任务中的任务:
模型。添加(
总和(为所有_插槽中的插槽分配[(任务,插槽)](如果可用)[task][slot]==1)=周期性[task])
对于所有_插槽中的插槽:
模型。添加(
所有_任务中任务的总和(分配[(任务,插槽)]
如果可用,[task][slot]==1)多亏了工具的Stradivari(Xiang)用户或发现了discord channel解决方案。
这里只需要求和约束

所有_插槽中的插槽的
:
model.Add(sum(assign[(task,slot)]*所有任务中任务的任务持续时间[task],如果
可用[任务][插槽]==1)