gravity_model_pgRouting.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import psycopg2
  2. import random
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import networkx as nx
  6. # PostgreSQL ühenduse andmed
  7. db_params = {
  8. 'host': 'localhost',
  9. 'port': '5432',
  10. 'dbname': 'data',
  11. 'user': 'osm',
  12. 'password': 'osm'
  13. }
  14. # Ühendu andmebaasiga
  15. conn = psycopg2.connect(**db_params)
  16. cur = conn.cursor()
  17. # Lae graafi servad
  18. cur.execute("""
  19. SELECT id, source, target, cost FROM aaa_osm.osm_roads
  20. WHERE source IS NOT NULL AND target IS NOT NULL
  21. """)
  22. edges = cur.fetchall()
  23. # Ehita NetworkX graaf
  24. G = nx.DiGraph()
  25. for edge_id, source, target, cost in edges:
  26. G.add_edge(source, target, weight=cost)
  27. # Valime juhuslikud lähte- ja sihtpunktid
  28. nodes = list(G.nodes)
  29. num_pairs = 100
  30. random.seed(42)
  31. origins = random.sample(nodes, num_pairs)
  32. destinations = random.sample(nodes, num_pairs)
  33. # Määrame igale punktile "mass" (nt rahvaarv)
  34. P = {node: random.randint(100, 1000) for node in nodes}
  35. # Arvutame gravitatsioonimudeli T_ij = (P_i * P_j) / D_ij^2
  36. gravity_matrix = np.zeros((num_pairs, num_pairs))
  37. for i, origin in enumerate(origins):
  38. for j, dest in enumerate(destinations):
  39. if origin == dest:
  40. continue
  41. try:
  42. length = nx.shortest_path_length(G, source=origin, target=dest, weight='weight')
  43. gravity_matrix[i, j] = (P[origin] * P[dest]) / (length ** 2)
  44. except nx.NetworkXNoPath:
  45. gravity_matrix[i, j] = 0
  46. # Visualiseerime tulemuse
  47. plt.figure(figsize=(10, 8))
  48. plt.imshow(gravity_matrix, cmap='hot', interpolation='nearest')
  49. plt.colorbar(label='Gravitatsiooniline intensiivsus (T_ij)')
  50. plt.title('Gravitatsioonimudel (100 lähtekohta ja sihtkohta)')
  51. plt.xlabel('Sihtkoht')
  52. plt.ylabel('Lähtekoht')
  53. plt.tight_layout()
  54. plt.savefig("gravity_model_heatmap.png")
  55. plt.show()
  56. # Sulgeme ühenduse
  57. cur.close()
  58. conn.close()