Java 贪婪调度算法
有证据表明,按照任务的开始时间对任务列表进行排序将使用执行任务所需的最少机器数量。我发现了这样一种情况:按总时间排序使用的机器更少 调度方法:该算法利用时间来查看时间是否重叠。如果它们确实重叠,我们就制造一台新机器。如果没有,我们将重新分配机器Java 贪婪调度算法,java,scheduled-tasks,greedy,Java,Scheduled Tasks,Greedy,有证据表明,按照任务的开始时间对任务列表进行排序将使用执行任务所需的最少机器数量。我发现了这样一种情况:按总时间排序使用的机器更少 调度方法:该算法利用时间来查看时间是否重叠。如果它们确实重叠,我们就制造一台新机器。如果没有,我们将重新分配机器 private static void schedule(ArrayList<Task> tasks, ArrayList<Machine> machines) { for (Task t : tasks){
private static void schedule(ArrayList<Task> tasks, ArrayList<Machine> machines) {
for (Task t : tasks){
boolean canProcess = false;
for(Machine m : machines){
if(t.startTime < m.task.endTime && t.endTime > m.task.startTime)
continue;//this machine is running during this time; look at next machine
canProcess = true;
m.task = t;
break; //go on to the next task
}
if(canProcess == false){
//create a new machine
Machine m = new Machine();
m.task = t;
machines.add(m);
}
}
}
下面是按总时间排序:
Start Time: 4 End Time: 7 Total Time: 3
Start Time: 19 End Time: 22 Total Time: 3
Start Time: 5 End Time: 9 Total Time: 4
Start Time: 12 End Time: 21 Total Time: 9
Start Time: 6 End Time: 20 Total Time: 14
Sorting by total time: 2 machines
那么这个定理被打破了还是我没有正确地实现贪婪调度?如果我正确地理解了您的代码,您将任务从4-7分配给机器1;然后将任务从19-22分配给机器1,因为该间隔与前一间隔(4-7)不重叠;然后将任务从5-9分配给机器1,因为该间隔与上一个间隔(19-22)不重叠。你已经有问题了。你告诉机器1从时间4-7开始执行一项任务,从时间5-9开始执行一项任务,但它不能这样做。所以你的“两台机器”结果是假的
如果您不想先按开始时间排序就获得机器的数量,那么您需要保留分配给每台机器的所有任务间隔的列表。因此,在第二个任务之后,您的数据将显示机器1计划在4-7和19-22运行。然后,当您在间隔5-9查看第三个任务时,您必须对照分配给机器1的两个间隔进行检查。您将发现它与4-7重叠,并且您无法安排它,因此您将它分配给机器2。我认为,如果您先按开始时间排序,那么您就不必为每台机器保留任务列表。也许这就是定理的真正含义?我不知道;我必须看看这个定理(如果你能提供一个参考,那就好了)。你需要更具体地说明你在谈论什么定理。
Start Time: 4 End Time: 7 Total Time: 3
Start Time: 19 End Time: 22 Total Time: 3
Start Time: 5 End Time: 9 Total Time: 4
Start Time: 12 End Time: 21 Total Time: 9
Start Time: 6 End Time: 20 Total Time: 14
Sorting by total time: 2 machines