前言
最近有小伙伴来询问我任务分配问题的python代码,故此分享在这篇blog里,如有意见欢迎指正
代码
# 任务分配
# 蛮力法
def _sortwork(valuesquare, n, orderlist, currentn, sortsquare, finallist, sortlist=None):
global inivalue # 比较每种组合的值的暂态列表
if currentn == n: # 初始时构建空列表,栈类型
sortlist = []
for i in range(currentn): # 按人逐个分配任务
sortlist.append(orderlist[i]) # 取出该行的对应位置任务
temporder = orderlist.copy() # 取出此时的所有任务
temporder.pop(i) # 去除已经被挑选的任务
if currentn == 1: # 当任务只剩一个时
tempsortlist = sortlist.copy() # 注意变量实质是指针,复制不可以用=相连,会变成等价
tempvalue = 0 # 求当前任务派遣顺序的value和
for k in range(len(tempsortlist)):
tempvalue += valuesquare[k][tempsortlist[k]-1]
if tempvalue < inivalue: # 当发现较小value时
inivalue = tempvalue # 更新当前最小值
finallist.append(tempsortlist) # 把该较小值放到final列表,实质是更新final列表
sortsquare.append(tempsortlist) # 该步用于实现所有排序的存储,是附带的,可以略去
sortlist.pop(n-1) # 该次分配结束,排序列表需要出栈一个
else:
_sortwork(valuesquare, n, temporder, currentn-1, sortsquare, finallist, sortlist) # 递归
sortlist.pop(len(sortlist)-1) # 递归每次完成一层都需要出栈当前排序
a = int(input()) # 矩阵大小
b = [] # 矩阵
for ii in range(a):
c = input()
b.append([int(x) for x in c.split(' ')])
# print(b)
d = [int(y)+1 for y in range(a)] # 顺序任务编号
sw = [] # 存储所有排序
res = [] # 存储较小排序
initialvalue = [] # 当前较小值/冗余,可以略过
initialvalue.append(10000)
inivalue = 10000 # 当前较小值初始化
_sortwork(b, a, d, a, sw, res)
# print(sw)
print('optional programming:')
print('cost:')
print(inivalue)
print('order:')
# print(initialvalue[0])
print(res[len(res)-1])
动态解释
关于本方法实现的原理,可以参考代码单步调试的视频,观察两个堆栈的变化就可以明白这个蛮力法啦~
传送门: