在当前项目中,我们需要在几乎完全连接的图中找到最便宜的路径,每个顶点对可以包含很多边。
我们开发了一个包含函数的插件
- 对于特殊遍历,此图可在执行时降低相似路径的重复出现率
TRAVERSE
。我们将其称为search()
- 用于从此类遍历的结果中特别有效地提取所需信息。我们将其称为
extract()
N
用于根据目标参数提取最佳记录而无需昂贵的成本ORDER BY
。我们将其称为best()
但是结果查询在完整数据上的性能仍然不理想。
所以我们决定修改search()
函数,以便它可以首先观察最佳边缘,并通过使用函数的当前状态来修剪导致绝对不希望的结果的路径best()
。
整体解决方案实际上是Branch and Bound 方法的灵活实现
结果查询(省略extract()
步骤)应如下所示
SELECT best(path, <limit>) FROM (
TRAVERSE search(<params>) FROM #<starting_point>
WHILE <conditions on intermediate vertixes>
) WHERE <conditions on result elements>
WHILE
这种形式是非常需要的,因此我们可以根据当前任务调整条件WHERE
。该path
字段是通过search()
包含所有信息best()
以继续生成的。
问题是best()
函数严格在search()
函数之后执行,因此search()
不能根据已经评估的结果修剪非最佳分支best()
。
所以问题是:
有没有一种方法可以TRAVERSE
一步一步地处理结果SELECT
,就像旧路径在TRAVERSE
使用 withsearch()
处理的早期路径之后SELECT
一样best()
?