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

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

 

多機排程問題:

有n個獨立的作業需要在m臺相同的機器上進行加工處理. 作業i需要的加工時間為ti. 每個作業可以任選一臺機器加工, 但加工結束前不能中斷, 作業不允許拆分.

要求給一種作業排程方案, 使所給的n個作業在儘可能短的時間內完成.

問題分析:

為什麼是NP問題? (待求證)

問題解答:

採用最長處理時間作業優先的貪心選擇策略可以設計出較好的近似演算法
--------------------- 
作者:eijnew 
來源:CSDN 
原文:https://blog.csdn.net/eijnew/article/details/7260232 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

package tt;
import java.util.*;
public class Duojidiaodu {
    public static void main(String args[]) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            int m=in.nextInt();
            List list=new ArrayList<Integer>();
            for(int i=0;i<n;i++) {
                list.add(in.nextInt());
            }
            //從大到小排序
            Collections.sort(list);
            //初始化狀態值
            int status[]=new int[m];
            //統計耗時
            int time=0;
            //統計status 中作業耗時最長的
            int max=(int)list.get(0);
            for(int i=n-1;i>=0;i--) {
                int flag=0; //用於判斷作業是否有完成的
                int min=(int)list.get(n-1)+1;
                for(int j=0;j<m;j++) {
                    min=Math.min(min,status[j]); //統計status 中作業耗時最短的
                    if(status[j]==0) {
                        status[j]=(int)list.get(i);
                        max=Math.max(max,status[j]);
                        min=Math.min(min,status[j]); 
                        flag=1;
                        break;
                    }
                }
                //當作業中status都在執行時,直接跳到最短作業已完成的status的狀態
                if(flag==0) {
                    for(int j=0;j<m;j++) {
                        status[j]-=min;
                    }
                    time+=min; //統計耗時
                    max=max-min; //更新此時status的最大值
                    i++;
                }
            }
            //最好的耗時等於更換status時累計的跳轉值和最後status的最大值之和
            System.out.println(time+"+"+max+"="+(time+max));
        }
    }
}