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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

回溯法:批量作业调度

發布時間:2024/9/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法:批量作业调度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

給定 n 個作業的集合 j = {j1, j2, …, jn}。每一個作業 j[i] 都有兩項任務分別在兩臺機器上完成。每一個作業必須先由機器1 處理,然后由機器2處理。作業 j[i] 需要機器 j 的處理時間為 t[j][i] ,其中i = 1, 2, …, n, j = 1, 2。對于一個確定的作業調度,設F[j][i]是作業 i 在機器 j 上的完成處理的時間。所有作業在機器2上完成處理的時間之和 f = sigma F[2][i] 稱為該作業調度的完成時間之和。
批處理作業調度問題要求對于給定的 n 個作業,制定最佳作業調度方案,使其完成時間和達到最小。

Before you start:

流水作業調度的最終目標是要求完成所有任務的時間最短,所以把最后一個任務的完成時間作為標準;而批處理作業調度的目的是要讓每一個作業都盡快得到處理,所以要把每個作業的完成時間之和作為標準。

兩者看上去相似,但實際上還是有區別的,可能在某些情況下調度是順序是一樣的。
批處理作業采用回溯法,一定能夠得到最優解,因為你搜索的是整個解空間;
流水作業調度采用動態規劃法,同樣能夠等到最優解,這個是可以證明的。
這就是為什么?

self.totaltime += self.f2[depth]

代碼實現如下:

class FlowShop:def __init__(self,N,mission): self.N = N #作業數目self.mission = mission #作業時間self.bestFinishtime = 10000 #最優完成時間self.schedule = [i for i in range(N)] #當前的策略self.bestSchedule = [0]*N #最優策略self.f2 = [0]*N #機器2每個任務完成處理的時間self.f1 =0 #機器1任務完成處理的時間self.totaltime = 0 #機器2每個任務完成處理的時間,求和,這個時間是每個作業完成時間之和self.depth = 0 #def back_tracking(self,depth):#遞歸出口if depth > self.N-1:self.bestFinishtime = self.totaltimeself.bestSchedule[:] = self.schedule[:]return #機器1作業時間else:for i in range(depth,self.N):self.f1 +=self.mission[0][self.schedule[i]]#機器2作業完成時間if depth ==0:self.f2[depth] = self.f1 + self.mission[1][self.schedule[i]]else:self.f2[depth] = max(self.f1,self.f2[depth-1]) + self.mission[1][self.schedule[i]]# 這個時間是每個作業完成時間之和,為了讓每個作業盡可能早的完成self.totaltime += self.f2[depth]# 滿足條件,進入下一層處理,這個看成一個模塊if self.totaltime < self.bestFinishtime:self.schedule[i],self.schedule[depth] = self.schedule[depth],self.schedule[i]self.back_tracking(depth+1)self.schedule[i],self.schedule[depth] = self.schedule[depth],self.schedule[i]#  回溯處理,又可以理解為沒有進入下一層,對上面操作進行undo回溯self.f1 -=self.mission[0][self.schedule[i]]self.totaltime -= self.f2[depth]def print_back_tracking(self):self.back_tracking(self.depth)print self.bestScheduleprint self.bestFinishtimeN = 3 mission = [[2,3,2],[1,1,3]] instance = FlowShop(N,mission) instance.print_back_tracking()[0, 2, 1] 18

總結

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

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