匈牙利算法--任务分配

https://blog.csdn.net/ljjjjjjjjjjj/article/details/123261360

例如有3个任务ABC,要分配给甲乙丙三人分别去完成,每个人完成3个任务所耗费精力不同(因为每个人特长不同),此处也叫完成任务耗费的代价,合理分配任务,可以达到总效率最高的目标。

此时若想达到耗费总精力最小,可以用穷举法一个个试,一共有6种组合,分别是:

1:甲A,乙B,丙C 7+6+4=17

2:甲A,乙C,丙B 7+5+3=15

3:甲B,乙A,丙C 2+1+4=7

4:甲B,乙C,丙A 2+5+4=11

5:甲C,乙A,丙B 4+1+3=8

6:甲C,乙B,丙A 4+6+4=14

所以方案3最符合需求
对于任务数和执行者数目较少时,用穷举法尚可,但是若任务数很大时,穷举数目也将以n!的形势增加,匈牙利算法的提出就是为了优化这个问题。

6个人,有4个任务,需要得到消耗最小的任务分配方式,linear_sum_assignment的返回值,
row_ind=[0 2 4 5]代表0,2,4,5号人去干活,分别干col_ind=[2 3 1 0],任务2,3,1,0

import numpy as np
from numpy import random
from scipy.optimize import linear_sum_assignment

# 这个叫随机种子数,它一旦固定,则后续结果都是可以复现的。
rd = random.RandomState(20240307)
task_matrix = rd.randint(0, 100, size=(6, 4))
print('task_matrix =\n', task_matrix)
row_ind, col_ind = linear_sum_assignment(task_matrix)  # 线性和分配问题   匈牙利算法函数包,直接输入task_matrix即可返回每行对应最小的列
min_cost = task_matrix[row_ind, col_ind].sum()
best_solution = list(task_matrix[row_ind, col_ind])
print(f"row_ind={row_ind}\ncol_ind={col_ind}")
print('min_cost =', min_cost)
print('best_solution =', best_solution)

输出:

task_matrix =
 [[ 5  7 13 48]
 [67 27 83 24]
 [61 96 84  6]
 [23 58 49 57]
 [19 25 52 84]
 [ 6 37 91 31]]
row_ind=[0 2 4 5]
col_ind=[2 3 1 0]
min_cost = 50
best_solution = [13, 6, 25, 6]
posted @ 2024-03-08 16:08  无左无右  阅读(52)  评论(0编辑  收藏  举报