Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 具有依赖和工作者约束的任务调度优化_Algorithm_Optimization_Scheduling - Fatal编程技术网

Algorithm 具有依赖和工作者约束的任务调度优化

Algorithm 具有依赖和工作者约束的任务调度优化,algorithm,optimization,scheduling,Algorithm,Optimization,Scheduling,我们面临一个任务调度问题 规格 我们有N个可用的工作人员,以及一个任务列表 每个任务-->Ti需要Di(即工人*天)才能完成(需求),并且只能容纳不超过Ci工人同时完成(容量) 并且某些任务只能在其他任务完成后启动(依赖关系) 目标是通过将工人分配到这些序列,实现总最小持续时间 例子 工人人数s:10 TAK列表:[A、B、C] 需求:[100 50 10]-单位:工作日(任务A需要100个工作日才能完成,B需要50个工作日,C需要10个工作日) 容量:[10 10 2]-单位:工人(任务

我们面临一个任务调度问题

规格
  • 我们有N个可用的工作人员,以及一个任务列表
  • 每个任务-->
    Ti
    需要
    Di
    (即工人*天)才能完成(需求),并且只能容纳不超过Ci工人同时完成(容量
  • 并且某些任务只能在其他任务完成后启动(依赖关系
  • 目标是通过将工人分配到这些序列,实现总最小持续时间
例子
  • 工人人数s:10
  • TAK列表
    [A、B、C]
  • 需求
    [100 50 10]
    -单位:工作日(任务A需要100个工作日才能完成,B需要50个工作日,C需要10个工作日)
  • 容量
    [10 10 2]
    -单位:工人(任务A只能有10名工人同时处理,B只能容纳10名,C只能容纳2名)
  • 依赖关系
    {A:null,B:null,C:B}
    -A和B可以随时启动,C只能在B完成后启动
解决示例问题的可能方法:

  • 首先分配B 10名工人,需要50/10=5天才能完成。然后在第5天,我们将2名工人分配给C,将8名工人分配给A,这将需要最多(10/2=5100/8=12.5)=12.5天才能完成。然后,总持续时间为5+12.5=17.5

  • 首先分配10名工人,需要100/10=10天才能完成。然后在第10天,我们将10名工人分配给B,这需要50/10=5天才能完成。然后在第15天,我们分配2名工人到C,这需要10/2=5天才能完成。总持续时间为10+5+5=20

因此第一次练习更好,因为17.5<20。 但是,对于这个示例问题,还有更多可能的分配实践,我们甚至不确定获得最小总持续时间的最佳实践是什么

我们想要的是一种算法:

  • 输入: Nworker、需求、容量、依赖性

  • 产出:总工期最短的工人分配实践

在分配无依赖性的任务时,我们考虑了可能的分配策略:
  • 首先尽快完成其他人依赖的任务(例如,在示例中尽快完成
    B
  • 将工人分配到需求最大的任务(例如,首先将所有工人分配到示例中的
    A
但这两种策略都不是最佳策略


如有任何意见或建议,将不胜感激。谢谢

这听起来像是带有依赖项的作业车间调度,它是NP完全(或NP难)。因此,在合理的时间内向外扩展并提供最佳解决方案可能是不可能的


在类似的情况下,我得到了很好的结果(并且)首先进行构造启发式(几乎是您在那里得到的两种分配策略之一),然后进行局部搜索(通常是延迟接受或禁忌搜索)以获得接近最优的结果。

寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整且可验证的示例。感谢您的关注。您认为问题陈述的哪一部分不清楚?向我们展示您迄今为止所做的尝试,并提供预期输出和实际输出。谢谢。刚刚添加了两个可能的日程安排实践,以使其更加清晰。谢谢!这很有帮助。