我应该如何创建我的对象,以便它能很好地与networkx协同工作?

问题描述:

我试图设计一个需要全球定位数据的项目,例如城市和州名以及纬度和位置。我也会在每一对城市之间有距离。我想用所有这些信息制作一个图表,并操纵它来执行一些图表算法。我决定拥有包含每个位置数据的城市对象。现在我应该有一个散列函数来区分对象吗?我应该如何处理组合节点和移除边的图算法?我应该如何创建我的对象,以便它能很好地与networkx协同工作?

def minCut(self): 
    """Returns the lowest-cost set of edges that will disconnect a graph""" 

    smcut = (float('infinity'), None) 
    cities = self.__selectedcities[:] 
    edges = self.__selectededges[:] 
    g = self.__makeGRAPH(cities, edges) 
    if not nx.is_connected(g): 
     print("The graph is already diconnected!") 
     return 
    while len(g.nodes()) >1: 
     stphasecut = self.mincutphase(g) 
     if stphasecut[2] < smcut: 
      smcut = (stphasecut[2], None) 
     self.__merge(g, stphasecut[0], stphasecut[1]) 
    print("Weight of the min-cut: "+str(smcut[1])) 

它的形状非常糟糕。我正在重写我的原始程序,但这是我从以前的版本中采取的方法。

+0

怎么样一些示例代码? – Spaceghost 2011-01-19 18:54:23

根据您安装的networkx版本,可以使用min_cut的内置实现。

我安装了1.0RC1软件包,但没有提供..但我升级到1.4,min_cut在那里。

这里有一个(傻)例如:

import networkx as nx 
g = nx.DiGraph() 
g.add_nodes_from(['London', 'Boston', 'NY', 'Dallas']) 
g.add_edge('NY', 'Boston', capacity) 
g.add_edge('Dallas', 'Boston') 
g.add_edge('Dallas', 'London') 
# add capacity to existing edge 
g.edge['Dallas']['London']['capacity'] = 2 
# create edge with capacity attribute 
g.add_edge('NY', 'London', capacity=3) 
print nx.min_cut(g, 'NY', 'London') 

您不需要为城市对象创建哈希函数,您可以直接将城市对象传递给Networkx - 从教程“节点可以是任何可哈希对象,例如文本字符串,图像,XML对象,另一个Graph,一个自定义节点对象等。“

您可以遍历城市列表并将它们添加为节点,然后迭代距离信息以生成图形。

你看过教程吗? http://networkx.lanl.gov/tutorial/tutorial.html

+0

是的,我读过教程。我只是不知道如何处理节点,当我想在图表上执行一个最小切割算法时。 – Trim 2011-01-19 18:57:23

在合并节点时,您可以创建新节点并将这些新节点散列到已合并城市的列表中。例如,在上面的代码中,您可以命名新节点len(g),并将其散列到stphasecut [0] + stphasecut [1]#,假设stphasecut [1]和[2]是列表。