找一个列表中最小的多个值所在索引并返回筛选后的列表

作业调度实现中想贪心算法缩减可能解范围时做的尝试:

主要遇到重复数字头大,解决是返回索引后赋予一个极大值,然后再次遍历。

# coding:utf-8
# 实现人力物力的调度分配
# 假定A需要2P,B需要3P,C需要2P,一共需要7P,一共有30P
import copy

P_all_num = 30
P_need_num = 21
data_length = [
    # 每个人与这25P间距
    [8, 6, 4, 5, 3, 2, 5, 6, 8, 9, 8, 3, 12, 14, 15, 5, 4, 17, 15, 19, 22, 4, 7, 15, 18, 11, 4, 7, 3, 6],
    [3, 7, 3, 11, 12, 15, 16, 7, 9, 8, 6, 4, 21, 5, 4, 3, 12, 13, 14, 6, 6, 9, 9, 12, 20, 3, 9, 9, 9, 11],
    [11, 13, 4, 5, 6, 17, 18, 19, 22, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 5, 7, 8, 14, 15, 19, 15, 5, 7, 9, 12]
]
# 贪心算法缩小解的范围
data_copy = copy.deepcopy(data_length)
index_need = []
INF = 99999
for data in data_copy:
    for index in range(P_need_num):
        k = data.index(min(data))
        index_need.append(k)
        data[k] = INF
# 去重
index_set = set(index_need)
index_list = list(index_set)
index_list.sort()
index_list.reverse()
for data in data_length:
    for index in range(len(data)):
        if index not in index_list:
            data.pop(data[index])
# 23,24 +1列均不满足在要求范围内
print(data_length)

结果很理想,去掉了两列。 

[[8, 6, 4, 5, 3, 2, 5, 6, 8, 9, 8, 12, 14, 15, 4, 17, 15, 19, 22, 4, 7, 15, 18, 11, 4, 7, 3, 6], 
[3, 7, 3, 12, 15, 16, 7, 9, 8, 6, 4, 5, 4, 3, 12, 13, 14, 6, 6, 9, 9, 12, 20, 3, 9, 9, 9, 11], 
[11, 13, 4, 5, 6, 17, 18, 19, 22, 4, 3, 5, 6, 7, 8, 11, 12, 5, 7, 8, 14, 15, 19, 15, 5, 7, 9, 12]]

猜你喜欢

转载自blog.csdn.net/qq_40801709/article/details/100084395