Hungarian method (匈牙利算法)----解决指派问题(转)

Hungarian method (匈牙利算法)----解决指派问题(转)<?xml version="1.0" encoding="UTF-8"?>
---匈牙利解法是求解指派问题的一种新颖而又简便的解法。

---指派问题的最优解有这样一个性质,若从系数矩阵的一行(列)各元素中分别减去该行(列)的最小元素,得到新矩阵,那么以新矩阵为系数矩阵求得的最优解和用原矩阵求得的最优解相同.利用这个性质,可使原系数矩阵变换为含有很多0元素的新矩阵,而最优解保持不变.

---具体操作为第一步:使指派问题的系数矩阵经变换,在各行各列中都出现0元素.(1)从系数矩阵的每行元素减去该行的最小元素;(2)再从所得系数矩阵的每列元素中减去该列的最小元素.第二步:进行试指派.若此时得到的mPn,应回到第一步,重新对系数矩阵进行变换。但要把第一步的过程改为(1)从系数矩阵的每列元素减去该列的最小元素;(2)再从所得系数矩阵的每行元素中减去该行的最小元素.这样做就使得新矩阵的0元素比较多些.再进入第二步进行试指派就可以得到最优解.

---匈牙利解法的示例
   
   Image:匈牙利解法例题.jpg

  步骤一:将这系数矩阵进行变换,使各行各列都出现0元素.从系数矩阵的每行元素减去该行的最小元素即得每行每列都有有0元素的系数矩阵.

  \begin{bmatrix}12 &amp; 7 &amp; 9 &amp; 7 &amp; 9 \\8 &amp; 9 &amp; 6 &amp; 6 &amp; 6 \\7 &amp; 17 &amp; 12 &amp; 14 &amp; 9 \\ 15 &amp; 14 &amp; 6 &amp; 6 &amp; 10 \\ 4 &amp; 10 &amp; 7 &amp; 10 &amp; 0 \end{bmatrix}-------------------------------- 271441117351766.png

  步骤二:进行试指派,找出独立的0元素.独立0元素用Θ表示,其它0用Φ表示得到

  \begin{bmatrix}5 &amp; \Theta &amp; 2 &amp; \Phi &amp; 2 \\2 &amp; 3 &amp; \Phi &amp; \Theta &amp; \Phi \\ \Theta &amp; 10 &amp; 5 &amp; 7 &amp; 2 \\ 9 &amp; 8 &amp; \Theta &amp; \Phi &amp; 4 \\ \Phi &amp; 6 &amp; 3 &amp; 6 &amp; 5 \end{bmatrix}……(1)

  这里Θ的个数m=4,而n=5;问题没有得到求解,运用步骤三继续求解.

  步骤三:作最少的直线覆盖所有的0元素,以确定该系数矩阵中能找到最多的独立元素数.为此按以下步骤进行.

  (1)对没有Θ的行打√号:;

  (2)对已打√号的行中所含0元素的列打√号;

  (3)再对所有打√号的列中的含有@元素的行打√号;

  (4)重复2、3直到得不出新的打√号的行列为止.

  (5)对没有打√号的行画一横线,有打√号的列画一纵线,这就得到覆盖所有0元素的最少直线数.

  令直线数为l.若l < n,说明必须再变换当前的系数矩阵,才能找到n个独立的0元素,为此转换步骤四;若l = n,而m < n,应回到步骤二,另行试探.

  在此例中,对矩阵(1)按以下次序进行:

  先在第五行旁打√,接着可判断应在第一列下打√,接着在第3行旁打√,经检查不能再打√了.对没有打√行画一直线以覆盖0元素,对打√的列画一直线以覆盖0元素,得:

  Image:匈牙利解法步骤2.jpg……(2)

  由此可见l = 4 < n.所以应继续对(2)矩阵进行变换转步骤四.

  步骤四:对(2)矩阵进行变换的目的是增加0元素.

  为此在没有被直线覆盖的部分中找出最小元素.然后在打√行各元素中都减去这个最小元素,而在打√列的各元素上都加上这个最小元素,以保证原来0元素不变.这样得到新系数矩阵(它的最优解和原问题相同).若得到n个独立的0元素,则已得最优解,否则回到步骤三重复进行.

  在矩阵(2)中,在没有被覆盖部分(第3、5行)中找到最小元素为2,然后在第3、5行各元素分别减去2。给第l列各元素加2,得到新矩阵(3)

  \begin{bmatrix}7 &amp; 0 &amp; 2 &amp; 0 &amp; 2 \\4 &amp; 3 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 8 &amp; 3 &amp; 5 &amp; 0 \\ 11 &amp; 8 &amp; 0 &amp; 0 &amp; 4 \\ 0 &amp; 4 &amp; 1 &amp; 4 &amp; 3 \end{bmatrix}……(3)

  按步骤二,找出所有的独立0元素。得到矩阵(4)

  \begin{bmatrix}7 &amp; \Theta &amp; 2 &amp; \Phi &amp; 2 \\4 &amp; 3 &amp; \Phi &amp; \Theta &amp; \Phi \\ \Phi &amp; 8 &amp; 3 &amp; 5 &amp; \Theta \\ 11 &amp; 8 &amp; \Theta &amp; \Phi &amp; 4 \\ \Theta &amp; 4 &amp; 1 &amp; 4 &amp; 3 \end{bmatrix}……(4)

  它具有n个独立0元素.这就得到了最优解,相应解矩阵为

  \begin{bmatrix}0 &amp; 1 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 \\ 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 \\ 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \end{bmatrix}

  由解矩阵得最优指派方案:

  甲——B,乙——D,丙——E,丁——C,戊——A

  所需总时间为minz=32.





转载于:https://www.cnblogs.com/ZhangJinkun/p/91cb2cb67486f04970ffe6683c7a0e72.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
匈牙利算法是一种关于指派问题的求解方法,通过修改效益矩阵的行或列,使得每一行或列中至少有一个零元素,从而得到与这些零元素相对应的一个完全分配方案。在使用Matlab求解匈牙利算法时,可以使用线性规划函数linprog或使用专门的匈牙利算法函数Hungarian进行求解。 使用linprog函数求解匈牙利算法时,需要将效益矩阵化为目标函数系数,设置等式约束的系数矩阵和约束的右端项,并指定决策变量的下界和上界。通过调用linprog函数即可得到最优解矩阵和最优值。 另外,也可以使用专门的匈牙利算法函数Hungarian进行求解。该函数接受效益矩阵作为输入,并返回最优解矩阵和最优值。 以下是使用Matlab求解匈牙利算法的示例代码: code1: clear all C=[2 15 13 4;10 4 14 15;9 14 16 13;7 8 11 9]; n=size(C,1);%计算C的行列数n C=C(:);%计算目标函数系数,将矩阵C按列排成一个列向量即可。 A=[];B=[];%没有不等式约束 Ae=zeros(2*n,n^2);%计算等约束的系数矩阵a for i=1:n for j=(i-1)*n+1:n*i Ae(i,j)=1; end for k=i:n:n^2 Ae(n+i,k)=1; end end Be=ones(2*n,1);%等式约束右端项b Xm=zeros(n^2,1);%决策变量下界Xm XM=ones(n^2,1);%决策变量上界XM [x,z]=linprog(C,A,B,Ae,Be,Xm,XM);%使用linprog求解 x=reshape(x,n,n);%将列向量x按列排成一个n阶方阵 disp('最优解矩阵为:');%输出指派方案和最优值 Assignment=round(x)%使用round进行四舍五入取整 disp('最优解为:'); z code2: clear all C=[2 15 13 4;10 4 14 15;9 14 16 13;7 8 11 9];<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于匈牙利算法指派问题优化分析【matlab优化算法十二】](https://blog.csdn.net/weixin_46567845/article/details/118196872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [指派问题匈牙利解法以及matlab代码](https://blog.csdn.net/qq_35608277/article/details/83895785)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值