繁体   English   中英

使用基于某些数据的节点和顶点构造图形

[英]Constructing graph using nodes and vertices based on some data

我正在使用邻接表示给出的有向图。 换句话说,图形G将由字典表示,其字符的键是顶点,其值是字典,其键是顶点的邻居,其值可以指定为1.给定两个顶点u,v在指向图G可能存在从u到v的边缘,但反之亦然。 然而,可能在两个方向上都存在边缘。

我创建了一个名为reachable_vertices的函数,它将图G和顶点v作为输入,并返回G中可以从v到达的所有顶点的列表。如果v可以到达顶点w这意味着有链v→v1→v2 ...→w,其中链中的每个顶点都有一条边到它后面的一个边。 顶点v不必具有特定类型,例如int或string,它可以是其中之一,它只需要是代表图G的字典中的键。

我已经定义了一个名为cfb_graph的函数,该函数不带参数。 我通过将团队视为顶点并在team1击败team2时在team1和team2之间创建优势,从文件cfb2010.csv(Link Below)中形成了一个有向图。 数据集链接= https://drive.google.com/open?id=1ZgNjH_QE7if1xHMfRU2-ebd9bNpL2E3d

cfb_graph将返回一个字典,给出这种表示。

我能够找到以下问题,我在下面附上我的代码:i。 奥本无法到达哪些球队。 将它们存储在列表中。 II。 可以从巴黎圣母院到达哪些团队。 将它们存储在列表中。 III。 哪些球队无法从阿拉巴马州到达。 将它们存储在列表中。

我正在处理以下代码:

def reachable(G, v, setA): # This function checks if it's possible to reach w from v
    setA|={v}
    try:
        for w in set(G[v])-setA:reachable(G,w,setA)
    except KeyError:
        donothing = 0   
    return setA    
##   2a ##
def reachable_vertices(G, v):
    setA=set()
    setA|={v}
    try:
        for n in set(G[v])-setA:reachable(G,n,setA)
    except KeyError:
        donothing = 0    
    return setA    

def cfb_graph():
    svertex = []
    evertex = []
    count= 0
    file = open("cfb2010.csv","r")
    for line in file:  
        fields = line.split(",")
        if fields[5].replace("\n", "") == 'W':
            svertex.append(fields[1])
            evertex.append(fields[2])
        if count == 0:
            count = count +1


    graph = {}
    for i in range(len(svertex)):
        v = svertex[i]
        if v in graph:
            graph[v] |= set([evertex[i]])
        else:
            graph[v] = set([evertex[i]])    

    for key, value in graph.items():
          graph[key] =  dict.fromkeys(value,1) 
    return(graph)


######Part 2 c############
auburn_answer = list(set(cfb_graph().keys()).difference(set(reachable_vertices(cfb_graph(), "Auburn"))))
notre_dame_answer = reachable_vertices(cfb_graph(), "Notre Dame")
alabama_answer = list(set(cfb_graph().keys()).difference(set(reachable_vertices(cfb_graph(), "Alabama"))))

特别是对于每个顶点,我想返回一个字典,其中键是可到达的顶点,并且值现在将被描述。 如果顶点w可从顶点v到达,则存在从v到w的路径。 在返回的字典中对应于w的值将是在从v到w的某个路径中紧接在其之前的顶点。 如果我使用队列方法,则w的值将是while循环中的第一个顶点u,其中w是u的邻居。

此外,我想定义一个名为path的函数,它将把图G和两个顶点v和w作为输入。 如果w可以从v到达,它将返回一个顶点列表,其第一个元素是v,其最后一个元素是w,其他顶点是从v到w的路径上的顶点,它们是遍历它们的顺序。 如果没有路径我应该返回None。 我可能想要使用上面定义的函数。

我想快速而强大的图形处理库networkx将对您有所帮助。 它具有大量的各种算法,因此您无法手动实现它,只需在代码中使用函数调用即可。

我构建了一个小工作流程,可以复制您的所有功能并解决您的问题:

# Imports
import networkx as nx
import csv

# Load CSV file and construct the directed graph
G = nx.DiGraph()
with open('cfb2010.csv', 'r') as f:
    sreader = csv.reader(f, delimiter=',')
    for line in sreader:
        if line[-1] != 'W':
            continue
        G.add_node(line[1])
        G.add_node(line[2])
        G.add_edge(line[1], line[2])

# Get all nodes
all_nodes = set(G.nodes())

# Get nodes that can be reached from the particular node
notredame_nodes = set(nx.bfs_tree(G, 'Notre Dame').nodes())
alabama_nodes = set(nx.bfs_tree(G, 'Alabama').nodes())
auburn_nodes = set(nx.bfs_tree(G, 'Auburn').nodes())

# Construct lists of nodes you need
print(all_nodes - alabama_nodes)
print(all_nodes - auburn_nodes)
print(notredame_nodes)

Networkx还有一个函数等于你的函数叫做路径函数:

print(nx.shortest_path(G, 'Florida', 'Illinois'))

['Florida', 'Penn St', 'Michigan', 'Illinois']

PS Reachable节点构造使用BFS算法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM