prim.py (4132B)
1 import pygame 2 import time 3 import heapq 4 import random 5 import statistics 6 import math 7 8 pygame.init() 9 display = pygame.display.set_mode((5120,1440)) 10 11 fts = [] 12 first_time = [] 13 14 VERTICES = 2500 15 EDGES = 25000 16 17 white = (255, 255, 255) 18 red = (255, 0, 0) 19 black = (0, 0, 0) 20 grey = (100,100,100) 21 light_grey = (50,50,50) 22 23 24 class Vertex(): 25 def __init__(self, x, y): 26 self.x = x 27 self.y = y 28 self.visited = False 29 def draw_vertex(self,display): 30 if self.visited: 31 pygame.draw.circle(display, white, (self.x,self.y), 5) 32 else: 33 pygame.draw.circle(display, grey, (self.x,self.y), 5) 34 class Edge(): 35 def __init__(self, v1, v2): 36 self.v1 = v1 37 self.v2 = v2 38 self.dist = math.sqrt(((v1.x - v2.x) ** 2) + ((v1.y - v2.y) ** 2)) 39 def draw_edge(self,display, c): 40 pygame.draw.line(display, c, (self.v1.x,self.v1.y), (self.v2.x,self.v2.y), 1) 41 42 def __lt__(self,otr): 43 return self.dist < otr.dist 44 45 for _ in range(0,10): 46 47 graph = {} 48 49 for i in range(0,VERTICES): 50 x = random.random() * 5120 51 y = random.random() * 1440 52 graph[Vertex(x,y)] = [] 53 54 55 edge_list = [] 56 keys = list(graph.keys()) 57 58 for i in range(0,EDGES): 59 k1 = None 60 k2 = None 61 while k1 == k2: 62 k1 = random.choice(keys) 63 k2 = random.choice(keys) 64 65 edge = Edge(k1,k2) 66 graph[k1].append(edge) 67 graph[k2].append(edge) 68 edge_list.append(edge) 69 70 71 edge_heap = [] 72 visited_vertices = set() 73 74 75 start = random.choice(keys) 76 start.visited = True 77 visited_vertices.add(start) 78 for edge in graph[start]: 79 heapq.heappush(edge_heap, edge) 80 81 82 first = True 83 84 to_draw_vert = [] 85 to_draw_edge = [] 86 87 while True: 88 for event in pygame.event.get(): 89 if event.type == pygame.QUIT: 90 pygame.quit() 91 quit() 92 93 if first: 94 start = time.monotonic_ns() 95 display.fill(black) 96 97 edge_times = [] 98 vertex_times = [] 99 100 for edge in edge_list: 101 se = time.monotonic_ns() 102 edge.draw_edge(display, light_grey) 103 ee = time.monotonic_ns() 104 edge_times.append(ee - se) 105 106 for vertex in graph: 107 sv = time.monotonic_ns() 108 vertex.draw_vertex(display) 109 ev = time.monotonic_ns() 110 vertex_times.append(ev - sv) 111 112 pygame.display.update() 113 end = time.monotonic_ns() 114 first_time.append(end - start) 115 first = False 116 print("Edge time avg: " + str(sum(edge_times) / len(edge_times))) 117 print("Vertex time avg: " + str(sum(vertex_times) / len(vertex_times))) 118 continue 119 120 item = None 121 while edge_heap: 122 candidate = heapq.heappop(edge_heap) 123 if (candidate.v1 in visited_vertices) != (candidate.v2 in visited_vertices): 124 item = candidate 125 break 126 127 if item is None: 128 break 129 130 new_vertex = item.v2 if item.v1 in visited_vertices else item.v1 131 visited_vertices.add(new_vertex) 132 new_vertex.visited = True 133 134 to_draw_vert.append(new_vertex) 135 to_draw_edge.append(item) 136 137 for edge in graph[new_vertex]: 138 if not edge.v1 in visited_vertices or not edge.v2 in visited_vertices: 139 heapq.heappush(edge_heap, edge) 140 141 start = time.monotonic_ns() 142 for edge in to_draw_edge: 143 edge.draw_edge(display, white) 144 for vert in to_draw_vert: 145 vert.draw_vertex(display) 146 pygame.display.update() 147 end = time.monotonic_ns() 148 149 fts.append(end - start) 150 151 to_draw_vert = [] 152 to_draw_edge = [] 153 154 155 156 157 print("Average frame time (ns): " + str(sum(fts) / len(fts))) 158 print("Std. deviation frame time (ns): " + str(statistics.stdev(fts))) 159 160 print("Average first frame time (ns): " + str(sum(first_time) / len(first_time))) 161 print("Std. deviation first frame time (ns): " + str(statistics.stdev(first_time))) 162