Python3 回朔法完成作業分配
阿新 • • 發佈:2019-01-31
學號:S201625005 姓名:樑勳 聯絡電話:13126734215 執行環境:MacOS serria 10.12.4 Beta (16E163f) 程式語言:Python3
分析設計: 有n份作業分配給n個人去完成,每人完成一份作業。 假定第i個人完成第j份作業需要花費cij時間,cij>0,1≦i,j≦n。試設計一個回溯演算法,將n份作業分配給n個人完成,使得總花費時間最少。 這是一個尋找最優解的問題,通常的解決辦法就是窮舉出所有結果,找出最優解 資料結構: 輸入資料來源於檔案,input_assign04_o*.dat. 檔案內是n*n矩陣的元素,每行的元素代表完每個工人成該任務所需要的時間,每列代表某個工人完成每個工作需要的時間,讀出的資料放在matrix中。 matrix[i][j]表示第j個工人完成第i個任務需要的時間。 Class Worker 中 使用user_distributed來標記在某一次求解中某工人是否被分配了任務 使用user_work來記錄每次找到更適合的解的時候,工人工作分配情況 使用min_cost來記錄最小的時間消耗和 使用n來記錄使用者或者作業的數量,題設中二者相等 初始化函式中完成從檔案中讀取資料,初始化相關變數的工作 back_track函式為回朔演算法的主體部分deep 表示當前分配到第幾個任務了,cost用來記錄本次求解的花費情況 write_into_file函式將結果寫入檔案
附上程式碼:
class Worker: input_file = '' output_file = '' n = 0 # 矩陣大小n*n matrix = [] # 存放每人解決沒個問題時間的矩陣 user_distributed = [] # 使用者是否分配了工作 min_cost = 8000 # 預設一個最大的時間消費值 user_work = [] # 接受使用者分配的工作 # 初始化必要引數 def __init__(self, input_file, output_file): self.input_file = input_file self.output_file = output_file with open(self.input_file) as file: for line in file: # print(line) data_source = line.split(',') temp = [] for time in data_source: temp.append(int(time)) self.matrix.append(temp) self.n = len(self.matrix) # 初始化 工人是否分配標記 工人最有分配結果 for i in range(self.n): self.user_distributed.append(0) self.user_work.append(0) # 回朔法尋找最優解 def back_track(self, deep, cost): if deep == self.n: if cost < self.min_cost: self.min_cost = cost for k in range(self.n): self.user_work[k] = self.user_distributed[k] # print(self.user_distributed) # print('到底了 花費時間為:', cost) return else: for i in range(self.n): if self.user_distributed[i] == 0: # 沒有分配工作的人 self.user_distributed[i] = deep+1 # 標記當前公認已經被標記分配了工作 time = self.matrix[deep][i] self.back_track(deep+1, cost+time) self.user_distributed[i] = 0 # 將演算法執行結果存入檔案中 def write_into_file(self): file = open(self.output_file, 'a') file.write('最優解消耗總時間為:' + str(self.min_cost) + '\n') for i in range(self.n): file.write('第' + str(i+1) + '位工人完成第' + str(self.user_work[i]) + '份工作\n') # 演算法啟動 # input_file = 'input_assign04_01.dat' # input_file = 'input_assign04_02.dat' input_file = 'input_assign04_03.dat' # output_file = 'output_01.dat' # output_file = 'output_02.dat' output_file = 'output_03.dat' worker = Worker(input_file,output_file) worker.back_track(0, 0) print(worker.min_cost) print(worker.user_work) worker.write_into_file()
測試結果:
輸入》》》
10,12,20,30,18 23,30,8,12,22 11,21,23,40,16 33,34,23,19,20 21,32,11,14,21
輸出》》》
最優解消耗總時間為:65 第1位工人完成第3份工作 第2位工人完成第1份工作 第3位工人完成第2份工作 第4位工人完成第5份工作 第5位工人完成第4份工作
本演算法是基於窮舉解決該問題的,之後對該回朔演算法做了剪枝優化,文章連結如下:
http://blog.csdn.net/liangxun0712/article/details/70808210