我正在尝试找到/开发一种算法,该算法可以最大程度地减少将作业调度到计算机上的总时间(带有运行时间)。即标准的多处理器调度算法。
但是,我还有两个其他限制:必须先完成某些作业(优先)。 仅某些计算机可以运行某些作业(作业排除)。作业并不是处理器唯一的。
例如,我可能有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困难的,因此我不认为存在最佳算法。使用多处理器调度可能是这里的问题,因为使用背包装或最小路径算法可能会更好。
最好同时考虑这两个约束条件,但是有关处理被排除的工作的文献很少(根据某些谷歌搜索),因此仅处理这些问题的建议将是有益的。
答案 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
如果每个任务都可以有替代机器,那么必须选择一台机器。