有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(){
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;
}
}
}
©著作权归作者所有:来自51CTO博客作者塞上名猪的原创作品,如需转载,请注明出处,否则将追究法律责任
共同学习,写下你的评论
评论加载中...
作者其他优质文章