多機排程問題——貪心演算法
阿新 • • 發佈:2020-12-26
多機排程問題
問題表述為:假設工廠有M臺機器,現在被分配了N個任務,每個任務都有其自己的規模,即需要花費的時間成本,問如何能充分利用M臺機器,在最短時間內完成這一系列任務集合。
實現思路為將任務集合按需要花費的時間成本進行從大到小的排序,然後再從頭到尾的開始分配任務,把任務依次分配給目前累計需要工作時間最短的機器。由於要最後列印結果,所以建立了一個任務物件方便之後的輸出結果即檢驗,定義了一個Comparator從而進行列表的排序。
話不多說,直接上 bug
。
package test;
import java.util.ArrayList;
import java. util.Iterator;
import java.util.List;
import java.util.Scanner;
public class WorkManager {
public static int number(Object result[][]) {
int temp = 0;
for(int i = 0;i < result.length - 1;i++) {
if((int)result[i + 1][0] < (int)result[i][0]) {
temp = i + 1;
}
}
return temp;
}
public static void workManager() {
List<Work> list = new ArrayList<Work>();
System.out.println("請輸入需要生成的總任務數:");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for(int i = 1;i <= n;i++) {
list.add(new Work(i, (int)(Math.random() * 20) + 1));
}
list. sort(new WorkComparator());
/* for(Work work : list) {
System.out.println(work);
}*/
System.out.println("--------------------------------隨機任務生成完畢--------------------------------");
System.out.println("請輸入總機器數量:");
int m = scan.nextInt();
Object result[][] = new Object[m][2];
for(int i = 0;i < m;i++) {
result[i][0] = 0;
result[i][1] = "";
}
scan.close();
System.out.println("--------------------------------機器生成完畢--------------------------------");
if(n <= m) {
System.out.println("無意義!");
}else {
Iterator<Work> temp = list.iterator();
for(int i = 0;i < m;i++) {
Work tempWork = temp.next();
result[i][0] = (int)result[i][0] + tempWork.getWorktime();
result[i][1] = (String)result[i][1] + tempWork.getId() + ",";
}
while(temp.hasNext()) {
Work tempWork = temp.next();
int tempi = number(result);
result[tempi][0] = (int)result[tempi][0] + tempWork.getWorktime();
result[tempi][1] = (String)result[tempi][1] + tempWork.getId() + ",";
}
}
System.out.println();
System.out.println();
System.out.println("--------------------------------任務分配完畢--------------------------------");
for(int i = 0;i < result.length;i++) {
System.out.println("機器" + (i + 1) + "所用時間為:" + result[i][0]);
System.out.print("機器" + (i + 1) + "所有完成的所有任務為:");
String temp[] = result[i][1].toString().split(",");
for(String a : temp) {
System.out.print(a + "\t");
}
System.out.println();
}
}
public static void main(String[] args) {
workManager();
}
}
改進點:all