LAPJV算法详解(ed

Step1:Column Reduction 列约化

(这个代码是有问题的,它是来自于Jonker-Volgenant论文里面Pascal语言代码)

         逆序获得每列的最小值,储存在v数组中,初始u数组全部置0。x、y数组分别储存的是已分配的行列。比如:第四列最小值5,位置是(2,4),所以x矩阵第二个储存4,y矩阵第四个储存x,即x[2]=4,y[4]=2。如此逐一匹配x_{24},x_{33},x_{42},x_{21},又因为第一列的最小值位置重复出现在第二行,所以导致第四列匹配x_{24}作废,所以只剩下x_{33},x_{42},x_{21}位置被指派。(其实按照Jonker-Volgenant原文的理解,指派的位置应该还是x_{24},x_{33},x_{42},虽然这里x并不是很重要。-updated 2022/4/11这句个人理解有可能是错的,读者自己去理解一下)

此时:x=[0 1 3 2],y=[2 4 3 0]。

         总结,此操作主要是:尽量给每列都指派给最小行元素,某些行可能未分配。

Step2:Reduction Transfer 约化转移

         

从未指派行中到指派行进行转移。

 指派的行有2、3、4行。比如在第二行时,i=2,j_1=x_2=1,μ=min(除去该行指派的列之外该行c和对应的v之差)(就是指除去0以外最小的差值),v_1=v_1-(\mu-u_i)=2-(0-0)=2u_2=\mu=0(图中有误),再比如在第三行j_1=x_3=3,μ=4,v_3=v_3-(\mu-u_i)=3-(4-0)=-1

Step3 Augment Reduction of Unassigned Row  未指派行约化增广(含拍卖思想)

从未指派的行(第一行)开始,选择更新后的μ(除去该行指派的列之外该行c和对应的v之差,此时初始无指派行,所以不需要排除j_1)的最小值,选出最小值后对应的j_1也确定了;在除去j_1后更新最小值,第一次最小值记为k_1,第二次记为k_2。例子中k_1=1,j_1=2;k_2=2,j_2=4

\\k_1<k_2 \,so that\, v_2=v_2-(k_2-k_1)=4-(2-1)=3 \\r=y_2=4 \\ r>0\,so that\, x_4=0,x_1=2,y_2=1,\textbf{i=4}

更新后的x=[2 1 3 0],y=[2 1 3 0]。

直到出现n维的μ有相等的值或者r=0时停止

第二次循环

其中k_1=0,j_1=1;k_2=1,j_2=2

r=y_1=2,x_2=0,x_4=1,y_1=4,i=2

更新后的x=[2 0 3 1],y=[4 1 3 0]

第三次循环

其中k_1=0,j_1=4;k_2=1,j_2=1

r=y_4=0 stop

后面的增广(基于Dijkstra算法的最短路径增广)和对偶解更新不讲了,很简单,可以参考我的另一个blog。

笔者不是数学专业出身,在这之前对这部分知识完全不懂。如果有什么问题可以在评论区交流

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值