当前位置: 首页>>代码示例>>Python>>正文


Python networkx.eulerian_circuit函数代码示例

本文整理汇总了Python中networkx.eulerian_circuit函数的典型用法代码示例。如果您正苦于以下问题:Python eulerian_circuit函数的具体用法?Python eulerian_circuit怎么用?Python eulerian_circuit使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。


在下文中一共展示了eulerian_circuit函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: calc_euler_tour

def calc_euler_tour(g, start, end):
    '''Calculates an Euler tour over the graph g from vertex start to vertex end.
    Assumes start and end are odd-degree vertices and that there are no other odd-degree
    vertices.'''
    even_g = nx.subgraph(g, g.nodes())
    if end in even_g.neighbors(start):
        # If start and end are neighbors, remove the edge
        even_g.remove_edge(start, end)
        comps = list(nx.connected_components(even_g))
        # If the graph did not split, just find the euler circuit
        if len(comps) == 1:
            trail = list(nx.eulerian_circuit(even_g, start))
            trail.append((start, end))
        elif len(comps) == 2:
            subg1 = nx.subgraph(even_g, comps[0])
            subg2 = nx.subgraph(even_g, comps[1])
            start_subg, end_subg = (subg1, subg2) if start in subg1.nodes() else (subg2, subg1)
            trail = list(nx.eulerian_circuit(start_subg, start)) + [(start, end)] + list(nx.eulerian_circuit(end_subg, end))
        else:
            raise Exception('Unknown edge case with connected components of size {0}:\n{1}'.format(len(comps), comps))
    else:
        # If they are not neighbors, we add an imaginary edge and calculate the euler circuit
        even_g.add_edge(start, end)
        circ = list(nx.eulerian_circuit(even_g, start))
        try:
            trail_start = circ.index((start, end))
        except:
            trail_start = circ.index((end, start))
        trail = circ[trail_start+1:] + circ[:trail_start]
    return trail
开发者ID:casotto,项目名称:gfl,代码行数:30,代码来源:trails.py

示例2: test_eulerian_circuit_cycle

    def test_eulerian_circuit_cycle(self):
        G=nx.cycle_graph(4)

        edges=list(eulerian_circuit(G,source=0))
        nodes=[u for u,v in edges]
        assert_equal(nodes,[0,1,2,3])
        assert_equal(edges,[(0,1),(1,2),(2,3),(3,0)])

        edges=list(eulerian_circuit(G,source=1))
        nodes=[u for u,v in edges]
        assert_equal(nodes,[1,0,3,2])
        assert_equal(edges,[(1,0),(0,3),(3,2),(2,1)])
开发者ID:123jefferson,项目名称:MiniBloq-Sparki,代码行数:12,代码来源:test_euler.py

示例3: tsp_mstheuristic

def tsp_mstheuristic( graph, depot ) :
    # the simple MST heurisitc, should exhibit the right rate of growth at least
    mst = nx.minimum_spanning_tree( graph, weight='weight' )
    gg = nx.MultiGraph()
    gg.add_edges_from( mst.edges_iter() )
    gg.add_edges_from( mst.edges_iter() )
    circuit = nx.eulerian_circuit( gg, depot )
    tour = []
    for i,j in nx.eulerian_circuit( gg, depot ) :
        if i not in tour :
            tour.append( i )
    tour.append( depot )
    return tour
开发者ID:DiNAi,项目名称:vehicle-routing,代码行数:13,代码来源:travelingsalesman.py

示例4: test_eulerian_circuit_digraph

    def test_eulerian_circuit_digraph(self):
        G=nx.DiGraph()
        nx.add_cycle(G, [0, 1, 2, 3])

        edges=list(eulerian_circuit(G,source=0))
        nodes=[u for u,v in edges]
        assert_equal(nodes,[0,1,2,3])
        assert_equal(edges,[(0,1),(1,2),(2,3),(3,0)])

        edges=list(eulerian_circuit(G,source=1))
        nodes=[u for u,v in edges]
        assert_equal(nodes,[1,2,3,0])
        assert_equal(edges,[(1,2),(2,3),(3,0),(0,1)])
开发者ID:4c656554,项目名称:networkx,代码行数:13,代码来源:test_euler.py

示例5: eulerian_path

def eulerian_path(g, algorithm="Fleury"):
    """Return a Eulerian path for the semi-eulerian graph ``g``.

    Parameters
    ----------
    g : nx.DiGraph, nx.MultiDiGraph
        The input graph. The graph must be semi-Eulerian.
    algorithm : {'Fleury', 'Hierholzer'}, optional
        Which algorithm to use to find the path. Hierholzer is faster
        but has the distinct disadvantage that I haven't implemented
        it yet. =P

    Returns
    -------
    edges_iter : iterator of edges
        An Eulerian path of ``g``.

    Notes
    -----
    An Eulerian path is one that visits every edge in a graph exactly
    once.
    """
    source, sink = _source_and_sink(g)
    g.add_edge(sink, source)
    edges_iter = nx.eulerian_circuit(g, source=source)
    return edges_iter
开发者ID:thomas-coudrat,项目名称:streaming-talk,代码行数:26,代码来源:nxeuler.py

示例6: plot_puzzle_graph

def plot_puzzle_graph(G, pos, diff_degree=2., amp=1., scale=1.5, steps=100, **params):
    """ Turn graph into puzzle, by making a line for each edge
    
    if the edge has an attribute for 'invisible_line' set to True skip
    it and if the edge has an attrible for 'straight_line' set to
    True, don't make a nub
    """
    # add matching on odd degree nodes (with 'blank' as a hacky vtx in
    # the middle to make sure the degree really increases
    odd_nodes = [v for v in G if len(G[v])%2 == 1]
    for u,v in zip(odd_nodes[::2], odd_nodes[1::2]):
        midpt = 'mid_%s_%s' % (u,v)
        G.add_edge(u, midpt, invisible_line=True)
        G.add_edge(midpt, v, invisible_line=True)

    for u, v in nx.eulerian_circuit(G):
        if G[u][v].get('invisible_line'):
            continue

        if G[u][v].get('straight_line'):
            plot_line(pos[u], pos[v], **params)
        else:
            if random.random() > .5:
                plot_nub(pos[u], pos[v], diff_degree, amp, scale, steps, **params)
            else:
                plot_nub(pos[v], pos[u], diff_degree, amp, scale, steps, **params)
开发者ID:aflaxman,项目名称:pymc-gp-puzzle,代码行数:26,代码来源:graphics.py

示例7: POSTPROCESS

 def POSTPROCESS(cls, digraph_eul, A ) :
     """
     This implementation is different than what is specified in FHK.
     It simply returns an ordering of arcs in A.
     The process of moving from arc to arc by shortest paths should be straightforward.
     (Nevertheless, the steps of FHK are written below in comments.)
     """
     # Step 1: Given a set of arcs and edges with associated direction,
     # from which a tour can be constructed, find the tour.
     
     # Step 2: For any series of two or more consecutive edges in the tour,
     # replace them with one edge, thus eliminating intermediate vertices. (???)
     
     # Step 3: For any two vertices vi and vj anchoring an edge in the tour,
     # insert any vertices that would create a shorter path between vi and vj.
     # (Undo Step 2 of PREPROCESS.)
     
     # Step 4: List the tour beginning at vs, the initial vertex, and finishing at vf,
     # the terminal vertex.
     
     # Alternative Method:
     arcs = {}
     for arc in A.edges( keys=True ) :
         arcs.setdefault( arc[:2], [] ).append( arc )
         
     new_walk = []
     for edge in nx.eulerian_circuit( digraph_eul ) :
         if edge in arcs :
             longver = arcs[edge]
             new_walk.append( longver.pop(0) )
             if len( longver ) <= 0 : del arcs[edge]
     return new_walk
开发者ID:DiNAi,项目名称:vehicle-routing,代码行数:32,代码来源:stackercrane.py

示例8: generatePath

def generatePath(G):
    even_v = []
    MST = nx.minimum_spanning_tree(G)
    for v in MST.nodes():
        if len(MST.neighbors(v)) % 2 == 0:
            even_v.append(v)
    O = G.copy()
    for v in even_v:
        O.remove_node(v)
    matching = []
    while len(O.edges()) > 1:
        minEdge = findMinEdge(O)
        O.remove_node(minEdge[0])
        O.remove_node(minEdge[1])
        matching.append(minEdge)
    MST = nx.MultiGraph(MST)
    MST.add_weighted_edges_from(matching)
    eulerTour = list(nx.eulerian_circuit(MST))
    MST = nx.Graph(MST)
    maxEdge = findMaxEdge(MST)
    rudrataPath = findEulerPath(maxEdge, eulerTour) #eulerPath
    swap = nx.Graph()
    swap.add_nodes_from(MST.nodes(data=True))
    swap.add_weighted_edges_from([(u, v, G[u][v]['weight']) for (u, v) in rudrataPath])
    if len(swap.nodes()) > 4:
        swap = double_edge_swap(G, swap, nswap=2000, max_tries=10000)
    path = edgesToPath(swap.edges())
    problems = pathCheck(G, path)
    if problems > 0:
        path = CHEAT(G)
    TSP = ''
    for v in path:
        TSP += str(v) + ' '
    return TSP[:-1] # gets rid of final space
开发者ID:dkoh12,项目名称:christofides,代码行数:34,代码来源:christofides.py

示例9: twice_around

    def twice_around(self, source=None):
        if source is None:
            source = np.random.choice(self.graph.nodes())

        T = self.extract_mst(TSP.MST.PRIM)
        T = nx.MultiGraph(T)

        T.add_edges_from(T.edges(data=True))
        
        eulerian_circuit = nx.eulerian_circuit(T, source)

        visited = []
        hamiltonian_path = []

        for u,v in eulerian_circuit:
            if u not in visited:
                visited.append(u)
                hamiltonian_path.append(u)

        hamiltonian_path.append(hamiltonian_path[0])

        hamiltonian_graph = nx.create_empty_copy(self.graph)

        for i in range(len(hamiltonian_path)-1):
            edge = (hamiltonian_path[i], hamiltonian_path[i+1])
            hamiltonian_graph.add_edge(*edge, self.graph.get_edge_data(*edge))
            
        return (hamiltonian_graph, hamiltonian_path)
开发者ID:falcaopetri,项目名称:GraphTheoryAtUFSCar,代码行数:28,代码来源:tsp.py

示例10: christofides

def christofides(graph_x, subset_graph):  
    t0 = time.clock() 
    subset_n = neighbours(subset_graph)
    graph_comp = makecomplete(subset_n, graph_x)
    newEdges = missing_edges(subset_n)
    simp = simplify_complete(graph_comp,newEdges)
 
    perfect_matching = call_blossom(subset_n,simp)
    subset_plus_comp = subset_n.copy()
    allGraph = nx.MultiGraph(subset_plus_comp)
    for edge in perfect_matching:
        allGraph.add_weighted_edges_from([(edge[0],edge[1],
            graph_comp[edge[0]][edge[1]]['weight'])])
	
    mst_edges = match_components(subset_n,simp,graph_x)
    final = allGraph.copy()
    for edge in mst_edges:
	final.add_weighted_edges_from([(edge[0],edge[1],
            graph_comp[edge[0]][edge[1]]['weight'])])
	final.add_weighted_edges_from([(edge[0],edge[1],
            graph_comp[edge[0]][edge[1]]['weight'])])

    tour = list(nx.eulerian_circuit(final))
    t1 = time.clock()
    results = list()
    results.append(tour_cost(tour, graph_comp))
    runtime = t1 - t0
    results.append(runtime)
    results.append(tour_cost(tour, graph_comp))
    results.append(runtime)
    results.append(check_solution(tour,graph_x,subset_graph))
    print(tour)
    print(results)
    return results
开发者ID:dreamsInDigital,项目名称:postman,代码行数:34,代码来源:alg2.py

示例11: eulerian_circuit

def eulerian_circuit(graph):
    circuit = list(nx.eulerian_circuit(graph))
    nodes = []
    for u, v in circuit:
        nodes.append(u)
    # Close the loop
    nodes.append(circuit[0][0])
    return nodes
开发者ID:wallarelvo,项目名称:TVD,代码行数:8,代码来源:postman.py

示例12: ROUTEINSPECTION

def ROUTEINSPECTION( graph, weight_attr='length' ) :
    """
    input graph should be a roadmap, i.e., a weighted multi-digraph;
    however, the algorithm assumes no one-way roads
    """
    workgraph = nx.MultiGraph()
    
    # add an original copy of every edge to the workgraph
    for u, v, key in graph.edges_iter( keys=True ) :
        workgraph.add_edge( u, v, (ORIGINAL,key) )
        
    # if non-Eulerian, add joining paths between odd-degree vertices
    T = ODDNODES( graph )
    # metric graph
    met = nx.Graph()
    for s in T :
        for t in T :
            if t == s : continue
            path = nx.shortest_path( graph, s, t, weight=weight_attr )
            pathlen = PATHLEN( path, graph, weight_attr )
            # use weight attribute for matching, want min cost!
            met.add_edge( s, t, weight=-pathlen, path=path )
    match = nx.max_weight_matching( met, maxcardinality=True )
    
    extras = itertools.count()
    while len( match ) > 0 :
        s, t = match.iteritems().next()
        del match[s]
        del match[t]    # have to kill both ends
        
        path = met.get_edge_data(s,t).get('path')
        for u,v in zip( path[:-1], path[1:] ) :
            #edgekey = SHORTESTEDGE(u,v, graph, weight_attr )
            #idx = len( extras )
            #extras.append(edgekey)
            idx = extras.next()
            workgraph.add_edge(u,v, (EXTRA,idx) )
            
    #return workgraph

    # traverse
    walk = []
    
    for u, v in nx.eulerian_circuit( workgraph ) :
        edge_data = workgraph.get_edge_data(u,v)
        which, key = datakey = edge_data.iterkeys().next()
        workgraph.remove_edge(u,v, datakey )
        
        if which == ORIGINAL :
            edge_key = key
        elif which == EXTRA :
            edge_key = SHORTESTEDGE(u,v, graph, weight_attr )
        
        if not len( walk ) > 0 :
            walk.append(u)
        walk.extend([edge_key,v])
        
    return walk
开发者ID:DiNAi,项目名称:vehicle-routing,代码行数:58,代码来源:routeinspection.py

示例13: test_eulerian_circuit_multigraph

 def test_eulerian_circuit_multigraph(self):
     G=nx.MultiGraph()
     nx.add_cycle(G, [0, 1, 2, 3])
     G.add_edge(1,2)
     G.add_edge(1,2)
     edges=list(eulerian_circuit(G,source=0))
     nodes=[u for u,v in edges]
     assert_equal(nodes,[0,3,2,1,2,1])
     assert_equal(edges,[(0,3),(3,2),(2,1),(1,2),(2,1),(1,0)])
开发者ID:4c656554,项目名称:networkx,代码行数:9,代码来源:test_euler.py

示例14: euler_path

def euler_path(graph: nx.DiGraph, func=genome_path_string) -> list:
    edge = balance_graph(graph)
    if not nx.is_eulerian(graph):
        raise ValueError("Not Eulerian: {0}".format(graph))

    circuit = list(nx.eulerian_circuit(graph, edge[1]))
    #print("asdf {0}".format(circuit))
    #return [ func(x) for x in circuit ]
    return [x[0] for x in circuit] + [ circuit[0][0] ]
开发者ID:msanders,项目名称:bio,代码行数:9,代码来源:graph.py

示例15: test_multigraph_with_keys

 def test_multigraph_with_keys(self):
     G = nx.MultiGraph()
     nx.add_cycle(G, [0, 1, 2, 3])
     G.add_edge(1, 2)
     G.add_edge(1, 2)
     edges = list(eulerian_circuit(G, source=0, keys=True))
     nodes = [u for u, v, k in edges]
     assert_equal(nodes, [0, 3, 2, 1, 2, 1])
     assert_equal(edges[:2], [(0, 3, 0), (3, 2, 0)])
     assert_count_equal(edges[2:5], [(2, 1, 0), (1, 2, 1), (2, 1, 2)])
     assert_equal(edges[5:], [(1, 0, 0)])
开发者ID:jianantian,项目名称:networkx,代码行数:11,代码来源:test_euler.py


注:本文中的networkx.eulerian_circuit函数示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。