Fork me on GitHub

Floyd弗洛伊德算法最优值准确性证明

弗洛伊德算法

若起始点i,终点j 中间节点k,m
len(i,j)=min{len(i,j);len(i,k)+len(k,j)}
若中间节点出现路径依赖,以k为前置节点更新数据时如何保证已更新节点数据的有效性,乱序更新是否会导致部分节点最优值更新遗漏??

以下可能出现依赖节点更新乱序的场景(依赖节点正序更新(每次子路径都是最优值,最终一定是最优值,)没有问题,不做讨论)
场景一:
    依赖节点正序更新,每次子路径都是最优值(即:中间节点路径最优值后续都不会再更新),最长路径一定是最优值,
        (单行更新时:局部最优到整体最优的适用场景,所有子节点局部最优最终保证整体最优),此场景没问题;此处不做讨论,
         主要讨论下面两种场景:此写法局部一定最优?或者如何保证局部最优从而如何保证最终最优?
场景二:
    若存在路径:i->...->m->...->k->...->j   执行步骤1:当前路径  通过k为中间节点将j变更为新值, 其m值为旧值 (m下标索引>j下标索引)    
             : i->k->m 中间的某一点路径     执行步骤2 :通过k为中间节点将m值更为新值 (通过k更新k权值为0构无效环,直接忽略)会不会导致j先于m执行时j的最短权值出错???
             
                                        => 若k可以修改m值,则m必定不是j中某一段的最短路径,因为步骤1中,
                                           因为路径会变成为 i->...->k->m->k->...->j 中间会形成一个有效环(相当于绕了一圈又回到k) 不会比(i->...->k->...->j)(不绕圈)小 故步骤1的更新依然有效 
             故;此场景能保证k之前更新过节点的数据准确性
场景三:         
    若存在路径:i->...->m->j 当前路径(不包含k), 执行步骤1 通过k为中间点无法更新j
             : i->...->k->m 中间的某一点路径    执行步骤2:通过k为中间点将m值更新为新有效值       此时:会不会导致j当前轮最优值出错?若k可以修改m值,
                                            此时变成 i->k->m->j 此时如何保证j变成准确值 ?
                                                此时变成两种情况
                                                    1.k优先m加入中间节点:k到j节点不可达;此时k更新 ...->k->...->m;再次执行m为中间节点时将会保证j准确值   此场景没问题

                                                    2.m优先k加入中间节点:当执行m时,m更新j,即:i->...->m->j (k目前还不在中间节点中)
                                                        ,若等到k为中间节点时,此时状态: (m先于k) i->...->k->m->j;
                                                        m变了,会不会影响j当前存储的最优值?会不会更新j(原值已失效)?
                                                        =>    若存在此情况 说明k是m的前置节点,m是j的前置节点,故说明 k通过m可以到达j; 又因为m先于k加入中间节点,故m节点作为中间节点便是k->j当前最优路径(因为新加入的k不可能修改k->j的路径,因为k会形成环路),
                                                            则:    i->...->k->m->j 路径中,i->....->k 为当前k轮最优路径  k->...->m->j 为上一轮的最优路径
                                                                故此时 更新i->...->k->...->j 一定会通过k更新为截至当前轮的最优值,且m值的变化不会影响j节点
                                                                                                                                                        
综上:通过最外层k值循环能保证截至k轮次所有节点值为最优值 (这个算法肯定经过严格的数学推理验证和精心设计,不像是随手写出来的...大神的脑路果然不一样
 

 

posted @ 2022-04-19 18:10  夜半风起  阅读(217)  评论(0编辑  收藏  举报