旅行商作为np-hard问题无法在多项式时间内解决,因此人们各种近似算法求解。branch and bound是其中一种。对于brand and bound需要选择lower bound。我们希望选lower bound尽可能有效,比如每个都取0肯定是符合lower bound的定义但够好,没有起到剪枝的作用。
再优化一下也许有人会提出选择每一行中最小的数,贪心法。可是这样的模拟还不够精确,因为是回路,肯定有一条边出去,一条边回来,而具体那一条边出去哪一条回来?我们希望概率尽量均等。
所以我们选择每一行的最小的两个值(除了自己到自己的0外)的和求和,然后再除以2,获得平均值。直觉上,这样做似乎更有逻辑更能模拟这个过程。理论上的证明笔者尚未尝试。另外,在后期已经选过的边必选外再取最小两值。比如第5个点a,b,c中(a,b),(b,a),(b,c),(c,b)必选。于第三行而言选1,6而不是选1,2.
注:图中lb的意思是lower bound.第一个14的算法就是(3+1+3+6+1+2+3+4+2+3)/2 = 14. ceil(14) = 14.
另外提一下,旅行商问题不需要和最短路的问题一样求出每个点到各个其他点的最短距离,仅仅使用原本的图就够了。