*branch and boundd
为了提高搜索效率,Cartogrpher采用了branch and bound(分支定界) 的方法,本人研一课程高等运筹学也运用了该方法求解整数规划问题,在大作业中,我也运用该方法求解了JSP问题,主要思路来源也是参考Cartogrpher这部分算法的源代码。首先我简单讲解下 branch and bound 对该方法比较熟悉的读者可跳过。
分枝界限法是由三栖学者查理德·卡普(Richard M.Karp)在20世纪60年代发明,成功求解含有65个城市的旅行商问题,创当时的记录。“分枝界限法”把问题的可行解展开如树的分枝,再经由各个分枝中寻找最佳解。
其主要思想:把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内的解的值计算一个下界或上界(称为定界)。在每次分支后,对凡是界限超出已知可行解值那些子集不再做进一步分支。这样,解的许多子集(即搜索树上的许多结点)就可以不予考虑了,从而缩小了搜索范围。
或许有些读者还是不太理解,下面贴一张图进行讲解。
这张图就已经比较好的描述了分支定界的思想,还有它为什么能够缩小搜索范围的情况下依然能求到最优解。若先前提到的暴力匹配是枚举法,则分支定界是一种隐式枚举法,。
分支定界进行分支的过程,是不断提高搜索精度的过程,或者可以说增加约束的过程,整个分支树的最底层的所有枚举情况,便是最高搜索精度的枚举集合,便是暴力匹配搜索范围的全部整搜索空间。但是分支定界并没有真正的去求解所有枚举情况的目标函数(BBS)值。
再来看这张图假设我们需要去计算检测匹配的点为如图所示16个
则我们第一层搜索精度最低,只列举其中两个,并优先考虑靠左(优先考虑可能性最高的)。
对其继续分层,将其精度提高一倍,又可以列举出两个,并优先考虑靠左。
这样直至最底层,计算出该情况下的目标函数BBS(值),最左的底层有两个值A和B,我们求出最大值,并将其视为best_score
然后我们返回上一层还未来得及展开的C,计算C的目标函数BBS(值)并让它与best_score比较,若best_score依旧最大,则不再考虑C,即不对其进行分层讨论。
若C的目标函数BBS(值)更大,则对其进行分层,计算D和E的值,我们假设D值大于E,则将D与best_score对比
若D最大,则将D视为best_score,否则继续返回搜索。
将此算法应用在我们的回环检测中,现已知我们的搜索范围(搜索最高精度,最底层),设置步长来对该问题进行优化搜索。
a, 首先计算顶层线性搜索空间:
b,计算其余层结构
一个candidate可构建四个子Candidate。
角度参数不变
对x_index_offset,y_index_offset加入新的偏移量
C层搜索空间:
c,搜索算法
1,构建顶层C0,计算所有C0 的target 得分,从大到小排序
2,C0 ----> C1 ,计算这四新的C1的target 得分,从大到小排序
3,重复步骤 2 ,直到 depth = Max , 得到最底层的四个Cdepth 并计算target得分,得分最高的作为 best_score
4,返回倒数第二层,将best_score与剩下三个Cdepth-1 比较,若best_score大于任何一个得分,则无须进入其它分支,继续返回best_score
5,重复 4 直到遍历整个分支树 返回的结果为最优结果