国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python基于回溯法子集樹模板解決最佳作業調度問題示例

2020-01-04 16:42:16
字體:
來源:轉載
供稿:網友

本文實例講述了Python基于回溯法子集樹模板解決最佳作業調度問題。分享給大家供大家參考,具體如下:

問題

給定 n 個作業,每一個作業都有兩項子任務需要分別在兩臺機器上完成。每一個作業必須先由機器1 處理,然后由機器2處理。

試設計一個算法找出完成這n個任務的最佳調度,使其機器2完成各作業時間之和達到最小。

分析:

看一個具體的例子:

tji 機器1 機器2
作業1 2 1
作業2 3 1
作業3 2 3

最優調度順序:1 3 2

處理時間:18

這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

1,3,2

作業1在機器1上完成的時間為2, 在機器2上完成的時間為3
作業3在機器1上完成的時間為4,在機器2上完成的時間為7
作業2在機器1上完成的時間為7,在機器2上完成的時間為8

3+7+8 = 18

Python,回溯法,子集樹模板,最佳作業調度問題

解編碼:(X1,X2,...,Xn),Xi表示順序i執行的任務編號。所以,一個解就是任務編號的一個排列。

解空間:{(X1,X2,...,Xn)| Xi屬于S,i=1,2,...,n},S={1,2,...,n}。所以,解空間就是任務編號的全排列。

講道理,要套用回溯法的全排列模板。

不過,有了前面兩個例子做鋪墊,這里套用回溯法的子集樹模板。

代碼

'''最佳作業調度問題tji     機器1   機器2作業1     2     1作業2     3     1作業3     2     3'''n = 3 # 作業數# n個作業分別在兩臺機器需要的時間t = [[2,1],   [3,1],   [2,3]]x = [0]*n  # 一個解(n元數組,xi∈J)X = []   # 一組解best_x = [] # 最佳解(一個調度)best_t = 0 # 機器2最小時間和# 沖突檢測def conflict(k):  global n, x, X, t, best_t  # 部分解內的作業編號x[k]不能超過1  if x[:k+1].count(x[k]) > 1:    return True  # 部分解的機器2執行各作業完成時間之和未有超過 best_t  #total_t = sum([sum([y[0] for y in t][:i+1]) + t[i][1] for i in range(k+1)])  j2_t = []  s = 0  for i in range(k+1):    s += t[x[i]][0]    j2_t.append(s + t[x[i]][1])  total_t = sum(j2_t)  if total_t > best_t > 0:    return True  return False # 無沖突# 最佳作業調度問題def dispatch(k): # 到達第k個元素  global n, x, X, t, best_t, best_x  if k == n: # 超出最尾的元素    #print(x)    #X.append(x[:]) # 保存(一個解)    # 根據解x計算機器2執行各作業完成時間之和    j2_t = []    s = 0    for i in range(n):      s += t[x[i]][0]      j2_t.append(s + t[x[i]][1])    total_t = sum(j2_t)    if best_t == 0 or total_t < best_t:      best_t = total_t      best_x = x[:]  else:    for i in range(n): # 遍歷第k個元素的狀態空間,機器編號0~n-1,其它的事情交給剪枝函數      x[k] = i      if not conflict(k): # 剪枝        dispatch(k+1)# 測試dispatch(0)print(best_x) # [0, 2, 1]print(best_t) # 18

效果圖

Python,回溯法,子集樹模板,最佳作業調度問題

 

希望本文所述對大家Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 四子王旗| 凭祥市| 云梦县| 伊川县| 电白县| 永康市| 于都县| 札达县| 桃园县| 陵水| 炎陵县| 石台县| 社旗县| 万年县| 无为县| 兰溪市| 桃园市| 嵊泗县| 嘉鱼县| 鹤山市| 凉城县| 集安市| 镇康县| 锡林郭勒盟| 平利县| 房山区| 高碑店市| 长葛市| 京山县| 南郑县| 陕西省| 湘潭市| 英吉沙县| 焉耆| 尤溪县| 伽师县| 泰顺县| 兴宁市| 中方县| 金乡县| 湘潭市|