栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python实现基于贪婪算法的多技能工人任务分配问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python实现基于贪婪算法的多技能工人任务分配问题

文章目录
  • 前言
  • 总结


前言

一个比较复杂的多技能工人多任务分配问题,采用贪婪算法进行分配,以最低成本为目标,逻辑有点复杂,但是考虑到了各种情况,其中w1为工人1,列表表示工人具备s1,s3,s4技能,采用s1技能需要支付佣金为1,采用s3支付佣金为1.2,采用s4采用佣金为1.1,最多可同一任务使用两个技能,任务距离为7,以次类推。
T = [‘s1’,‘s2’,‘s3’,‘s4’,‘s5’]
T_num = [2, 3, 3, 2, 2]
这两个分别表示目标任务需要的技能T及其对应的数量T_num。本文实现的是单任务目标的贪婪算法实现,需要的话细致推理即可。

T =     ['s1','s2','s3','s4','s5']
T_num = [2,     3,   3,   2,   2]
budget = 15

w1 = [[("s1",1),   ("s3", 1.2), ("s4", 1.1)],           2, 7]
w2 = [[("s2",1.3), ("s4",1.2),  ("s5",1.1)],            2, 11]
w3 = [[("s2",1.3), ("s3",1.3),  ("s4",1.2),  ("s5",1)], 3, 7]
w4 = [[("s1",1.1), ("s2",1.3),  ("s3", 1.1)],           2,11]
w5 = [[("s3",1.3), ("s5",1.4)],                         2, 7]
w6 = [[("s1",1), ("s2",1.2),  ("s4",1.3)],              1, 8]
w7 = [[("s4",1.3), ("s5",1.3)],                         2, 8]
w8 = [[("s3",1.3), ("s4",1.2)],                         2, 8]
w9 = [[("s3",1.3), ("s4",1.2),  ("s5",1)],              3,7.5]
w10 = [[("s1",1.1), ("s2",1.2),  ("s4",1.3),  ("s5",1.1)], 3, 7.5]
W = [w1, w2, w3, w4, w5, w6, w7, w8, w9, w10]
#计算工人对应技能成本
cost_w = []
s_w = []
for i in range(len(W)):
    cost_w.append([])
    s_w.append([])
    for j in range(len(W[i][0])):
        cost_w[i].append(W[i][0][j][1] + W[i][-1]*0.01)
        s_w[i].append(W[i][0][j][0])
print(cost_w)
print(s_w)

tech_num = []
for i in W:
    tech_num.append(i[-2])
print(tech_num)
#各技能最小值与对应技能
min_w_list = []
w_s_list = []
#工人采用技能初始化
workers = []
for i in range(len(cost_w)):
    #工人成本最低技能
    min_w = min(cost_w[i])
    #对应技能索引
    w_s = s_w[i][cost_w[i].index(min_w)]
    min_w_list.append(min_w)
    w_s_list.append(w_s)
    workers.append(0)
print(min_w_list)
print(w_s_list)
print(workers)
T_taget = 0
for i in T_num:
    T_taget += i
#最优选择
Topt = []
#计算可选用数量
zxxx = 0
for i in tech_num:
    zxxx += i
while zxxx>0 and T_taget>0:
    print("循环条件:",zxxx,T_taget)
    #选择最小成本技能
    min_choose = min(min_w_list)
    #最小成本技能索引(对应工人)
    index_c = min_w_list.index(min_choose)
    #工人对应技能
    cost_c = w_s_list[min_w_list.index(min_choose)]
    #选择条件
    print("选择条件:",T_num[T.index(cost_c)], tech_num[index_c])

    #有目标技能需求
    if T_num[T.index(cost_c)] > 0 :
        #对应工人可以进行工作
        if tech_num[index_c] > 0:
            workers[index_c] += 1
            W[index_c][-2] -= 1
            Topt.append((index_c, cost_c))
            #更改数量
            T_num[T.index(cost_c)] -= 1
            tech_num[index_c] -= 1
            #删除该数据
            ddd = s_w[index_c].index(cost_c)
            s_w[index_c].pop(ddd)
            dxx = cost_w[index_c].pop(ddd)
            print(T_num)
            T_taget = 0
            for i in T_num:
                T_taget += i
            if T_taget == 0:
                print("成功分配任务")
                print("任务分配为:",Topt)
                break
            zxxx = 0
            for i in tech_num:
                zxxx += i
        else:
            cost_w.pop(index_c)
            s_w.pop(index_c)
    #没有对应技能需求
    else:
        for i in range(len(cost_w)):
            if cost_c in s_w[i]:
                ddd = s_w[i].index(cost_c)
                s_w[i].pop(ddd)
                cost_w[i].pop(ddd)


    # 各技能最小值与对应技能
    c_num = 0
    for i in range(len(cost_w)):
        c_num += len(cost_w[i])
    print(c_num)
    if c_num == 0:
        print("无工人可用了")
        print(Topt)
        break
    else:
        min_w_list = []
        w_s_list = []
        print(cost_w)
        for i in range(len(cost_w)):
            # 工人成本最低技能
            if cost_w[i] == []:
                min_w = 10000
                w_s = 's'
            else:
                min_w = min(cost_w[i])
                w_s = s_w[i][cost_w[i].index(min_w)]
            # 对应技能索引
            min_w_list.append(min_w)
            w_s_list.append(w_s)
        print(min_w_list)
        print(w_s_list)

总结

没啥总结的,如果要点个关注也行哈哈哈

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648535.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号