首頁 > 後端開發 > Python教學 > 實例詳解Python基於回溯法子集樹模板解決最佳作業調度

實例詳解Python基於回溯法子集樹模板解決最佳作業調度

巴扎黑
發布: 2017-09-09 11:00:40
原創
1905 人瀏覽過

這篇文章主要介紹了Python基於回溯法子集樹模板解決最佳作業調度問題,簡單說明了作業調度問題並結合實例形式給出了Python使用回溯法子集樹模板實現最佳作業調度問題的具體步驟與相關操作技巧,需要的朋友可以參考下

本文實例講述了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

#解編碼:(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基於回溯法子集樹模板解決最佳作業調度的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板