使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。
可以考虑以下的贪心策略:
(1)最长处理时间作业优先的贪心选择策略。
(2)最短处理时间作业优先的贪心选择策略。
(3)作业到达时间优先的贪心选择策略。
package test; import java.util.*; public class TxDjdu{ static int N=7; //作业数 static int M=3; //机器数 static int[] s=new int[M];//每台机器当前已分配的作业总耗时 public static void main(String arg[]) { int[] time =new int[]{2,14,4,6,16,5,3}; Sort(time,N);//处理时间按从大到小排序 int maxtime = 0; if(M >= N) { maxtime = work1(time,N); } else { maxtime = work2(time,N); } System.out.print("最长作业优先算法耗费时间:"+maxtime); } //冒泡排序 static void Sort(int t[],int n){ int temp; for(int i=1;i<n;i++){ for(int j=0;j<n-i;j++){ if(t[j]<t[j+1]){ temp=t[j]; t[j]=t[j+1]; t[j+1]=temp; } } } } //机器数大于待分配作业数 static int work1(int t[],int n) { int i; for(i=0;i<n;i++) { s[i] = t[i]; } int ma = maxWork(s,N);//s中最长的机器工作时间为结果 return ma; } //机器数小于待分配作业数 static int work2(int t[],int n) { int i; int mi = 0; for(i=0;i<n;i++) { mi = min(M);//找到空闲的机器号 System.out.printf("%d,时间和最小的机器号为%d.时间和为%d: ",i,mi,s[mi]); s[mi] = s[mi]+t[i];//每次取最长的作业放入机器中 } int ma = maxWork(s,M);//s中最长的机器工作时间为结果 return ma; } //求出目前处理作业的时间和 最小的机器号 static int min(int m) { int min = 0; int i; for(i=1;i<m;i++) { if(s[min] > s[i]) { min = i; } } return min; } //求最终结果(最长处理时间) static int maxWork(int s[],int num) { int max = s[0]; int i; for(i=1;i<num;i++) { max=Math.max(max, s[i]); } return max; } }