Example #1
0
def run(do_print):
    tk=0
    tp=0
    for i in range(100):
        G,C,Gp,N,n=load_data_2('testing_graph_'+str(i)+'.txt')
        start=time.time()
        if do_print:
            print_kruskal(C,n,str(i))
        else:
            kruskal(C,n)
        tk=tk+time.time()-start
        n=G.shape[0]
        start=time.time()
        if do_print:
            print_prim(Gp,N,n,str(i))
        else:
            prim(Gp,N,n)
        tp=tp+time.time()-start
    tp=tp/100.0
    tk=tk/100.0
    print tp
    print tk
    f=open('runtime.txt','w')
    f.write('Prim: '+str(tp)+' seconds\nKruskal: '+str(tk)+' seconds')
    f.close()
    return
Example #2
0
def mst(matrix, s):
    for i in range(len(matrix)):
        matrix[i][i] = sys.maxint

    graph = Graph()
    for i in range(len(matrix)):
        for j in range(len(matrix)):
            graph.addEdge(i, j, matrix[i][j])
    prim(graph, graph.getVertex(s))
    sum = 0
    for each in graph:
        sum += each.getDistance()

    return sum
Example #3
0
def main():
    for filename in get_test_files():
        print("%s:" % filename, end=" ")
        with open(filename, "r") as fhandler:
            lines = fhandler.readlines()
        nb_edges = int(lines[0])
        edges = [
            (lambda s:
             (int(s[0]), int(s[1]), int(s[2])))(lines[i + 1].strip().split())
            for i in range(nb_edges)
        ]
        try:
            t1 = time.perf_counter()
            _, prim_c = prim(edges)
            t2 = time.perf_counter()
            _, kruskal_c = kruskal(edges)
            t3 = time.perf_counter()
        except Exception:
            print("runtime error")
        else:
            if prim_c != kruskal_c:
                print("KO (Prim: %d, Kruskal: %d)" % (prim_c, kruskal_c))
            else:
                print("OK (both %d)\t- %d edges\t"
                      "- Prim: %.3f ms, \tKruskal: %.3f ms" %
                      (prim_c, nb_edges, 1000 * (t2 - t1), 1000 * (t3 - t2)))
Example #4
0
def up_limit_dict(adj_list):
    """ 使用Prim 算法计算TSP下限,并给出(i,j)查询表 """

    N = len(adj_list)
    dist_dict = [ [ MAX_LENGTH for i in xrange(N) ] for j in xrange(N) ]
    (mst_weight, mst) = prim(adj_list)

    for i in xrange(N):
        for e in adj_list[i]:
            (weight, u, v) = e
            dist_dict[u][v] = weight
            dist_dict[v][u] = weight

    return (2*mst_weight, dist_dict)
Example #5
0
    def test_prim_str_vertices(self):

        graph = Graph()

        graph.add_edge(Edge(Vertex("A"), Vertex("D"), 2))
        graph.add_edge(Edge(Vertex("A"), Vertex("G"), 3))
        graph.add_edge(Edge(Vertex("A"), Vertex("B"), 1))
        graph.add_edge(Edge(Vertex("B"), Vertex("E"), 6))
        graph.add_edge(Edge(Vertex("B"), Vertex("F"), 7))
        graph.add_edge(Edge(Vertex("F"), Vertex("D"), 10))
        graph.add_edge(Edge(Vertex("F"), Vertex("C"), 12))
        graph.add_edge(Edge(Vertex("E"), Vertex("G"), 9))

        self.assertEqual(prim(graph), 31)
Example #6
0
def benchmark():
    n = 10**4
    m = 10 * n
    G = Graph.random_graph(n, m, weighted=True)

    begin = time.time()
    A = kruskal(G)
    end = time.time()
    print('* Kruskal  {:.5} s'.format(end - begin))
    print('-- total weight:', sum(G[u][v] for u, v in A))
    print()

    begin = time.time()
    B = prim(G)
    end = time.time()
    print('* Prim     {:.5} s'.format(end - begin))
    print('-- total weight:', sum(G[u][v] for u, v in B))
Example #7
0
    def test_prim_int_vertices(self):

        graph = Graph()

        graph.add_edge(Edge(Vertex(0), Vertex(1), 1))
        graph.add_edge(Edge(Vertex(0), Vertex(4), 1))
        graph.add_edge(Edge(Vertex(1), Vertex(0), 1))
        graph.add_edge(Edge(Vertex(1), Vertex(3), 1))
        graph.add_edge(Edge(Vertex(1), Vertex(4), 1))
        graph.add_edge(Edge(Vertex(1), Vertex(2), 1))
        graph.add_edge(Edge(Vertex(2), Vertex(3), 1))
        graph.add_edge(Edge(Vertex(2), Vertex(1), 1))
        graph.add_edge(Edge(Vertex(3), Vertex(1), 1))
        graph.add_edge(Edge(Vertex(3), Vertex(2), 1))
        graph.add_edge(Edge(Vertex(3), Vertex(4), 1))

        self.assertEqual(prim(graph), 4)
def run_equivalence_test(n, trace=False):
    """
    Compare all algorithms for the same input graph
    :param n:       size of the test graph
    :param trace:   print debug info is test failed
    :return True if test succeeds
    """

    t = timeit.default_timer()

    adj_list, vertex_list, edge_list = generate_graph(n)

    if trace:
        print 'Generate graph: {}'.format(timeit.default_timer() - t)
    t = timeit.default_timer()

    min_span_tree_boruvka = set(boruvka(adj_list))
    normalize_edge_list(min_span_tree_boruvka)

    if trace:
        print 'Boruvka: {}'.format(timeit.default_timer() - t)
    t = timeit.default_timer()

    min_span_tree_kruskal = set(kruskal(vertex_list, edge_list))

    if trace:
        print 'Kruskal: {}'.format(timeit.default_timer() - t)
    t = timeit.default_timer()

    min_span_tree_prim = build_mst_edge_list(prim(adj_list), adj_list)

    if trace:
        print 'Prim: {}'.format(timeit.default_timer() - t)

    success = min_span_tree_boruvka == min_span_tree_kruskal == min_span_tree_prim

    if not success and trace and n < 100:
        print 'TEST FAILED:'
        print 'Adjacency list: {}'.format(adj_list)
        print 'Edge and vertex list: {}'.format(edge_list)
        print 'Minimum spanning tree with Boruvka: {}'.format(min_span_tree_boruvka)
        print 'Minimum spanning tree with Kruskal: {}'.format(min_span_tree_kruskal)
        print 'Minimum spanning tree with Prim:    {}'.format(min_span_tree_prim)
        print '----------------------------------'

    return success
Example #9
0
def main():

    n = int(stdin.readline())

    g = graphy.Graph(n)
    text = read.readInput(n)
    limit = int(stdin.readline())

    g = read.diff(text, limit, g)

    vertices = read.inputHeap(n, limit)
    bh = binheap.binheap(n)
    bh.binheap_make(n, vertices)

    min = prim.prim(g, bh)
    for i in min:
        stdout.write(str(i[0]) + ' ' + str(i[1]) + '\n')
Example #10
0
def eulerPrim(n, s, G, input):
    tracemalloc.start()
    cost = 0
    k = 0
    v = s
    MST = [[] for _ in range(n)]
    T = prim(n, input, s)

    for i in range(len(T)):
        MST[i].append([T[i][1], 0])
        MST[T[i][1]].append([i, 0])

    to_visit = len(T) * 2
    vertices = []
    while to_visit > 0:
        vertices.append(v)
        u = -1
        vi = 3
        for edg in MST[v]:
            if edg[1] < 2 and edg[1] < vi:
                u = edg[0]
                vi = edg[1]
        idx = MST[v].index([u, vi])
        MST[v][idx][1] += 1
        idx = MST[u].index([v, vi])
        MST[u][idx][1] += 1
        v = u
        to_visit -= 1

    visited = [False for _ in range(n)]
    route = []
    prev = vertices[0]
    for el in vertices[1:]:
        if visited[el]:
            vertices.remove(el)
        else:
            visited[el] = True
            cost += G[prev][el]
            route.append(el)
        prev = el

    memory = tracemalloc.get_traced_memory()[1]
    tracemalloc.stop()
    return cost, memory, route, len(route)
Example #11
0
 def testMST(self):
     size = 50
     for _ in range(100):
         adjList = defaultdict(list)
         edges = []
         cnt = 0
         weights = range(size * (size - 1) / 2)
         random.shuffle(weights)
         for i in range(size):
             for j in range(i + 1, size):
                 adjList[i].append((j, weights[cnt]))
                 adjList[j].append((i, weights[cnt]))
                 edges.append((i, j, weights[cnt]))
                 cnt += 1
         parent = prim(adjList)
         edges = kruskal(size, edges)
         self.assertEqual(len(edges) + 1, len(parent))
         for u, v in edges:
             self.assertTrue(parent[u] == v or parent[v] == u)
Example #12
0
    def test_simple_graph_prim(self):

        S = {0, 1, 2, 3}
        A = {
            (0, 1): 2,
            (1, 0): 2,
            (0, 2): 1,
            (2, 0): 1,
            (1, 2): 2,
            (2, 1): 2,
            (2, 3): 3,
            (3, 2): 3
        }
        distances, predecessors = prim.prim(S, A, 0)
        self.assertEqual(distances, {0: 0, 1: 2, 2: 1, 3: 3})
        self.assertTrue(predecessors == {
                        0: None, 1: 0, 2: 0, 3: 2} 
                        or 
                        predecessors == {0: None, 1: 2, 2: 0, 3: 2})
def stoer_wagner(graph):
    assert isinstance(graph, UndirectedGraph)

    graph = graph.copy()
    min_cut = graph_helper.ARC_COST_LIMIT  # max possible

    for _ in xrange(len(graph) - 1):
        _, spanning_tree_edges = prim(graph)
        heaviest_edge = spanning_tree_edges[-1]  # it's supposed to be so

        # cut weight is sum of edges adjacent to last joined vertex
        v_last_joined = heaviest_edge[1]
        cut_weight = sum(
            graph.get_mark(v, v_last_joined)
            for v in graph.get_adjacent(v_last_joined))

        min_cut = min(min_cut, cut_weight)

        # flip the heaviest edge and merge incident vertices
        graph = graph_helper.merge_vertices(graph, *heaviest_edge)

    return min_cut
    def test_large_graph(self):
        nodes = range(1, 10)
        edges = [
            (1, 2, 4),
            (2, 1, 4),
            (1, 8, 8),
            (8, 1, 8),
            (2, 8, 11),
            (8, 2, 11),
            (2, 3, 8),
            (3, 2, 8),
            (3, 9, 2),
            (9, 3, 2),
            (3, 6, 4),
            (6, 3, 4),
            (3, 4, 7),
            (4, 3, 7),
            (4, 5, 9),
            (5, 4, 9),
            (4, 6, 14),
            (6, 4, 14),
            (5, 6, 10),
            (6, 5, 10),
            (6, 7, 2),
            (7, 6, 2),
            (7, 8, 1),
            (8, 7, 1),
            (7, 9, 6),
            (9, 7, 6),
            (8, 9, 7),
            (9, 8, 7)
        ]

        graph = (nodes, edges)
        mst = prim(graph, 1)
        cost = sum(weigth for _, __, weigth in mst)
        self.assertEquals(cost, 37)
Example #15
0
 def train(self, ratio=0.9):
     # input argument: cmi, split_ratio (default: 0.9(交叉验证比例))
     # output:
     # the parents node of each attribute node;
     # the bayes structure of TAN tree      (Tree-Augmented Naive Bayes)
     self.parents = par.prim(self.cmi, len(self.cmi))  # we get the parents of each node;
 def show_prim(self):
     text = prim(self.df)
     self.p_weight.setText(str(text))
Example #17
0
def prim():
    visualPrim.prim(listofEdges, listofVertexes, window)
import load_graph
import os
import matplotlib.pyplot as plt

dataset = [('ha30_dist.txt','ha30_name.txt'), ('sgb128_dist.txt','sgb128_name.txt'), ('wg59_dist.txt','wg59_name.txt')]


# Itera entre cada dataset
for data in dataset:
    G = load_graph.load_graph(os.path.abspath('..')+'\\ufscar-2014-graph-theory-task5a\\Datasets\\'+data[0],
                              os.path.abspath('..')+'\\ufscar-2014-graph-theory-task5a\\Datasets\\'+data[1])

    # Aplica o algoritmo de Prim para 10 árvores diferentes
    msts = []
    for i in range(10):
        T = prim(G)
        # Transforma o Grafo em um Digrafo e o coloca em um vetor de 10 posicoes
        mst_digraph = T.to_directed()
        msts.append((mst_digraph))

    # Aplica a busca de caminhos eulerianos

    # Verificacao que a arvore eh euleriana
    # if nx.is_eulerian(mst_digraph) == True:
    #    print "A arvore eh euleriana!"

    # Classe circuito que sera utilizada, ela tera dois atributos: peso e circuito.
    class circuito: pass

    # Criacao da lista de objetos da classe circuito, e a sua devida inicializacao
    circuitos_eulerianos = []
Example #19
0
        c = e.tuple_rep()
        plt.plot([x[0] for x in c], [x[1] for x in c], "b--")


# m => set of edges in mst
def plot_mst(m):
    for e in m:
        c = e.tuple_rep()
        plt.plot([x[0] for x in c], [x[1] for x in c], "b-")

if __name__ == "__main__":
    # base data
    graph, points = setup()

    # find the mst
    mst_prim = prim(graph, points, len(points))
    mst_kruskal = kruskal(graph)

    # metadata for Kruskal
    p1 = plt.subplot(221)
    p1.set_title("Kruskal")
    plt.ylim([-1, 5])
    plt.xlim([-1, 5])

    # basic
    plot_base(graph, points)

    # the goods
    plot_mst(mst_kruskal)

    # metadata for Prim
Example #20
0
import weighted_graph
import dijkstra
import prim

node_numbers = {'N1':0, 'N2':1, 'N3':2, 'N4':3}

G = weighted_graph.Graph(len(node_numbers))
for node in node_numbers:
  G.set_vertex(node_numbers[node],node)

G.add_edge(node_numbers['N1'],node_numbers['N2'],2)
G.add_edge(node_numbers['N1'],node_numbers['N4'],2)
G.add_edge(node_numbers['N2'],node_numbers['N3'],2)
G.add_edge(node_numbers['N3'],node_numbers['N4'],-4)

G.print_graph()

dijkstra.dijkstra(G,node_numbers['N1'])

print('****')

MST = prim.prim(G,node_numbers['N1'])
MST.print_graph()
Example #21
0
 def test_two(self):
     self.assertEqual(prim(10), [2, 3, 5, 7])
Example #22
0
 def test_three(self):
     self.assertEqual(prim(100), [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97])
Example #23
0
 def test_one(self):
     self.assertEqual(prim(2), [2])
}

G = weighted_graph.Graph(len(node_numbers))
for node in node_numbers:
    G.set_vertex(node_numbers[node], node)

G.add_edge(node_numbers['N1'], node_numbers['N2'], 3)
G.add_edge(node_numbers['N1'], node_numbers['N4'], 2)
G.add_edge(node_numbers['N1'], node_numbers['N3'], 3)

G.add_edge(node_numbers['N2'], node_numbers['N4'], 9)
G.add_edge(node_numbers['N2'], node_numbers['N5'], 4)
G.add_edge(node_numbers['N2'], node_numbers['N7'], 2)

G.add_edge(node_numbers['N3'], node_numbers['N4'], 4)
G.add_edge(node_numbers['N3'], node_numbers['N5'], 1)
G.add_edge(node_numbers['N3'], node_numbers['N7'], 6)
G.add_edge(node_numbers['N3'], node_numbers['N8'], 6)

G.add_edge(node_numbers['N4'], node_numbers['N6'], 1)

G.add_edge(node_numbers['N5'], node_numbers['N7'], 7)

G.print_graph()

print('Breadth First Traversal:')
G.breadth_first_traverse()

MST = prim.prim(G, node_numbers['N1'])
MST.print_graph()