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轮次所有节点值为最优值 (这个算法肯定经过严格的数学推理验证和精心设计,不像是随手写出来的...大神的脑路果然不一样)
本文来自博客园,作者:夜半风起,转载请注明原文链接:https://www.cnblogs.com/yebanfengqi/p/16166585.html