有n個完成時間不一樣的獨立任務,m臺處理機,n個任務在任意一臺處理機上完成及爲完成,一臺處理機在同一時間只能處理一個任務,要求給定任務時間和處理機數量時,完成全部任務的最短期。java
多機調度問題是一個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(){ List<Task> taskList=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<Machine> 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<Task>() { @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<Machine>() { @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<Task> 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<Task> getTaskList() { return taskList; } public void setTaskList(List<Task> 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; } } }