【最优化-分配问题】栈及递归应用实现穷举法

 

前言

最近有小伙伴来询问我任务分配问题的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])

 


动态解释

关于本方法实现的原理,可以参考代码单步调试的视频,观察两个堆栈的变化就可以明白这个蛮力法啦~

传送门:

https://www.bilibili.com/video/BV1eK4y1L7UU/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值