【问题标题】:Find shortest path between two articles in english Wikipedia in Python用Python在英文维基百科中找到两篇文章之间的最短路径
【发布时间】:2013-04-13 17:20:20
【问题描述】:

问题:

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

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

  1. http://en.wikipedia.org/wiki/Nazwa_artykułu
  2. http://en.wikipedia.org/w/index.php?title?Nazwa_artykułu&printable=yes
  3. 维基百科 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

【问题讨论】:

  • 我很想知道你为什么要这样做? :)
  • 删除了“Windows”标签,因为我在问题中没有看到任何特定于 Windows 的内容。如果这是我的错误,请退回。
  • 您可以尝试使用 Wikipedia 上的“这里的链接”来查找页面的所有传入链接。这将使问题更容易解决。
  • 正如@AndersonGreen 建议的那样,使用入站链接并执行简单的 BFS。除非您对边缘有加权函数(我看不到也无法想象您会这样做),否则您可以考虑所有边缘具有相同的权重,这使得所有最短路径在相同的 BFS 距离处发现目标从源头。
  • 查看mu.netsoc.ie/wiki 了解以前做过此操作的人。它从 2008 年 3 月开始,所以数据已经过时,据我所知是用 Perl 和 C++ 编写的,但他如何解决它的描述可能很有用。

标签: python algorithm dijkstra


【解决方案1】:

我们正在研究图探索……您为什么要考虑 Dijkstra 算法???恕我直言...改变方法。

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

搜索和探索启发式函数,不要去广度优先搜索,你最终会在广阔的维基百科世界中无处可寻!

【讨论】:

  • 而 A* 只是对 Dijkstra 算法的一点修改......将现有代码修改成这个应该不难。
  • 我仍然无法解决这个问题有人帮我:((((
  • 当您计算 path_distance = F_D[vertex] + graph[vertex][edge] 时,您正在获取当前顶点的距离函数并添加下一条边的成本......对?但是,假设您对目标节点的距离(即当前 wiki 页面和目标页面之间的匹配程度)有一个启发式估计,用 H(vertex) 表示,那么您的成本函数变为 = F_D[vertex] +图[顶点][边] + H(顶点)。
  • 将这些节点与其相应的成本函数关联到一个二进制最小堆(或任何排序列表)中。在扩展下一个节点时,弹出/获取此列表/堆的最小元素并迭代扩展。
【解决方案2】:

鉴于 wikipedia 上的文章数量,计算最短的时间将花费无法承受的时间(我的假设 - 我没有尝试过)。

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

处理此类问题的算法与The travelling salesman problem 有关。这可能是一个很好的起点。

IIRC google 或 yahoo 机器人使用Ant Colony Optimization 在优化时间中获得可接受的最短时间。你可以检查这个 SO 问题:Where can I learn more about "ant colony" optimizations?

我个人也喜欢genetic algorithms approach 在一定时间内找到可接受的最佳值。


我刚刚查看了at that image,这将 2013 年 en.wikipedia.com 的文章数量设置为 4.000.000。确实比我想象的要少。

编辑:我首先声明这是一个 NP-Hard 问题,评论者解释说不是。

【讨论】:

  • 为什么这会是 NP 难的?
  • 是的,这只是图搜索(当然实际上您需要仔细执行此操作,以免内存不足),其中的顶点和边数具有多时间解图表。你指的是什么 NP-Hard 减少,我不认为这实际上是 TSP,因为这是询问通过每个节点的最短路径,而不是两个节点之间的最短路径。
  • 谢谢您的回复我去看看
  • @tigger 没错。重新阅读有关 TSP 和 NP-hard 的文章。我们的案例不是 NP-Hard,也不是 TSP 案例。但是你的意思是复杂度大于 O(n) 的东西,比如图行走,是浏览 wikipedia 图的可能方法吗? (我发现自己对 NP 很困惑,很完整)
  • @StephaneRolland NP-hard >= NP-complete。至少与 NP 中最复杂的问题 Y 一样难的问题 X 是 NP 难的; X 不必是 NP 的成员。 NP-complete 的意思是“NP-hard and in NP”,所以这些是 NP 中最复杂的问题。另外,我很好奇你为什么在复杂性的背景下提到维基百科上的文章数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多