用匈牙利方法进行指派 试指派独立元素个数 != 最小能覆盖所有零元素的直线集合个数

GKatHere 2012-06-22 05:45:20
用匈牙利方法进行指派中,试指派独立元素个数 !=(总是小于) 最小能覆盖所有零元素的直线集合个数
这种情况是出错了吗?请教一下怎样解决

/*
引用方法:
匈牙利算法的主要步骤为:
第一步:变换指派问题的效率矩阵C,使在各行各列都出现零元素,得到新的效率矩阵B = (bij)nn。
(1) 从系数矩阵的每行元素减去该行的最小元素;
(2) 再从所得系数矩阵的每列减去该列的最小元素。
第二步:进行试指派。
(1) 检查B的每行、每列,从中找出“0”元素最少的一排(行或列)。从这排中圈出一个“0”元素(如果该排存在多个“0”元素,则任圈一个),用“”表示,然后划去“”所在的行和列。在剩下的子矩阵中重复上述过程,直至剩下的子矩阵中没有“0”元素为止,得到的矩阵记为D。将D中“”所在的位置赋值“1”,其余位置赋值“0”,得到0—1矩阵E;
(2) 如果E中含有n个元素“1”(它们一定既不在同一行也不在同一列上),则矩阵E就是原指派问题的最优解矩阵,算法停止;否则,继续第三步。
第三步:作最小能覆盖所有零元素的直线集合。为此,按如下步骤对矩阵D进行操作:
(1) 对没有“”的行打 号;
(2) 对已打 号的行上的所有“0”元素所在的列打 号;
(3) 再对已打 号的列上有“”的行打 号;
(4) 重复 (2),(3) 直到得不出新的打 号的行列为止;
对没有打 号的行划横线,所有打 号的列划纵线,这就是能覆盖所有零元素的最小直线集合。
第四步:进行调整。
在没有被直线覆盖的部分元素中找出最小元素,对没有画直线的行的各元素都减去这最小元素。对已画直线的列的各元素都加上这最小元素,得到的新的效率矩阵仍记为B。转第二步。
*/
...全文
1715 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
丈八涯 2012-06-23
  • 打赏
  • 举报
回复
⑴ 匈牙利算法步骤

① 矩阵规约.
遍历矩阵的行,求得各行的最小值,并对各行上的所有元素减去其最小值.
遍历矩阵的列,求得各列的最小值,并对各列上的所有元素减去其最小值.

② 统计各行列0元素个数
遍历各个行和列的元素,统计出各行和列的0元素个数.

③ 标记0操作.
遍历矩阵的行,找到只含一个0元素的行,将该0元素"画圆".
再遍历该0元素所在的列,将该列上的0元素"画撇".
遍历矩阵的列,找到只含一个0元素的列("画撇"的0元素不看作自由0元素).
再遍历该0元素所在的行,将该行上的0元素"画撇"

④ 如果"画圆"0的个数等于矩阵维数,则输出结果.即调用7.
如果还存在自由0元素,则调用7.
如果不存在自由0元素,且"画圆"0的个数少于矩阵维数,则调用5.

⑤ 用最少直线覆盖.
a.对没有"画圆"0元素的行打√号.
b.对已打√号的行中所有含"画撇"0元素的列打√号.
C.对打√号列上有"画圆"0元素的行打√号.
d.重复(b)(c)直到得不出新的打√号的行列为止.
e.打√号的列画纵线,没打√号的行画横线.
这就是覆盖所有0元素的最少直线集合.

⑥ 增加(转移)0元素.
a.求出未被直线覆盖的元素中的最小值k.
b.对打√行减去k,对打√列加上k
c. 转到第2步骤.

⑦ 剩余自由0元素处理
a.取存在自由0元素的行中的第一行(也可以取自由0元素最少的行)
b.遍历a中所选行,依次取该行中的自由0元素.
执行:
c.对该自由0元素进行画圆操作.
d.将该元素所在行列的其它自由0元素画撇
e.执行标记0操作,即调用③.
f.执行④进行转换.

⑧ 结果输出
按照"画圆"0元素的位置,纪录结果.

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧