生活随笔
收集整理的這篇文章主要介紹了
算法设计与分析——回溯法——批处理作业调度
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:給定n個作業的集合{J1,J2,…,Jn}。每個作業必須先由機器1處理,然后由機器2處理。作業Ji需要機器j的處理時間為tji。對于一個確定的作業調度,設Fji是作業i在機器j上完成處理的時間。所有作業在機器2上完成處理的時間和稱為該作業調度的完成時間和。
批處理作業調度問題要求對于給定的n個作業,制定最佳作業調度方案,使其完成時間和達到最小。
這3個作業的6種可能的調度方案是1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1;它們所相應的完成時間和分別是19,18,20,21,19,19。易見,最佳調度方案是1,3,2,其完成時間和為18。
以1,2,3為例:
作業1在機器1上完成的時間為2,在機器2上完成的時間為3
作業2在機器1上完成的時間為5,在機器2上完成的時間為6
作業3在機器1上完成的時間為7,在機器2上完成的時間為10
3+6+10=19,所以時間和為19。
以1,3,2為例:
作業1在機器1上完成的時間為2,在機器2上完成的時間為3
作業3在機器1上完成的時間為4,在機器2上完成的時間為7
作業2在機器1上完成的時間為7,在機器2上完成的時間為8
3+7+8=18,所以時間和為18。
批處理作業調度問題要從n個作業的所有排列中找出具有最小完成時間和的作業調度,所以如圖,批處理作業調度問題的解空間是一顆排列樹。按照回溯法搜索排列樹的算法框架,設開始時x=[1,2,……n]是所給的n個作業,則相應的排列樹由x[1:n]的所有排列構成。
算法分析:
#include<iostream>#include<stdlib.h>
using namespace std
;
class Flowshop
{public
:int **M
;int *x
;int *bestx
;int *f2
;int f1
;int f
;int bestf
;int n
;void Backtrack(int i
);};void Flowshop
::Backtrack(int i
)
{if(i
>n
){for(int i
=1;i
<=n
;i
++){bestx
[i
]=x
[i
];}bestf
= f
;}else{for(int j
=i
;j
<=n
;j
++){f1
+=M
[x
[j
]][1];f2
[i
]=((f2
[i
-1]>f1
)? f2
[i
-1]:f1
) +M
[x
[j
]][2];f
+=f2
[i
];if(f
<bestf
){swap(x
[i
],x
[j
]);Backtrack(i
+1);swap(x
[i
],x
[j
]);}f1
-=M
[x
[j
]][1];f
-=f2
[i
];} } } int Flow(int **M
,int n
,int bestx
[])
{int ub
= INT_MAX
;Flowshop X
;X
.x
= new
int [n
+1];X
.f2
= new
int [n
+1];X
.M
=M
;X
.n
=n
;X
.bestx
=bestx
;X
.bestf
= ub
;X
.f1
= 0;X
.f
= 0;for(int i
=0;i
<=n
;i
++){X
.f2
[i
]=0,X
.x
[i
]=i
;}X
.Backtrack(1);delete
[] X
.x
;delete
[] X
.f2
;return X
.bestf
;
}
int main()
{int n
;cout
<<"請輸入要處理作業的數量:";cin
>>n
;int bestx
[n
+1];int **M
=new
int *[n
+1];for(int i
=0;i
<n
+1;i
++){M
[i
]= new
int [3];}cout
<<"請輸入每個作業在兩個機器上工作的處理時間序列:(如1 2):"<<endl
; for(int i
=1;i
<=n
;i
++){cin
>>M
[i
][1]>>M
[i
][2];}cout
<<"所有作業在機器2上的完成時間和(該作業調度的完成時間)為:"<<Flow(M
,n
,bestx
);
}
算法的時間復雜度為O(n!)
總結
以上是生活随笔為你收集整理的算法设计与分析——回溯法——批处理作业调度的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。