1. 程式人生 > >Python3 回朔法完成作業分配

Python3 回朔法完成作業分配

學號: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