我知道A*算法可以找到最短路径。但是在我的工作中遇到的问题是我需要找到所有的最短路径。更确切地说,可能存在多条最短路径,但我需要按顺时针的优先级选择其中一条最短路径。
如果我能得到所有的最短路径,我就可以得到我想要的那个(顺时针优先级)。
如果我能得到所有的最短路径,我就可以得到我想要的那个(顺时针优先级)。
a > b
都将保持不变,但如果顺时针性组件不同,则可能会改变a == b
的关系。
如果你不想明确地使用数值,还有一种比较方法是将成本作为一对值。如果两个路径成本的第一个部分不同,则可以直接进行比较。如果第一个部分相同,则只需比较成对中的第二个值。
话虽如此,我暂时不确定是否建议您修改成本或启发式函数(或两者都修改)。而且,我不确定这个精确的技巧在您的问题中是否有效,但我相信如果您稍微尝试一下,就可以通过修改其中一个函数来激励算法朝向最顺时针的解决方案。
:
符号后面没有写任何内容 :D 如果这是问题的扩展,请在问题中进行编辑... 如果它看起来是一个单独的问题,请打开一个新的问题并在评论中发布链接,以便我可以找到它。 - penelope为了澄清@penelope的意思:“...在找到第一个最优解之后继续前进...”
从A*中获取一组等价成本最优路径:
一旦A*找到了最短路径(成本=C*),您可以继续从OPEN列表中弹出解决方案,直到遇到成本高于C*的解决方案,以获得其他等长的路径。(有一个警告,如果您的启发式不完美,您可能需要做一些额外的工作。)请注意,这将为您提供一组最优路径,但不一定是所有最优路径的集合 - 这取决于您如何设置重复检测。
从A*中获取顺时针路径:
至于优先选择顺时针路径,请考虑在排序OPEN列表的比较方法中使用打结方法。如果两个候选者具有相同的f-cost,请优先选择最顺时针的候选者。(我认为您可以通过查看候选者相对于起始/目标节点的位置来获得顺时针性质。)如果您以这种方式进行打结,则顺时针解决方案将被推到OPEN列表的前面,并且您将从A*获取最顺时针的解决方案。