praca_magisterska/dataset/generate_graph.py

116 lines
3.4 KiB
Python

import random
from pathlib import Path
def generate_tree_from_prufer_code(code):
L1 = {}
L2 = []
edges = []
for node in range(len(code)+2):
L2.append(node+1)
for node in L2:
L1[node] = 0
for node in code:
L1[node] += 1
for k in range(len(L1)):
current_node = L2[0]
counter = 1
if len(L2) > 2:
while L1[current_node] > 0:
current_node = L2[counter]
counter += 1
if code[k] < current_node:
edges.append([code[k], current_node])
else:
edges.append([current_node, code[k]])
L1[code[k]] -= 1
L2.remove(current_node)
edges.append([L2[0], L2[1]])
return edges
def generate_prufers_code(n: int):
code = []
for i in range(n-2):
code.append(random.randint(1, n))
return code
def generate_random_graph(n: int, edges_number: int, log=False):
code = generate_prufers_code(n)
edges = generate_tree_from_prufer_code(code)
edges_dict = {}
for index in range(len(edges)):
edges_dict[(edges[index][0], edges[index][1])] = True
while len(edges_dict) < edges_number:
node1 = random.randint(1, n)
node2 = random.randint(1, n)
while node1 == node2:
node2 = random.randint(1, n)
if node1 < node2:
edges_dict[(node1, node2)] = True
else:
if [node2, node1] not in edges:
edges_dict[(node2, node1)] = True
return edges_dict.keys()
def write_graph_to_file(graph, filename, path="graphs/"):
with open(path + filename, 'w') as file:
for edge in graph:
weight = random.randint(1, 100)
file.write(str(edge[0]) + " " + str(edge[1]) + " " + str(weight) + "\n")
file.write(str(edge[1]) + " " + str(edge[0]) + " " + str(weight) + "\n")
def read_graph_from_file(filename, path="graphs/"):
N = set()
A = {}
A_b = {}
w = {}
with open(path + filename, 'r') as file:
line = file.readline()
while line != '':
split = line.strip('\n').split(" ")
first_node = int(split[0])
second_node = int(split[1])
N.add(first_node)
N.add(second_node)
if first_node not in A.keys():
A[first_node] = [second_node]
else:
A[first_node].append(second_node)
if second_node not in A_b.keys():
A_b[second_node] = [first_node]
else:
A_b[second_node].append(first_node)
w[(first_node, second_node)] = int(split[2])
line = file.readline()
return N, A, A_b, w
if __name__ == '__main__':
n = [200, 500, 1_000, 2_000, 5_000, 10_000, 20_000, 50_000]
for k in [5]:
group = str(k) + "n"
print("generating graph group:", str(k) + "n")
for i in range(1, len(n)+1):
print("generating graphs group:", group, "with", n[i - 1], "nodes and", int(k * n[i - 1]), "edges")
p = "graphs/" + group + "/" + str(n[i-1]) + "/"
for j in range(1, 51):
print("graph:", j, "of", 50)
g = generate_random_graph(n[i-1], int(k * n[i - 1]), log=True)
f = "graph" + str(j)
Path(p).mkdir(parents=True, exist_ok=True)
write_graph_to_file(g, f, p)
print()