帶有限期和效益的單位時間的作業排序貪心算法


D=(2,3,1,3,4,5,2);P(15,12,11,10,8,5,4);

首先將作業按p1≥p2 ≥ … ≥ pn排序, 將作業1存入解數組J中, 然后按照如下步驟逐一處理作業2到作業n;假設已處理完了i-1個作業, 其中有k個作業可構成可行解,已存入J(1),J(2)…J(k)中, 且D(J(1))<=D(J(2)) <=…<=D(J(k))
§現在處理作業i, 判斷Jυ{i}是否可行, 就是看是否能為其中作業都找到適當插入位置r, 使作業i插入后有D(J(r))≥r; 1≤r≤k+1.  過程如下:

將D(J(k)), D(J(k-1)),…依次與D(i)比較,若D(J(l))>D(i)且D(J(l))≠l,l≤k,則作業J(l)可以向后延遲一個單位時間來處理,作業i可以在J(l)之前處理。

 1 package greedy;
 2 
 3 public class JS {
 4     int n=7;
 5     int [] D={0,2,3,1,3,4,5,2};//下標從1開始
 6     float[] P={0,15,12,11,10,8,5,4};//先對P進行非增排序
 7     int[] J=new int[n+1]; 
 8     int k;
 9     JS(){
10         k=js(D,J,n,k);
11         System.out.println("可調度作業數目:"+k);
12         double sum=0;
13         System.out.print("作業調度次序:"); 
14         for(int i=1;i<=k;i++){
15             System.out.print("->"+J[i]);
16             sum+=P[J[i]];
17         }
18         System.out.println();
19         System.out.println("總收益Sum="+sum);
20     }
21     public int js(int[] D,int[] J,int n,int k){
22         int i,r;
23         k=1;
24         J[1]=1;//把第一個作業加入
25         for(i=2;i<n;i++){
26             r=k;
27             while(D[J[r]]>D[i]&&D[J[r]]!=r){
28                 r--;
29             }
30             if(D[J[r]]<=D[i]&&D[i]>r){
31                 for(int l=k;l>r;l--){
32                     J[l+1]=J[l];
33                 }
34                 J[r+1]=i;
35                 k++;
36             }
37         }
38         return k;
39     }
40     public static void main(String[] args) {
41         // TODO Auto-generated method stub
42         new JS();
43     }
44 
45 }
View Code

測試結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM