1. 程式人生 > 其它 >多機排程問題——貪心演算法

多機排程問題——貪心演算法

技術標籤:演算法java

多機排程問題
問題表述為:假設工廠有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