具有作业排除和优先级约束的多处理器调度

时间:2019-06-11 14:44:03

标签: algorithm optimization multiprocessing mathematical-optimization greedy

我正在尝试找到/开发一种算法,该算法可以最大程度地减少将作业调度到计算机上的总时间(带有运行时间)。即标准的多处理器调度算法。

但是,我还有两个其他限制:必须先完成某些作业(优先)。 仅某些计算机可以运行某些作业(作业排除)。作业并不是处理器唯一的。

例如,我可能有4个工作,例如-

(cost): j1 (4) , j2 (2) , j3 (10), j4 (12)

3 machines: m1, m2, m3

Such that: 

m1 can run j1, j2, j3

m2 can run j1, j2 and 

m3 can run j3, j4

j1 must be run before j2 and j4

我的目的是为每台机器找到最佳时间表,以最大程度地减少总时间。

我已经研究过对不相关的机器使用多处理器调度算法(将排除的任务设置为无限成本),但这并不理想,因为成本实际上并不是可变的(无限成本或正常成本)。

对于优先级约束,使用DAG应该可以很好地工作,但是我不知道如何包括排除项。

目前,我正在使用一种贪婪算法,该算法可使所有其他处理器中已释放(不再受约束)的作业的成本最大化。但是我不知道这是最优的还是好的。

我相当确定这是NP困难的,因此我不认为存在最佳算法。使用多处理器调度可能是这里的问题,因为使用背包装或最小路径算法可能会更好。

最好同时考虑这两个约束条件,但是有关处理被排除的工作的文献很少(根据某些谷歌搜索),因此仅处理这些问题的建议将是有益的。

3 个答案:

答案 0 :(得分:1)

一种解决方法如下。

引入一个二进制变量assign(j,m)来指示是否将作业j分配给机器m。然后,为所有不允许的组合修复所有变量assign(j,m)=0。一个好的MIP求解器会在预求解阶段从模型中删除相应的变量。

当我这样做并完成MIP公式并解决它时,我会看到:

----     63 --------------- data ---

----     63 SET ok  allowed job/machine combinations

        machine1    machine2    machine3

job1         YES         YES
job2         YES         YES
job3         YES                     YES
job4                                 YES


----     63 PARAMETER proctime  processing time

job1  4.000,    job2  2.000,    job3 10.000,    job4 12.000


----     63 SET prec  precedence

            job2        job4

job1         YES         YES


----     63 --------------- solution -----

----     63 VARIABLE assign.L  assign job to machine

        machine1    machine2    machine3

job1                   1.000
job2                   1.000
job3       1.000
job4                               1.000


----     63 VARIABLE start.L  job start time

job2 4.000,    job4 4.000


----     63 VARIABLE finish.L  job finish time

job1  4.000,    job2  6.000,    job3 10.000,    job4 16.000


----     63 VARIABLE makespan.L            =       16.000  time last job is finished

(请注意,不会打印开始时间为零)

完整的模型是here

答案 1 :(得分:0)

  

我的目的是为每台机器找到最佳时间表,以最大程度地减少总时间。

不要。

假设的教科书情景之外;调度程序通常不知道什么时候开始更多的作业,什么作业可能花费多长时间,何时任何计算机(或CPU)改变速度,何时/是否出现硬件故障,是否/何时取消作业(或崩溃),...

唯一明智的/实用的方法是忘记“对于虚拟场景的理论上的最佳选择”,并动态地适应变化/“事先不可知”的条件,同时做出“足够好”的决策,因为您负担不起浪费CPU时间来尝试找到“可能只有一毫秒的完美时间,但是现在已经太晚了,因为决定时间太长了”解决方案。

通常,有非常频繁的“事件”会影响调度(作业开始,停止,等待IO,由于发生IO而继续,作业发生,电源管理更改等);并且调度程序必须在发生这些事件时以快速/有效的方式对其做出反应。

如果某些作业必须先完成,那么这不是调度程序的问题-这是谁为这些任务编写代码的人都必须处理的问题(添加“等待其他作业完成,然后再继续”),合适-例如waitpid())。

如果只有某些机器可以运行某些作业,那应该是微不足道的(您只需要某种“亲和力掩码”即可控制该作业可以在何处运行)。

答案 2 :(得分:0)

您可以为此使用OR-Tools CP-SAT解算器。

请参见

https://developers.google.com/optimization/scheduling/job_shop

如果每个任务只能在一台计算机上执行,或者

https://github.com/google/or-tools/blob/master/examples/python/flexible_job_shop_sat.py

如果每个任务都可以有替代机器,那么必须选择一台机器。