Java 作业调度:M个作业和N台机器

Java 作业调度:M个作业和N台机器,java,algorithm,job-scheduling,Java,Algorithm,Job Scheduling,有5个作业(比如说J1,J2,J3,J4和J5)和4台机器(比如说M1,M2,M3和M4)。每个作业都需要机器,顺序如下所示: 作业集: J1: M1(8); M2(16); M4(12) J2: M1(20); M3(10); M2(18) J3: M3(12); M4(8); M1(15) J4: M4(14); M2(18) J5: M3(10); M1(15) 例如:J1在M1上需要8个时间单位;M2上有16个时间单位,M4上有12个时间单位 所有作业都可以并行运行,但

有5个作业(比如说
J1
J2
J3
J4
J5
)和4台机器(比如说
M1
M2
M3
M4
)。每个作业都需要机器,顺序如下所示:

作业集:

J1: M1(8); M2(16); M4(12)  
J2: M1(20); M3(10); M2(18)  
J3: M3(12); M4(8); M1(15)  
J4: M4(14); M2(18)  
J5: M3(10); M1(15)
例如:
J1
M1
上需要8个时间单位;M2上有16个时间单位,M4上有12个时间单位

所有作业都可以并行运行,但必须遵循机器上的执行顺序

例如:
J1
只能在完成8个
M1
单元后才能在
M2
上运行(请参见上述作业集中的
J1
),依此类推

目标:减少每台机器的空闲时间(从而减少总空闲时间),即最大限度地提高机器利用率


我们如何着手解决这个问题?我想知道是否有任何算法,我可以遵循开始与这个问题。感谢您为解决此问题提供的任何帮助。如果可能的话,我更喜欢在我的算法中使用java

减少空闲时间相当于最小化计划的总长度(通常称为makespan)。您希望最小化完工时间

静态jobshop调度问题已有50多年的历史,因此对这一问题有着广泛的研究。最小化完工时间也是人们在这方面发表论文的最喜欢的目标,所以你有机会找到一些灵感


这个问题有点难处理,所以你要看的是一个算法,它提供了一个近似的结果。好的候选者是元启发式算法,如遗传算法、禁忌搜索(TS)、可变邻域搜索等等。就我所记得的,TS在测试结果上比其他算法表现得更好。你应该看看Nowicki和Smutnicki的工作(一种针对作业车间问题的快速禁忌搜索算法E Nowicki,C Smutnicki-管理科学,1996年,以及后续工作)。他们对TS的实现能够击败当时的基准测试结果。

您更喜欢哪种语言?还是只需要逻辑?正在寻找一个想法,我更喜欢Java。请告诉我们一些您在哪里遇到这个问题的背景,您试图做些什么来解决它,以及它是如何失败的。我相信这个问题被称为“Job Shop Scheduling”在文献中:对于M>2,这个问题似乎是NP完全问题,这意味着如果你想确保得到最优解,你必须使用蛮力,即尝试所有可能的置换。谢谢你提供的信息。我会仔细阅读你建议的材料。