Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 具有指定距离/节点数的寻路算法_Algorithm_Path Finding - Fatal编程技术网

Algorithm 具有指定距离/节点数的寻路算法

Algorithm 具有指定距离/节点数的寻路算法,algorithm,path-finding,Algorithm,Path Finding,我需要一个算法,可以给我一个从开始节点到结束节点的路径,但是这个路径必须有一个精确的节点数,否则路径查找就会失败 要扩展,我有一个网格的瓷砖。移动只能移动到紧邻的上、下、左或右瓷砖(表示没有对角线移动)。关于路径中可以使用和不可以使用哪些tile,有很多规则,但大多数情况下,可以归结为一个简单的bool来判断tile是否可以使用(这甚至可以在开始算法之前计算出来。然而,给我带来麻烦的是,我有一个特定的距离,路径必须有,这意味着,从一个瓷砖到相邻瓷砖的每一个移动都是一个距离,整个路径应该有一个指定

我需要一个算法,可以给我一个从开始节点到结束节点的路径,但是这个路径必须有一个精确的节点数,否则路径查找就会失败

要扩展,我有一个网格的瓷砖。移动只能移动到紧邻的上、下、左或右瓷砖(表示没有对角线移动)。关于路径中可以使用和不可以使用哪些tile,有很多规则,但大多数情况下,可以归结为一个简单的bool来判断tile是否可以使用(这甚至可以在开始算法之前计算出来。然而,给我带来麻烦的是,我有一个特定的距离,路径必须有,这意味着,从一个瓷砖到相邻瓷砖的每一个移动都是一个距离,整个路径应该有一个指定的距离,不能多,也不能少。而且,一旦瓷砖被踩上去(但在算法开始时所有的瓷砖都可用),它不能再踩上去,有点像玩老蛇游戏,你必须小心不要吃自己

我看过Dijkstra/A*和谷歌的寻路算法,但据我所知,所有的算法都专注于最短路径,这对我没有多大好处。我不在乎它是哪条路径,只要它遵循上述规则

我是否遗漏了一些东西,这些和算法是否已经存在,或者是否有一种简单的方法来修改Dijkstra/A*来给出这个结果? 由于我不是以英语为母语的人,我可能使用了错误的术语,因此我欢迎对这种算法的关键字建议


这里有一个例子,我的意思是,当我说它必须是和精确的距离,不能使用相同的瓷砖两次

假设距离必须是7。现在让我们用O标记路径中可以使用的瓷砖,不能用X和X标记的瓷砖,用s标记起点,用E标记目标

X X X X X X X X O O E S O O X O O O O O O X X X X X X X O O E S O O O xooo 若并没有距离限制的话,你们可以向左走,问题就解决了。 如果有距离限制,而不是“不能踩在同一块瓷砖上”的限制,一个人可以向下走一次,然后向左,然后向右,然后向左,然后向右,然后向左,然后向上到达目标。 由于两者都有局限性,一个人需要向右、向下、向左、向左、向左、向上,然后向右才能到达目标。然而,如果情况是这样,就没有有效的路径

X X X X X X X X O O E S O O X X O O O X O X X X X X X X O O E S O O O X X O O X O 如果相关的话,我正在用C#开发这个棋盘游戏

至于最大距离,这里是距离的范围。 玩家将掷骰子,得到数字1-6。如果玩家得到6,他将再次掷骰子,如果他得到另一个6,他将一次又一次地掷骰子,直到他没有得到6。距离是结果数字加上玩家拾取的项目数,理论上可以达到8,但通常是0-3,可能是4


另一方面,我刚刚收到新的命令,游戏规则改变了,允许在同一条路径上两次踏上同一位置,我相信这会大大简化过程,但我将保留这个问题,因为我认为它有很好的答案,可以帮助在这种情况下的人。

如果有一个快速算法来解决这个问题的话s、 你可以插入
number of nodes=n
,算法会很快告诉你是否存在。因为这个问题是NP完全问题,所以你的问题也是。

正如Haile所指出的,因为它是NP完全问题,如果你的问题足够小,这里有一个启发式方法:

  • 查找不包含
    S
    e
    的半岛(即图形中仅通过一个节点连接到其余部分的部分),然后将其删除
  • 找到从
    S
    E
    的最短路径
    P
    。如果
    n
    小于
    len(P)
    ,则没有解决方案
  • 现在,从
    S
    E
    进行深度优先搜索,使用以下启发式选择要首先挖掘的节点。让
    a
    作为深度优先搜索中的当前磁贴。在欧几里得几何中,在
    (SE)行上投影
    a
    的位置
    并将此点称为
    A'
    。尝试将比率
    len(当前路径)/n
    保持在
    len([SA'])/len([SE])
    附近。或者更好的做法是,在路径
    P
    上“投影”
    A
    以获得
    A'
    ,并将比率
    len当前路径)/n
    保持在
    len P附近

我们对您将要处理的具体情况了解不多,当然还有更多的启发式方法可以添加以丢弃深度优先搜索树的部分。

由于您有一个问题,其中每个步骤的成本为1,因此一个名为“深度优先搜索”的简单变体应该能够找到您想要的路径类型。Python的Naive版本:

def dls(path, goal, depth):
    last = path[-1]
    if len(path) == depth:
        if last == goal:
            return path
    else:
        for n in neighbors(last):
            if allowed(n) and n not in path:
                path.append(n)
                solution = dls(path, depth)
                if solution:
                    return solution
                path.pop()

# call as:
dls([start], goal, depth)
正如其他人所指出的,这个问题是NP完全问题,所以不要指望更长的路径会出现奇迹


是这类算法的权威教科书。

现在,这个问题已经用通常的距离值更新了

因此,在每个时间步中,您最多有4个选择,最多有5+4=9个步骤。这意味着不到49=262 144条潜在路径。首先尝试暴力,看看它能走多远


另外,请注意,反复掷骰子直到你得到的不是6,这相当于在1到5之间画一个随机数。在comupter游戏中,这是一个很平常的事情,而且有这样的物理骰子(谷歌搜索“5面骰子”图片)。使用十边骰子也是很常见的。

注意,这个问题是NP完全问题,通过简化为哈密顿路径问题。另外,请阅读amit答案。@Haile:这个问题是NP完全问题,但您在这里应该更小心一点,因为问题中的图形有点受限,您需要简化每个哈密顿路径问题