用于重新创建完整解决方案的问题解决方案的子集是否被视为启发式?

人工智能 启发式 路径规划
2021-11-01 05:41:57

这是一个关于命名法的问题——我们已经有了算法/解决方案,但我们不确定它是否有资格使用启发式算法。


随意跳过问题解释:

一位朋友正在编写寻路算法——计算机游戏中(越野)车辆的自动驾驶仪。这是一个非常经典的问题——他使用 A* 算法找到了一条可行的、不一定是最优但“足够好”的路线,通过考虑地形布局和车辆能力,并修改直接(直线)路径以考虑这些。整个地图是先验已知且不变的,尽管起点和终点是任意的(用户选择的)并且根本不保证路径存在。

这种千篇一律的方法有一个转折点:存储空间有限。我们可以在开始时提供一些更易失的内存,但是一旦找到路由,我们就应该释放大部分内存。旅行也可能需要几天的实时时间,因此必须将路径保存到磁盘,并且此类自定义数据的保存文件中的空间受到严重限制。保存所有航点太有限 - 即使在剔除微不足道的解决方案航点之后(“继续直行”),并且在相当大的范围内,大约是我们数据集大小的 20%。

我们提出的一个解决方案是在开始时计算一次路线,然后“忘记”所有琐碎和 90% 的非琐碎航点。这既可以证明存在解决方案,也可以提供一组到达点,依次保证路线将我们带到目的地。

一旦车辆到达一个航路点,就会从头开始重新计算到下一个航路点的路线。已知它存在并且是正确的(因为我们做过一次,而且它是正确的),它不会给 CPU 和内存带来太大的压力(它只占总路由长度的 10% 左右)而且它不会需要进入永久存储(从路径上的任何点重新开始只是连接两个已保存航点的解决方案的子集)。


现在对于实际问题:

寻路算法遵循一组稀疏的航路点,这些航路点本身不足以作为路线,但可以轻松、有效地计算实际路线,同时保证其存在;它们是完整解决方案的子集。

这是一种启发式方法吗?

(据我所知,通常启发式方法并不能保证存在解决方案,而只是建议更有可能的候选者。在这种情况下,“提示”是直接从实际工作解决方案中提取的,因此我对此表示怀疑。)

3个回答

既然您提到了A* 算法,那么您肯定在某处使用了启发式算法,至少使用 A* 算法,同时使用直线距离作为您的启发式函数来解决子问题。

尽管之后您的方法似乎没有将“快捷数学公式”作为启发式方法,但它为我们提供了一个预先计算的启发式表作为参考,并且可能有资格作为启发式方法。此处的维基百科页面说(尽管没有引用)以下内容似乎确实描述了您正在做的事情,其中​​您的启发式不是固定的而是预先计算的函数/表:

启发式函数,也简称为启发式函数,是一种函数,它根据可用信息在每个分支步骤对搜索算法中的备选方案进行排名,以决定遵循哪个分支。例如,它可以近似精确解。

另一方面,您的方法似乎也暗示了动态编程,因为您使用预先计算和存储的解决方案来解决子问题,而不是每次都重新计算。

我想知道术语近似动态规划是否适合这种情况作为没有不确定性的非随机版本?不幸的是,我找不到该术语的任何简单描述或分类。

标签是否适合任何特定实例取决于您使用标签的目的。如果某些特定的东西取决于这种方法是否是“启发式”,那么这个上下文很重要。

但我不会将此称为启发式方法,因为我认为这是解决问题的捷径,而不是存储解决方案或重新制定问题(这就是我的想法)。

“启发式”只是“经验法则”,即不能保证问题的最佳解决方案。

除了上述概念(当然在优化学科内),什么构成启发式的概念并不是特别严格,当然可以包括从以前的部分构建新解决方案的提示,就像你正在做的那样。

一个相关的具体示例是旅行商问题的“最近邻启发式”,其中通过从某个随机城市开始并迭代选择最近的城市来构建解决方案。然后将生成的完整游览用作一些更复杂的优化过程的初始输入。