def get_random_flow_network(N: int) -> DirectedGraph:
        """
        Losowa sieć przepływu
        N - liczba warstw sieci
        źródło - Node #1
        ujście - Node #len(graph)
        """
        assert N >= 2

        print(f"liczba warstw: {N}")

        # krok 1: tworzenie warstw
        node_count_in_layer = [1] + [random.randint(2, N) for _ in range(N)] + [1]

        node_layer = [None]
        layer_nodes = []

        total = 1
        for i, count in enumerate(node_count_in_layer):
            node_layer.extend([i] * count)
            layer_nodes.append(list(range(total, total + count)))
            total += count

        print(f"liczba wierzchołków w warstwie: {node_count_in_layer}")
        print(f"wierzchołki w warstwie: {layer_nodes}")

        # krok 2: losowanie krawędzi między warstwami
        g = DirectedGraph(size=sum(node_count_in_layer))

        for i in range(1, N + 1):
            for node in layer_nodes[i]:
                # losowa krawędź wchodząca
                g.connect(random.choice(layer_nodes[i - 1]), node)
                # losowa krawędź wychodząca
                g.connect(node, random.choice(layer_nodes[i + 1]))

        # krok 3: odajemy 2N losowych łuków

        edges_added = 0
        while edges_added < 2 * N:
            # brak krawędzi wychodzącej z ujścia
            n1 = random.randint(1, len(g) - 1)
            # brak krawędzi wchodzącej do źródła
            n2 = random.randint(2, len(g))
            if n1 == n2 or g.is_connected(n1, n2) or g.is_connected(n2, n1):
                continue
            g.connect(n1, n2)
            edges_added += 1
        # krok 4: przypisanie każdej krawędzi losowej przepustowości
        g.assign_random_weights()

        return g
示例#2
0
def load_graph_to_work_on(args):
    g = DirectedGraph()

    if args.load:
        g.load(args.load)

    elif args.n:
        g.add_nodes(int(args.n))
        if args.l:
            g.add_random_edges(int(args.l))
        elif args.p:
            g.connect_random(float(args.p))

    if args.w is not None:
        if args.w[0]:
            g.assign_random_weights(int(args.w[0][0]), int(args.w[0][1]))
        else:
            g.assign_random_weights()
    return g