引言:单源最短路径问题,是算法问题里面最最常提到的一问题,今天我们我们讲解的是通过分支限界法来求解单源最短路径问题,本文主要讲解求解思想,具体实现代码,之后补充;
一:什么是分支限界法
分支限界法和我们之前讲的回溯法有一定相似的地方,他们都是在问题的解空间中搜索我们的解,和回溯法有所不同的是,
1:分支限界法采用的广度优先遍历或者以最小消耗优先的方式搜素解空间,而回溯法则是以深度优先策略搜索解空间;
2:回溯法求解目标是要所有出问题的所有解,而分支限界法则是找出满足约束条件的一个解或者,满足某一约束条件的最优解;
3:他们对当前节点所采用的扩展方式页不同;分支限界法每一个活节点只有一次成为扩展节点的机会;活节点一旦成为扩展节点,就一次性产生所有儿子节点;在这些儿子结点中,导致不可行的或者非最优解的儿子节点都会被舍弃,其余儿子节点被加入到活节点表中而回溯法按照深度优先策略,每次只从儿子结点中选择一个最好的;
从活节点表中选择扩展节点的方式不同又将其分为:
A:队列式(FIFO)分支限界法
B:优先队列式分支限界法
根据具体情况选择最大优先队列还是最小优先队列;
二:例题:
如下图:
求从节点S到节点t的最短路径长度;
1:使用队列式分支限界法求解:
a:当前扩展节点S生成全部儿子节点{a,b,c}入堆;按照队列先进先出原则;
b:节点a称为当前扩展节点生成{b,c,d,e};
c:节点b称为当前扩展节点生成{c,d,e,f};
d:节点c成为当前扩展节点此时{d,e,f}
e:节点d成为当前扩展节点此时{e,f,g,h}
f:节点e称为当前节点扩展节点{f,g,h}
j:节点f成为当前节点扩展节点{g,h,i}
h:节点g成为当前节点扩展节点节点t当前路径为:s-a-d-g-t(长度为13}此时活节点{h,i}
i:节点h路径为:{s-a-e-h-t}路径长度为:10;
g:节点扩展:{s-b-f-i-t}路径长度为:8;
综上所述:最短路径长度为:8路线为:{s-b-f-i-t}
2:我们使用优先队列式的分支限界法
a:当前扩展节点S生成全部儿子节点{a,b,c}入堆;按照最小队列原则;
b:节点a称为当前扩展节点生成{b,c,d,e};
c:节点b称为当前扩展节点生成{c,d,e,f};
d:节点c成为当前扩展节点此时{d,e,f}
e:节点e成为当前扩展节点此时{d,f,h}
f:节点f称为当前节点扩展节点{d,h,i}
j:节点i成为当前节点扩展节点{d,h,t}
此时已经到达t点了最终得出一条路径为:(s-b-f-i-t)路径长度为8;
或者{s-a-e-f-i-t}长度也是8;
综上所述:最短路径长度为:8路线为:{s-b-f-i-t}
如下图: