我已经实现的未加权的随机行走功能的图表,我建Python使用NetworkX.以下是一段代码我的程序,处理随机走。在其他地方,在我的程序,我有一个方法,创造了图表,我有一个方法,模拟各种定制图的测试方法,我写了。这些图的测试方法挑选的两个节点随机从图表和运行一个随机走之间他们两个。这两件事情,都是正在计算,从这个随机的路程被击中时间(在数量链接走过从开始到结束点)和上下班时间(在数量遍历的链接,从开始到结束,并回到起始点)。

def unweighted_random_walk(starting_point,ending_point, graph):
    '''
    starting_point: String that represents the starting point in the graph
    ending_point: String that represents the ending point in the graph
    graph: A NetworkX Graph object
    '''
    ##Begin the random walk
    current_point=starting_point
    #current_node=graph[current_point]
    current_point_neighors=graph.neighbors(current_point)
    hitting_time=0

    #Determine the hitting time to get to an arbitrary neighbor of the
    #starting point
    while current_point!=ending_point:
        #pick one of the edges out of the starting_node with equal probs
        possible_destination=current_point_neighbors[random.randint(0,current_point_neighors)]
        current_point=possible_destination
        current_point_neighbors=graph.neighbors(current_point)
        hitting_time+=1
    return hitting_time

我的代码随机走的是相当直接的因为我只是随机挑选的节点,直到结束点为止。然而,这一目前的执行非常缓慢时,我尝试运行几个随意走(我认为我需要运行一百万在某一点)。

我的问题是:是否有任何办法,我可以使用MapReduce并行的一些操作,将在这里对这一随意走走吗是否有更好的办法让我做我的随意走走吗

有帮助吗?

解决方案

解决你的问题:

  1. 你需要地址Ned的评论。他击败了我这样说。解释一下你的代码;后来更多。

  2. 我不能理解一个走的算法,可能是并行运行。通过他们的非常性质,他们是每个线性过程;每个步骤上取决于以前。你不可能知道下一步是什么节点跳不知道以前的节点(除了开始节点)。如果你的代码确实表示随意走这里的选择是所有独立的以前的,你需要解释的是,在你的问题。

  3. 假设每个随行的是独立的,但是,你 可以 运行许多随意走同时进行。我们呼吁这种情况下 embarassingly平行, ,这是一个非常幸运的事情。

  4. 我不知道你为什么要使用中挖掘价值具体地说,在这里。第一步应该是,"我可以写这作为一个基本的程序和使用qsub(或相等的)脚本到农场了一堆的运行这个程序的服务器上?" 如果答案是否定的,下一个步骤是,"我可以用的 多处理模块?" 如果你去处理,你可能想看一看 杰西Noller是多进程的介绍,从2009年PyCon.

现在,关于你的特别代码...

  1. 你需要解释什么节点在你的曲线图。我很困惑为什么你把他们像一个典(叫 .keys())。如果他们的字典,告诉我们什么钥匙和价值观。我希望你不存储邻居的关键,因为NetworkX已经给你,通过 Graph.neighbors() 法。如果你存在的邻国中的节点点自己,你有一个误解的NetworkX图书馆。让图做的工作。

  2. 你有同样的逻辑两次 unweighted_random_walk(), 一旦旅行从一开始节点到目的地点,然后再为目的节点,以开始节点。为什么?所有你需要的是在逻辑为一个方向。叫这个函数的两倍。叫它开始和目的地点作为参数来获得方向的一种方法,然后交换顺序的论点是目的地后开始变得走另一个方向。那么你有两个独立的呼吁,现在可以运行这些并行进行。

  3. 不要用 while True:—不只是在这里,但是一般。你总是应该指示的实际情况下继续。例如,

    while current_point != ending_point:
        ...
    
  4. 不返回串的信息,返回的信息。例如,

    return hitting_time
    

    注意通过以下我建议在第2点直接上面,你只需要返回的撞击时间,总和的撞击时间有电话和后呼吁得到的总的上下班时间。方便的,对吗?

也参看

编辑: 包括链接到杰西Noller的介绍和迪斯科舞厅。

其他提示

我不知道怎么的map-reduce可以帮助你。它用在你有两部分操作:第一部分是可以独立于许多不同的数据元素进行计算,而第二部分以某种方式结合所有这些结果。也许有使用一个聪明的办法的map-reduce,以帮助这个随机游走,但我没有看到它。

您随机游走完全是随机的:它可能最终与很多圈,继续之前相同的两个节点之间跳跃,甚至来回。也许你想以某种方式限制它,这样你就不会有这么大的空间来搜索?

您不必如果您使用的本文

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top