分配问题与匈牙利法

分配问题:
已知成本矩阵,求最优分配方案。
成本矩阵:行列分别为worker和task,元素值为对应worker完成对应task的开销。
现只研究task数=worker数,且每个任务能且只能分配给一个人的情况。也就是说有效的方案的成本总和是从成本矩阵中取出n个既不同行又不同列的元素求和得到的。
解决算法:
1、蛮力:穷举法。对于n*n矩阵,要计算n!个成本值,时间复杂度O(n!)
2、匈牙利法:
方法步骤:
1、将成本矩阵的每行(列)减去该行(列)最小的元素;
2、用最少的划线覆盖成本矩阵中的所有零;
3、检查是否:最少划线数=矩阵行(列)数,若相等则完成,最优方案是当前的一个全零的成本组合;若小于行列数,则进行步骤4;
4、检查此时没有被划线覆盖的元素,其中最小值设为min,将没有被覆盖的每行减去min,被覆盖的每列加上min(注意这里的行或列并不因成本矩阵而异,且这里的行和列可以交换,得到的成本矩阵完全一样),再跳转至步骤3

原理、可行性分析:
1、如果从成本矩阵的任一行或列的所有元素中同时添加或减去数字,那么,所得矩阵的最优分配也是原始矩阵的最优分配。
这一原理很好理解:
对于同一任务,若对每个worker同等程度地降低难度(且这个降低程度不会使得某一worker完成的成本低于0),则使用穷举法计算总成本时,相当于每个方案同时减掉了一个值,显然对结果的排序没有影响。同理,对同一个人,若将其完成每个任务的成本同时降低一个值,也是相当于每个方案同时减掉了一个值,也是不会影响结果的。
为什么是相当于每个方案同时减掉一个值呢:因为一个人应该且只应该被分配一个任务,也就是说每个方案里,对每个人取且只取他的完成某一个任务的成本值,对一个任务也是取且只取它被某一个worker完成的成本值,那么所有行/列的成本值的同时加减肯定就是对每个方案的结果产生相同程度的影响啦。
但其实这个原理只是对匈牙利法的第一步的一个解释。
2、而对第4步,其实可以看出,这样操作之后是将未被划线覆盖的元素减去min,被一条线覆盖的元素值不变,处于被两条线覆盖的交点处的元素加min,这样做的意义在于:处于线覆盖交点处的元素是:虽然成本低,应优先分配这一方案,但由于1v1的分配要求,不能对同一人或同一任务多次分配,所以要酌情把交点处的值补偿回来。(是这样的吧?过几天再想想)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值