这是一个关于命名法的问题——我们已经有了算法/解决方案,但我们不确定它是否有资格使用启发式算法。
随意跳过问题解释:
一位朋友正在编写寻路算法——计算机游戏中(越野)车辆的自动驾驶仪。这是一个非常经典的问题——他使用 A* 算法找到了一条可行的、不一定是最优但“足够好”的路线,通过考虑地形布局和车辆能力,并修改直接(直线)路径以考虑这些。整个地图是先验已知且不变的,尽管起点和终点是任意的(用户选择的)并且根本不保证路径存在。
这种千篇一律的方法有一个转折点:存储空间有限。我们可以在开始时提供一些更易失的内存,但是一旦找到路由,我们就应该释放大部分内存。旅行也可能需要几天的实时时间,因此必须将路径保存到磁盘,并且此类自定义数据的保存文件中的空间受到严重限制。保存所有航点太有限 - 即使在剔除微不足道的解决方案航点之后(“继续直行”),并且在相当大的范围内,大约是我们数据集大小的 20%。
我们提出的一个解决方案是在开始时计算一次路线,然后“忘记”所有琐碎和 90% 的非琐碎航点。这既可以证明存在解决方案,也可以提供一组到达点,依次保证路线将我们带到目的地。
一旦车辆到达一个航路点,就会从头开始重新计算到下一个航路点的路线。已知它存在并且是正确的(因为我们做过一次,而且它是正确的),它不会给 CPU 和内存带来太大的压力(它只占总路由长度的 10% 左右)而且它不会需要进入永久存储(从路径上的任何点重新开始只是连接两个已保存航点的解决方案的子集)。
现在对于实际问题:
寻路算法遵循一组稀疏的航路点,这些航路点本身不足以作为路线,但可以轻松、有效地计算实际路线,同时保证其存在;它们是完整解决方案的子集。
这是一种启发式方法吗?
(据我所知,通常启发式方法并不能保证存在解决方案,而只是建议更有可能的候选者。在这种情况下,“提示”是直接从实际工作解决方案中提取的,因此我对此表示怀疑。)