Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
用Python在英文维基百科中查找两篇文章之间的最短路径_Python_Algorithm_Dijkstra - Fatal编程技术网

用Python在英文维基百科中查找两篇文章之间的最短路径

用Python在英文维基百科中查找两篇文章之间的最短路径,python,algorithm,dijkstra,Python,Algorithm,Dijkstra,问题是: 在英文维基百科中查找两篇文章之间的最短路径。如果存在第C(i)条,并且第A条中存在指向第C(1)条的链接,第C(1)条中存在指向第C(2)条的链接,则第A条和第B条之间存在路径,…,第C(n)条中存在指向第B条的链接 我正在使用Python。下载维基百科文章的URL: 维基百科API 我已经编辑了我的源代码,但当我在代码中包含这些文章时,它仍然不起作用。有人能告诉我我在搞什么吗 这是我的代码: import urllib2 import re import xml.etree.El

问题是:

在英文维基百科中查找两篇文章之间的最短路径。如果存在第C(i)条,并且第A条中存在指向第C(1)条的链接,第C(1)条中存在指向第C(2)条的链接,则第A条和第B条之间存在路径,…,第C(n)条中存在指向第B条的链接

我正在使用Python。下载维基百科文章的URL:

  • 维基百科API
  • 我已经编辑了我的源代码,但当我在代码中包含这些文章时,它仍然不起作用。有人能告诉我我在搞什么吗

    这是我的代码:

    import urllib2
    import re
    import xml.etree.ElementTree as ET
    
    text = ET.fromstring(F_D.text.encode('UTF-8'))
    text = ET.fromstring(P.text.encode('UTF-8'))
    F_D=requests.get('http://en.wikipedia.org/wiki/Ant_colony_optimization_algorithms')
    P=requests.get('http://en.wikipedia.org/wiki/Wikipedia:Unusual_articles')  
    links = text.findall('.//*[@id=”mw-content-text”]/p/a')
    
    links=E_D
    
    E_D = graph_dict
    E_D[start] = 0
    
    for vertex in E_D:
        F_D[vertex] = E_D[vertex]
        if vertex == end: break
    
        for edge in graph[vertex]:
            path_distance = F_D[vertex] + graph[vertex][edge]
            if edge in F_D:
                if path_distance < F_D[edge]:
                    #raise ValueError,
                elif edge not in E_D or path_distance < E_D[edge]:
                    E_D[edge] = path_distance
                    [edge] = vertex
    return (F_D,P)
    
    def Shortest_Path(graph,start,end):
      F_D,P = D_Algorithm(graph,start,end)
      path = []
      while 1:
        path.append(end)
        if end == start: break
        end = P[end]
      path.reverse()
      return path
    
    导入urllib2
    进口稀土
    将xml.etree.ElementTree作为ET导入
    text=ET.fromstring(F_D.text.encode('UTF-8'))
    text=ET.fromstring(P.text.encode('UTF-8'))
    F_D=请求。获取('http://en.wikipedia.org/wiki/Ant_colony_optimization_algorithms')
    P=请求。获取('http://en.wikipedia.org/wiki/Wikipedia:Unusual_articles')  
    links=text.findall('.//*[@id=“mw content text”]/p/a')
    links=E\u D
    E_D=图
    E_D[开始]=0
    对于E_D中的顶点:
    F_D[顶点]=E_D[顶点]
    如果顶点==结束:中断
    对于图中的边[顶点]:
    路径距离=F_D[顶点]+图[顶点][边]
    如果F_D中的边:
    如果路径距离
    考虑到维基百科上的文章数量,计算最短文章需要花费大量的时间(我的假设——我没有尝试过)

    真正的问题是在两篇文章之间找到一条可接受且有效的捷径

    处理这类问题的算法与。这可能是一个很好的起点

    IIRC google或yahoo机器人程序用于在优化时间内获得可接受的最短时间。你可以勾选这个问题:

    我个人也喜欢在一定的时间内找到一个可接受的最佳状态


    我刚看过,这将2013年en.wikipedia.com的文章数量设置为4.000.000。比我想象的要少得多


    编辑:我首先说这是一个NP难问题,评论员解释说不是。

    我们正在研究图形探索。。。你为什么要考虑Dijkstra的算法???依我拙见改变方法

    首先,您需要一个好的启发式函数。对于展开的每个节点,都需要估计该节点与目标/目标节点的距离。现在。。。如何计算启发式是这里真正的挑战。您可以在当前wiki页面和目标页面之间进行关键字映射。匹配的百分比可能会给出估计值。或试着猜测两页之间内容的相关性。我有预感。。。也许神经网络可以帮你。但是,这也可能不是最佳估计。我不确定。找到合适的方法后,使用*搜索算法


    搜索和探索启发式功能,不要去广度优先搜索,你最终将在广阔的维基百科世界中无处容身

    我很想知道你为什么这么做?:)删除了“Windows”标记,因为我在问题中没有看到任何Windows特定的内容。如果这是我的错误,请返回。您可以尝试使用Wikipedia上的“what links here”查找指向某个页面的所有传入链接。这将使问题更容易解决。正如@AndersonGreen所建议的,使用入站链接并执行简单的BFS。除非你有一个边的加权函数(我看不到,你不能想象),你可以考虑所有边有相等的权重,这使得所有的最短路径都在同一个BFS距离上发现目标。从2008年3月开始,数据就过时了,从我可以知道的情况下写在Perl和C++中,但是对他如何解决它的描述可能是有用的。为什么这是NP-难?是的,这只是图搜索(当然,你需要认真地做这件事,这样你就不会耗尽内存)。它在图中的顶点和边的数量上有一个多边形时间解。你指的是什么NP难约简,我不认为这实际上是TSP,因为这是问通过每个节点的最短路径,而不是两个节点之间的最短路径。谢谢你的回答,我会检查它out@tigger这是正确的。重读关于TSP和NP难的文章。我们的例子不是NP难的,也不是TSP的例子。但是,你的意思是,比O(n)更复杂的东西,比如图漫游,是浏览维基百科图的一种可能的方法吗?(我发现自己被NP难和完全弄糊涂了)@StephaneRolland NP难>=NP完全。至少与NP中最复杂的问题Y一样难的问题X是NP难的;X不必是NP的成员。NP完全是指“NP难且在NP中”,因此这些问题是NP中最复杂的问题。另外,我很好奇为什么你提到维基百科上复杂的文章数量,而A*只是对Dijkstra算法的一点修改。。。。把你现有的代码修改成这个应该不是很难。但是我还是不能解决这个问题。有人可以帮我:((当你计算路径距离=F_D[vertex]+图[vertex][edge],您正在获取当前顶点的距离函数并添加下一条边的成本…对吗?但是,假设您对到目标节点的距离(即当前wiki页面和目标页面之间的匹配程度)有一个启发式估计,以H(顶点)表示,那么您的成本函数将变为=F_D[vertex]+graph[vertex][edge]+H(ve)