给出n个按优先级排序的任务,其中timeAvailable(任务变为可用的时间-该任务在此时间之前无法启动)和lengthOfTask(任务需要完成的时间)和m个可用计算机的数量,如何有效地建立计划,以使在任何给定时间的任务数不会比可用计算机数和优先级更高的任务的计划优先。必须安排所有任务,不能及时安排的任务应重新安排到以后的时间。
更清晰地说:如果我们有2台机器和任务:
let tasks =
[
{name: "task1", priority: 5, timeAvailable : 1 lengthOfTask : 4},
{name: "task2", priority: 4, timeAvailable : 3 lengthOfTask : 4},
{name: "task3", priority: 3, timeAvailable : 3 lengthOfTask : 3},
{name: "task4", priority: 2, timeAvailable : 2 lengthOfTask : 4},
{name: "task5", priority: 1, timeAvailable : 4 lengthOfTask : 4},
]
我希望自己的日程安排如下:
[
{name: "task1", priority: 5, timeAvailable : 1 lengthOfTask : 4},
{name: "task2", priority: 4, timeAvailable : 3 lengthOfTask : 4},
{name: "task3", priority: 3, timeAvailable : 5 lengthOfTask : 3},
{name: "task4", priority: 2, timeAvailable : 7 lengthOfTask : 4},
{name: "task5", priority: 1, timeAvailable : 8 lengthOfTask : 4},
]
我们不得不重新计划:无法启动3上的task3,因为已经使用了两台计算机。当任务5完成时,它可以从5开始。它持续3秒钟,所以将在8秒钟结束...
我试图用递归实现一个解决方案,但是对于大量的任务和机器来说,它太慢了。
问题是,对于算法的正确性,在安排任务时,我们必须检查(计数)有多少个任务重叠。如果重叠任务数> =机器数,
我们必须使用最早结束任务的结束时间作为新的startTime。这使得算法非常复杂。
我的代码是用node编写的,并使用moment.js来比较时间和超时值
伪代码:
let tasks = ... // look at original tasks array above
let schedule = []
for each task in tasks:
task.startTime = scheduleTask(task.timeAvailable, task.lengthOfTask)
tasks.endTime = task.startTime + task.lengthOfTask
schedule.push(task)
function scheduleTask(startTime, lengthOfTask):
let overlappingTasks = getOverlappingTasks(); //gets all the tasks that overlaps
if(overlappingTasks.length >= avaliableMachines):
let earliestEndingOverlappingTask = getEarliestEndingOverlappingTask(overlappingTasks);
return scheduleTask(earliestEndingOverlappingTask.endTime, lengthOfTask)
else:
return startTime
复杂度为O(n ^ 2)-我认为。我想要一个比这更好的算法。