Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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
Php A*搜索-最少跳数?_Php_Python_Path Finding_A Star - Fatal编程技术网

Php A*搜索-最少跳数?

Php A*搜索-最少跳数?,php,python,path-finding,a-star,Php,Python,Path Finding,A Star,我正在尝试创建一个A*寻路算法,但是我在开始使用它时遇到了一些困难。一点背景: 我绝对不精通寻路算法,但是我在几年前就接触过这个问题(我已经忘记了我所学到的一切)。我玩EVE Online,这是一款关于互联网宇宙飞船的在线游戏。开发者发布静态信息的数据转储(游戏中的项目、太阳系位置等)。我正在寻找从太阳系A到太阳系B的最短路线 看看这张地图:这是游戏中的一个区域,每个节点都是一个系统。我想计算两个系统之间的最短距离 我的问题:我在网上读到的关于A*的所有内容都是关于合并两个节点之间的距离(例如,

我正在尝试创建一个A*寻路算法,但是我在开始使用它时遇到了一些困难。一点背景:

我绝对不精通寻路算法,但是我在几年前就接触过这个问题(我已经忘记了我所学到的一切)。我玩EVE Online,这是一款关于互联网宇宙飞船的在线游戏。开发者发布静态信息的数据转储(游戏中的项目、太阳系位置等)。我正在寻找从太阳系A到太阳系B的最短路线

看看这张地图:这是游戏中的一个区域,每个节点都是一个系统。我想计算两个系统之间的最短距离

我的问题:我在网上读到的关于A*的所有内容都是关于合并两个节点之间的距离(例如,两个城市之间的距离)来帮助计算最短路径。这对我的情况没有帮助,因为我更感兴趣的是跳数(节点1>节点2>节点3),而不是这些跳之间的距离。我不知道如何修改A*算法来合并这个

我在数据库中拥有的信息: 所有系统及其邻居的列表(因此,systemX与systemA和systemB链接) x、 三维栅格中所有系统的y坐标和z坐标

如果有人能给我指出正确的方向,那就太好了。我希望在PHP中使用它,不过我也开始在Python中工作了一点,所以这也会起作用

如有需要,可根据要求提供示例数据

编辑 正如一些人指出的那样,与每次跳跃相关的“成本”仅为1。但是,对于*,您还需要一个启发式方法来估计从当前节点到目标节点的距离。我不确定如何确定这个值,因为我不确定剩余的跳数。如上所述,我确实拥有每个节点的三维坐标(x,y,z),但我不确定这是否能提供任何见解,因为每个节点之间的物理距离并不重要。我知道没有一条路跨越99跳以上

编辑2 示例区域的MySQL数据

to->from
数据:

系统信息(x,y,z,如果需要的话):

如果“跳”的数目对你来说是重要的,那么把它看作是你的距离,这意味着如果这两个位置通过单跳连接,那么距离是一个。p> 对于*,您需要两件事:

  • 从一个位置到每个邻居的成本,在您的情况下,这似乎是恒定的(跳跃)

  • 一种启发式方法,用于估计从当前“节点”或位置到目标的成本。你如何估计这在很大程度上取决于你的问题。很重要的一点是,你的启发式方法不能*超过*估计真实成本,否则A*将无法保证获得最佳结果


  • 以下面的上半部分为例:

    假设这些线表示2路(即,您可以前往或离开任何链接节点),黑线的“成本”为1,红线的“成本”为2

    该结构可以由以下Python数据结构表示:

    graph = {'Q-KCK3': {'3C-261':1, 'L-SDU7':1},
             'L-SDU7': {'Q-KCK3':1, '3C-261':1,'4-IPWK':1},
             '3C-261': {'4-IPWK':1,'9K-VDI':1,'L-SDU7':1,'U8MM-3':1},
             'U8MM-3': {'9K-VDI':1,'3C-261':1, '9K-VDI':1, 'Q8T-MC':2},
             'Q8T-MC': {'U8MM-3':2, 'H55-2R':1, 'VM-QFU':2},
             'H55-2R': {'Q8T-MC':1, '9XI-OX':1, 'A3-PAT':1, 'P6-DBM':1},
             'P6-DBM': {'A3-PAT':1, 'H55-2R':1},
             'A3-PAT': {'P6-DBM':1, 'H55-2R':1, '9XI-OX':1,'YRZ-E4':1},
             'YRZ-E4': {'A3-PAT':1}, 
             'VM-QFU': {'IEZW-V':1, 'PU-128':2},
             'IEZW-V': {'VM-QFU':1, 'PU-128':1, 'B-DX09':1},
             'PU-128': {'VM-QFU':1, 'B-DX09':1, 'IEZW-V':1},
             'B-DX09': {'IEZW-V':1, 'PU-128':1, '1TS-WIN':1},
             '1TS-WIN': {'B-DX09':1, '16-31U':1},
             '16-31U': {'1TS-WIN':1}
            }
    
    现在,您可以定义一个递归函数来导航该数据:

    def find_all_paths(graph, start, end, path=[]):
            path = path + [start]
            if start == end:
                return [path]
            if start not in graph:
                return []
            paths = []
            for node in graph[start]:
                if node not in path:
                    newpaths = find_all_paths(graph, node, end, path)
                    for newpath in newpaths:
                        paths.append(newpath)
            return paths       
    
    def min_path(graph, start, end):
        paths=find_all_paths(graph,start,end)
        mt=10**99
        mpath=[]
        print '\tAll paths:',paths
        for path in paths:
            t=sum(graph[i][j] for i,j in zip(path,path[1::]))
            print '\t\tevaluating:',path, t
            if t<mt: 
                mt=t
                mpath=path
    
        e1='\n'.join('{}->{}:{}'.format(i,j,graph[i][j]) for i,j in zip(mpath,mpath[1::]))
        e2=str(sum(graph[i][j] for i,j in zip(mpath,mpath[1::])))
        print 'Best path: '+e1+'   Total: '+e2+'\n'  
    
    印刷品:

        All paths: [['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT']]
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'] 7
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT'] 6
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'] 8
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT'] 7
    Best path: Q-KCK3->3C-261:1
    3C-261->U8MM-3:1
    U8MM-3->Q8T-MC:2
    Q8T-MC->H55-2R:1
    H55-2R->A3-PAT:1   Total: 6
    
        All paths: [['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U']]
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 10
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 11
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 11
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 12
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 11
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 12
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 12
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 13
    Best path: Q-KCK3->3C-261:1
    3C-261->U8MM-3:1
    U8MM-3->Q8T-MC:2
    Q8T-MC->VM-QFU:2
    VM-QFU->IEZW-V:1
    IEZW-V->B-DX09:1
    B-DX09->1TS-WIN:1
    1TS-WIN->16-31U:1   Total: 10
    
    如果需要最小的跃点数,只需修改
    min\u path
    以返回最短的列表长度,而不是跃点数的最小总成本。或者,将每个跃点的成本设置为
    1


    看一看

    如果两个节点之间的距离始终为一(一跳),则只需将每条路径的成本设为1,并在图形上运行*即可。可能会发布示例数据…但很难定义启发式。。如果你填0或1,你会得到Dijkstra的算法。flup,我想这是我困惑的事情之一。如果所有节点之间的距离为1,如何使用*?我可以用2作为启发吗?这有点让我难以理解,但在进入搜索循环之前,该算法显然会检查两个节点是否相同或相邻,因此“2”是a*必须处理的最小距离……使用2基本上与使用0作为启发式相同,因为它是常量,不会帮助您的算法执行得更快。启发式的目标是提供一个近似值,允许A*选择一条路径,该路径预测可以更快地达到目标。感谢您花时间为一个工作示例实际手动复制该图像的一部分。荣誉然而,我仍然对如何确定启发法感到困惑。由于每跳(g)花费1,我没有任何方法来估计h,那么确定这一点的最佳方法是什么?这里的算法类似于,可能只是将启发式设置为0?这是我的想法。h=0的A*仍然是Dijkstra。也许有可能A*不是我当时想要的,所以我很难对付它。因为我不是在寻找节点之间的距离,只有最少的跳数,也许Dijkstra和A*不是我想要的。也许是BFS。。。
        All paths: [['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT']]
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'] 7
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT'] 6
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'P6-DBM', 'A3-PAT'] 8
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'H55-2R', 'A3-PAT'] 7
    Best path: Q-KCK3->3C-261:1
    3C-261->U8MM-3:1
    U8MM-3->Q8T-MC:2
    Q8T-MC->H55-2R:1
    H55-2R->A3-PAT:1   Total: 6
    
        All paths: [['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'], ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U']]
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 10
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 11
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 11
            evaluating: ['Q-KCK3', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 12
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 11
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'IEZW-V', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 12
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'B-DX09', '1TS-WIN', '16-31U'] 12
            evaluating: ['Q-KCK3', 'L-SDU7', '3C-261', 'U8MM-3', 'Q8T-MC', 'VM-QFU', 'PU-128', 'IEZW-V', 'B-DX09', '1TS-WIN', '16-31U'] 13
    Best path: Q-KCK3->3C-261:1
    3C-261->U8MM-3:1
    U8MM-3->Q8T-MC:2
    Q8T-MC->VM-QFU:2
    VM-QFU->IEZW-V:1
    IEZW-V->B-DX09:1
    B-DX09->1TS-WIN:1
    1TS-WIN->16-31U:1   Total: 10