匈牙利算法--任务分配
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]
好记性不如烂键盘---点滴、积累、进步!