【问题标题】:Research help: Path finding algorithm研究帮助:寻路算法
【发布时间】:2016-10-18 18:12:54
【问题描述】:

不是技术问题,只是为我的研究寻求正确方向。

是否有解决以下问题的模型:

找到从 X 开始以最有效的顺序经过 A、B、C 的路线。在下面的例子中,X,A,C,B 是最优路径 (12)。

谢谢

【问题讨论】:

  • 离题。不是编程问题。这是CS理论,所以试试cs.stackexchange.com
  • 有趣。非常接近我正在寻找的东西,只是它返回了原始城市。
  • @WillDonaghy 这不会改变问题的复杂性,仍然被认为是 TSP 的变体。解决方案与此变体几乎相同。

标签: algorithm dijkstra path-finding


【解决方案1】:

你可能想看看旅行推销员。有很多关于如何实现它的资源,因为它是一个非常常见的编程问题。 https://en.wikipedia.org/wiki/Travelling_salesman_problem

【讨论】:

    【解决方案2】:

    这是Dijkstra's Algorithm 在 Python 中的实现:

    def find_all_paths(graph, start, end, path=[]):
        required=('A', 'B', 'C')
        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:
                    if all(e in newpath for e in required):
                        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=' '.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'  
    
    if __name__ == "__main__":
        graph = {'X': {'A':5, 'B':8, 'C':10},
                 'A': {'C':3, 'B':5},
                 'C': {'A':3, 'B':4},
                 'B': {'A':5, 'C':4}}
        min_path(graph,'X','B')
    

    打印:

        All paths: [['X', 'A', 'C', 'B'], ['X', 'C', 'A', 'B']]
            evaluating: ['X', 'A', 'C', 'B'] 12
            evaluating: ['X', 'C', 'A', 'B'] 18
    Best path: X->A:5 A->C:3 C->B:4   Total: 12
    

    “胆量”递归地查找所有路径并过滤到仅访问所需节点('A', 'B', 'C') 的那些路径。然后对这些路径求和以找到最小的路径开销。

    当然有更有效的方法,但很难更简单。你要求一个模型,所以这是一个有效的实现。

    【讨论】:

    • 这(1)不回答问题(不问如何实现)(2)效率不高(有明显更有效的解决方案)(3)没有解释答案的代码,它有imo 的价值很小。
    • @amit:感谢您的反馈。 OP 要求提供 Dijkstra 的寻路算法。这是 Dijkstra 的算法。他没有要求最有效率的。 ——只是一个模型。我已经添加了解释,但是关于 Dijkstra 算法的维基百科条目比有人在这里找到的要好得多。
    • 这不是Dijkstra的算法,如果是这样就解决不了TSP问题,不是点对点最短路径问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2018-01-24
    • 2014-02-13
    相关资源
    最近更新 更多