日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法设计与分析——回溯法——批处理作业调度

發布時間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法设计与分析——回溯法——批处理作业调度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:給定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;//機器2完成處理時間 int f1;//機器1完成處理時間 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++)//分枝數 {//設置作業在機器1完成的時間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!)

總結

以上是生活随笔為你收集整理的算法设计与分析——回溯法——批处理作业调度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。