Algorithm 有限知识无距离启发式寻路

Algorithm 有限知识无距离启发式寻路,algorithm,artificial-intelligence,path-finding,Algorithm,Artificial Intelligence,Path Finding,在我正在编写的一个简单的精英式游戏中,我很难为AI编写寻路程序 这个游戏中的世界是由几个“虫洞”连接的“系统”,一艘船每回合可以从它所在的系统跳到它连接的任何系统。人工智能仅限于知道它应该知道的事情;它不知道什么链接来自它没有去过的系统(尽管它可以从它见过的系统中计算出来,因为链接是双向的)。人工智能的其他部分根据其库存中的货物以及通过的系统中的物品价值来决定船舶需要进入哪个系统 问题是,我不知道如何解决找到目标系统路径的问题。我不能用A;没有路径,无法确定到另一个系统的“距离”。我还需要这个算

在我正在编写的一个简单的精英式游戏中,我很难为AI编写寻路程序

这个游戏中的世界是由几个“虫洞”连接的“系统”,一艘船每回合可以从它所在的系统跳到它连接的任何系统。人工智能仅限于知道它应该知道的事情;它不知道什么链接来自它没有去过的系统(尽管它可以从它见过的系统中计算出来,因为链接是双向的)。人工智能的其他部分根据其库存中的货物以及通过的系统中的物品价值来决定船舶需要进入哪个系统

问题是,我不知道如何解决找到目标系统路径的问题。我不能用A;没有路径,无法确定到另一个系统的“距离”。我还需要这个算法是有效的,因为它将需要运行大约100次,每次球员轮流


有人知道合适的算法吗?

当涉及未知环境时,我通常使用进化算法。这并不能保证你能在有限的时间内找到最好的解决方案,但却是解决这一问题的一种方法。

我最终实现了一个双向、贪婪的广度优先搜索版本,它非常适合这个目的。简单地说,我只是让程序检查每个节点,它的起始节点连接到哪个节点,然后每个节点连接到哪个节点,然后每个节点连接到哪个节点。。。直到找到目标节点

通常,人们会建立一个合适的路径列表,然后选择最短的路径,但我尝试了另一种方法;我让程序并行运行两个搜索,一个从起点开始,一个从终点开始。当“发件人”搜索找到“收件人”搜索的最后一个节点时,该路径被视为已找到

然后,它通过检查路径上的每个节点是否连接到路径中更高的节点并删除它们之间的每个节点来优化路径

这个时髦的算法是否真的比直接的BFS更好还有待观察。

看看(POMDP)。你应该能够用这个模型表达你的问题


然后,您可以使用解决这些问题的算法来尝试找到一个好的解决方案。请注意,解决POMDP通常非常昂贵,您可能必须求助于近似方法。

最简单的欺骗方法是通过,或者至少尝试访问尽可能多的系统,然后将距离启发式作为您访问过的所有系统的总和来实现

另一种选择,更酷:

我已经使用蚁群优化(ACO)实现了类似的功能,并与粒子群优化(PSO)结合使用,效果非常好,但是,您的系统施加的额外约束意味着您将不得不花费数个(至少一个)会话来确定环境布局,如果它是动态的。。。好。。。尽管如此。
好的是,这个算法完全绕过了启发式生成的需要,这正是你所需要的,因为你是盲目飞行的。但请注意,如果您的搜索空间(运行次数)很小,这是一个坏主意。(100可能是可以接受的,但10或5…不太多)

当处理大量节点(系统)时,这种方法可以很好地扩展,并且它绕过了每个节点到节点关系的启发式距离计算需求,从而使其更加高效


祝你好运。

如果人工智能从未去过一个系统,因此不知道哪里有虫洞可以进入系统,那么人工智能就不知道通往它的路径,也没有算法。你的问题有些矛盾。从你所描述的,这听起来更像是一个最大流量问题。查找Edmonds Karps算法。@AnttiHuima它永远不会尝试到它没有去过的系统的路径。它也知道虫洞在哪里进入一个系统,如果它是到一个系统有链接到未访问的系统;它只是不知道所有这些联系。@Martol1ni这似乎更多的是寻找流体向下流动的路径,这不是我在这里要做的。我试图找到一条从a点到B点的路径,其中两个点都是链接节点网络中的节点,但无法估计从一个节点到另一个节点所需的跳跃次数。你能让每艘船都保存一张它已经访问过的系统图吗?然后,当它想要返回到以前访问过的系统时,它可以在图上进行广度优先搜索以找到路径。