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
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