| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import psycopg2
- import random
- import numpy as np
- import matplotlib.pyplot as plt
- import networkx as nx
- # PostgreSQL ühenduse andmed
- db_params = {
- 'host': 'localhost',
- 'port': '5432',
- 'dbname': 'data',
- 'user': 'osm',
- 'password': 'osm'
- }
- # Ühendu andmebaasiga
- conn = psycopg2.connect(**db_params)
- cur = conn.cursor()
- # Lae graafi servad
- cur.execute("""
- SELECT id, source, target, cost FROM aaa_osm.osm_roads
- WHERE source IS NOT NULL AND target IS NOT NULL
- """)
- edges = cur.fetchall()
- # Ehita NetworkX graaf
- G = nx.DiGraph()
- for edge_id, source, target, cost in edges:
- G.add_edge(source, target, weight=cost)
- # Valime juhuslikud lähte- ja sihtpunktid
- nodes = list(G.nodes)
- num_pairs = 100
- random.seed(42)
- origins = random.sample(nodes, num_pairs)
- destinations = random.sample(nodes, num_pairs)
- # Määrame igale punktile "mass" (nt rahvaarv)
- P = {node: random.randint(100, 1000) for node in nodes}
- # Arvutame gravitatsioonimudeli T_ij = (P_i * P_j) / D_ij^2
- gravity_matrix = np.zeros((num_pairs, num_pairs))
- for i, origin in enumerate(origins):
- for j, dest in enumerate(destinations):
- if origin == dest:
- continue
- try:
- length = nx.shortest_path_length(G, source=origin, target=dest, weight='weight')
- gravity_matrix[i, j] = (P[origin] * P[dest]) / (length ** 2)
- except nx.NetworkXNoPath:
- gravity_matrix[i, j] = 0
- # Visualiseerime tulemuse
- plt.figure(figsize=(10, 8))
- plt.imshow(gravity_matrix, cmap='hot', interpolation='nearest')
- plt.colorbar(label='Gravitatsiooniline intensiivsus (T_ij)')
- plt.title('Gravitatsioonimudel (100 lähtekohta ja sihtkohta)')
- plt.xlabel('Sihtkoht')
- plt.ylabel('Lähtekoht')
- plt.tight_layout()
- plt.savefig("gravity_model_heatmap.png")
- plt.show()
- # Sulgeme ühenduse
- cur.close()
- conn.close()
|