有n个完成时间不同的独立任务,m台处理机,n个任务在任意一台处理机上完成及为完成,一台处理机在同一时间只能处理一个任务,要求给定任务时间和处理机数量时,完成所有任务的最短时间。
多机调度问题是一个NP完全问题,目前没有有效解法,可以使用贪心算法获得近似最优解的答案。当n<=m时,所有任务可以单独占有一台处理机,所以任务完成时间最长的任务就决定了所有任务完成的最短时间;当n>m时,将所有任务按从大到小顺序排列,依次分别放入每次使用中最短时间的机器,就可以获得贪心算法下的近似最优解。
package test;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;/** * Created by saishangmingzhu on 2018/12/11. */public class MultiMachineScheduling { public static void main(String[] arg) { new MultiMachineScheduling().greedyAlgorithm(); } public void greedyAlgorithm(){ ListtaskList=new ArrayList<>(); taskList.add(new Task("J1",2)); taskList.add(new Task("J2",14)); taskList.add(new Task("J3",4)); taskList.add(new Task("J4",16)); taskList.add(new Task("J5",6)); taskList.add(new Task("J6",5)); taskList.add(new Task("J7",3)); List machineList=new ArrayList<>(); machineList.add(new Machine("m1",0)); machineList.add(new Machine("m2",0)); machineList.add(new Machine("m3",0)); Collections.sort(taskList, new Comparator () { @Override public int compare(Task o1, Task o2) { return o2.getTime()-o1.getTime(); } }); if (taskList.size()<=machineList.size()){ System.out.println(taskList.get(0).getTime()); } for (Task task:taskList){ Collections.sort(machineList, new Comparator () { @Override public int compare(Machine o1, Machine o2) { return o1.getTime()-o2.getTime(); } }); Machine machine=machineList.get(0); machine.getTaskList().add(task); machine.setTime(machine.getTime()+task.getTime()); } int minTime=machineList.get(machineList.size()-1).getTime(); System.out.println(minTime); for (Machine machine:machineList){ System.out.print(machine.getName()+":"); for (Task task:machine.getTaskList()){ System.out.print(task.getName()+","); } System.out.println(); } } class Machine{ private String name; private List taskList=new ArrayList<>(); private int time; public Machine(String name, int time) { this.name = name; this.time = time; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getTaskList() { return taskList; } public void setTaskList(List taskList) { this.taskList = taskList; } public int getTime() { return time; } public void setTime(int time) { this.time = time; } } class Task{ private String name; private int time; public Task(String name, int time) { this.name = name; this.time = time; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTime() { return time; } public void setTime(int time) { this.time = time; } }}