Romanchello-bit commited on
Commit
4919e19
·
1 Parent(s): 1c7b439

main core done but without sales

Files changed (5) hide show
  1. algorithms.py +52 -0
  2. benchmark_results.png +0 -0
  3. generator.py +13 -0
  4. graph_module.py +22 -0
  5. main.py +60 -0
algorithms.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ def bellman_ford_list(graph, start_node):
2
+ distances = {i: float('inf') for i in range(graph.num_vertices)}
3
+ distances[start_node] = 0
4
+ adj_list = graph.get_list()
5
+
6
+ # Relaxation steps
7
+ for _ in range(graph.num_vertices - 1):
8
+ changed = False
9
+ for u in adj_list:
10
+ for v, weight in adj_list[u]:
11
+ if distances[u] != float('inf') and distances[u] + weight < distances[v]:
12
+ distances[v] = distances[u] + weight
13
+ changed = True
14
+ if not changed:
15
+ break
16
+
17
+ # Negative cycle detection
18
+ for u in adj_list:
19
+ for v, weight in adj_list[u]:
20
+ if distances[u] != float('inf') and distances[u] + weight < distances[v]:
21
+ return None # Negative cycle detected
22
+
23
+ return distances
24
+
25
+ def bellman_ford_matrix(graph, start_node):
26
+ distances = {i: float('inf') for i in range(graph.num_vertices)}
27
+ distances[start_node] = 0
28
+ matrix = graph.get_matrix()
29
+ n = graph.num_vertices
30
+
31
+ # Relaxation steps
32
+ for _ in range(n - 1):
33
+ changed = False
34
+ for u in range(n):
35
+ for v in range(n):
36
+ weight = matrix[u][v]
37
+ if weight is not None:
38
+ if distances[u] != float('inf') and distances[u] + weight < distances[v]:
39
+ distances[v] = distances[u] + weight
40
+ changed = True
41
+ if not changed:
42
+ break
43
+
44
+ # Negative cycle detection
45
+ for u in range(n):
46
+ for v in range(n):
47
+ weight = matrix[u][v]
48
+ if weight is not None:
49
+ if distances[u] != float('inf') and distances[u] + weight < distances[v]:
50
+ return None # Negative cycle detected
51
+
52
+ return distances
benchmark_results.png ADDED
generator.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import random
2
+ from graph_module import Graph
3
+
4
+ def generate_random_graph(num_vertices, density):
5
+ graph = Graph(num_vertices, directed=True)
6
+ for u in range(num_vertices):
7
+ for v in range(num_vertices):
8
+ if u == v:
9
+ continue
10
+ if random.random() < density:
11
+ weight = random.randint(-2, 10)
12
+ graph.add_edge(u, v, weight)
13
+ return graph
graph_module.py ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class Graph:
2
+ def __init__(self, num_vertices, directed=True):
3
+ self.num_vertices = num_vertices
4
+ self.directed = directed
5
+ self.adj_matrix = [[None] * num_vertices for _ in range(num_vertices)]
6
+ self.adj_list = {i: [] for i in range(num_vertices)}
7
+
8
+ def add_edge(self, u, v, weight):
9
+ if 0 <= u < self.num_vertices and 0 <= v < self.num_vertices:
10
+ self.adj_list[u].append((v, weight))
11
+ self.adj_matrix[u][v] = weight
12
+ if not self.directed:
13
+ self.adj_list[v].append((u, weight))
14
+ self.adj_matrix[v][u] = weight
15
+ else:
16
+ raise ValueError(f"Vertex index out of bounds: {u}, {v}")
17
+
18
+ def get_matrix(self):
19
+ return self.adj_matrix
20
+
21
+ def get_list(self):
22
+ return self.adj_list
main.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ import matplotlib.pyplot as plt
3
+ from generator import generate_random_graph
4
+ from algorithms import bellman_ford_list, bellman_ford_matrix
5
+
6
+ def run_experiments():
7
+ sizes = [20, 50, 100, 200]
8
+ densities = [0.2, 0.5, 0.8]
9
+ results = {d: {'list': [], 'matrix': []} for d in densities}
10
+
11
+ print(f"{'Size':<10} {'Density':<10} {'List (s)':<15} {'Matrix (s)':<15}")
12
+ print("-" * 55)
13
+
14
+ for d in densities:
15
+ for n in sizes:
16
+ t_list, t_matrix = 0, 0
17
+ runs = 5
18
+ for _ in range(runs):
19
+ g = generate_random_graph(n, d)
20
+
21
+ start = time.perf_counter()
22
+ bellman_ford_list(g, 0)
23
+ t_list += (time.perf_counter() - start)
24
+
25
+ start = time.perf_counter()
26
+ bellman_ford_matrix(g, 0)
27
+ t_matrix += (time.perf_counter() - start)
28
+
29
+ avg_list = t_list / runs
30
+ avg_matrix = t_matrix / runs
31
+ results[d]['list'].append(avg_list)
32
+ results[d]['matrix'].append(avg_matrix)
33
+ print(f"{n:<10} {d:<10} {avg_list:.6f} {avg_matrix:.6f}")
34
+
35
+ # Plotting
36
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
37
+
38
+ for d in densities:
39
+ ax1.plot(sizes, results[d]['list'], marker='o', label=f'D={d}')
40
+ ax1.set_title("Bellman-Ford (List)")
41
+ ax1.set_xlabel("Number of Vertices")
42
+ ax1.set_ylabel("Time (seconds)")
43
+ ax1.legend()
44
+ ax1.grid(True)
45
+
46
+ for d in densities:
47
+ ax2.plot(sizes, results[d]['matrix'], marker='o', label=f'D={d}')
48
+ ax2.set_title("Bellman-Ford (Matrix)")
49
+ ax2.set_xlabel("Number of Vertices")
50
+ ax2.set_ylabel("Time (seconds)")
51
+ ax2.legend()
52
+ ax2.grid(True)
53
+
54
+ plt.tight_layout()
55
+ plt.savefig('benchmark_results.png')
56
+ print("\nBenchmark finished. Results saved to benchmark_results.png")
57
+ plt.show()
58
+
59
+ if __name__ == "__main__":
60
+ run_experiments()