Step1:Column Reduction 列约化
(这个代码是有问题的,它是来自于Jonker-Volgenant论文里面Pascal语言代码)
逆序获得每列的最小值,储存在v数组中,初始u数组全部置0。x、y数组分别储存的是已分配的行列。比如:第四列最小值5,位置是(2,4),所以x矩阵第二个储存4,y矩阵第四个储存x,即x[2]=4,y[4]=2。如此逐一匹配,又因为第一列的最小值位置重复出现在第二行,所以导致第四列匹配作废,所以只剩下位置被指派。(其实按照Jonker-Volgenant原文的理解,指派的位置应该还是,虽然这里并不是很重要。-updated 2022/4/11这句个人理解有可能是错的,读者自己去理解一下)
此时:x=[0 1 3 2],y=[2 4 3 0]。
总结,此操作主要是:尽量给每列都指派给最小行元素,某些行可能未分配。
Step2:Reduction Transfer 约化转移
从未指派行中到指派行进行转移。
指派的行有2、3、4行。比如在第二行时,i=2,,μ=min(除去该行指派的列之外该行c和对应的v之差)(就是指除去0以外最小的差值),,(图中有误),再比如在第三行,μ=4,
Step3 Augment Reduction of Unassigned Row 未指派行约化增广(含拍卖思想)
从未指派的行(第一行)开始,选择更新后的μ(除去该行指派的列之外该行c和对应的v之差,此时初始无指派行,所以不需要排除)的最小值,选出最小值后对应的也确定了;在除去后更新最小值,第一次最小值记为,第二次记为。例子中。
更新后的x=[2 1 3 0],y=[2 1 3 0]。
直到出现n维的μ有相等的值或者r=0时停止
第二次循环
其中
更新后的x=[2 0 3 1],y=[4 1 3 0]
第三次循环
其中
stop
后面的增广(基于Dijkstra算法的最短路径增广)和对偶解更新不讲了,很简单,可以参考我的另一个blog。
笔者不是数学专业出身,在这之前对这部分知识完全不懂。如果有什么问题可以在评论区交流