def dijkstra2(self, start): unvisited = Priority_Queue() unvisited.enqueue((0, start)) visited = set() distance = dict() infinity = 10000 prev = dict() for label in self.vertexList: distance[label] = infinity prev[label] = None distance[start] = 0 prev[start] = start while unvisited: initial_cost, label = unvisited.dequeue() visited.add(label) for neighbor, weight in self.vertexList[label].neighbors: if neighbor not in visited: cost = initial_cost + weight if cost < distance[neighbor]: distance[neighbor] = cost prev[neighbor] = label if neighbor not in unvisited: unvisited.enqueue((cost, neighbor)) else: unvisited[neighbor] = cost return distance, prev
def dijkstra(self, start, end): distance = dict() infinity = 10000 for label in self.vertexList: distance[label] = infinity distance[start] = 0 visited = set() minQueue = Priority_Queue() minQueue.enqueue((0, (start, start))) while minQueue: w, edge = minQueue.dequeue() if distance[edge[1]] > distance[edge[0]] + w: distance[edge[1]] = distance[edge[0]] + w if edge[1] not in visited: for label, weight in self.vertexList[edge[1]].neighbors: #print(label, weight, edge[1]) minQueue.enqueue((weight, (edge[1], label))) visited.add(edge[1]) # if distance[end] < infinity: # shorterpath = False # for weight, item in minQueue: # if item[0] < 12: # print(item[0], distance[item[0]]) # if distance[item[0]] < distance[end]: # shorterpath = True # break # if not shorterpath: # return distance[end] if distance[end] < infinity: return distance[end] else: return False
print(f'Oi kaliteres klasikes taksinomimenes me vasi tin mesi vathmologia tous: {omades.retrieveBestClassics()}') streaming1.setMeanRating(7.3) streaming2.setMeanRating(8.7) streaming3.setMeanRating(6.7) streaming4.setMeanRating(9.2) streaming5.setMeanRating(7.8) mainstream1 = Mainstream_Movie('Panic Room','David Fincher','Thriller',['Jodie Foster','Forest Whitaker'],2002) mainstream2 = Mainstream_Movie('Zodiac','David Fincher','Thriller',['Jake Gyllenhaal','Mark Ruffalo'],2007) mainstream3 = Mainstream_Movie('The Hobbit: An unexpected Journey','Peter Jackson','Adventure',['Martin Freeman','Ian Mckellen'],2012) mainstream1.setMeanRating(8.5) mainstream2.setMeanRating(8.8) mainstream3.setMeanRating(7.8) omades.addMainstream(mainstream1) omades.addMainstream(mainstream2) omades.addMainstream(mainstream3) print(f'Oi kalitera on demand movies taksinomimenes : {omades.retrieveBestMovies()}') # i stili group periexei to cluster sto opoio anikei o kathe xristis-allazei me diaforetikes ekteleseis tou algorithmou omades.Clustering() omades.retrieveRecommendedMovies(8,667) # cluster 8 gia ton user 667 omades.retrieveRecommendedClassics(1,4) # cluster 4 gia user 1 omades.retrieveRecommendedGenres(1) # ta genres pou protima o user 1 priority_queue = Priority_Queue() priority_queue.insertToPriorityQueue(client1) priority_queue.insertToPriorityQueue(client2) print(f'Pelates se oura anamonis: {priority_queue.getOnHold()}') # estw thelei kratisi gia tainia stis 22:30 print(f'Xronos pou apomenei mexri tin dinatotita kratisis: {priority_queue.calculateReservationTime(22,30,00)}')
def __init__(self, directed=False): self.vertexList = dict() self.edgeList = Priority_Queue() self.directed = directed
class Graph: def __init__(self, directed=False): self.vertexList = dict() self.edgeList = Priority_Queue() self.directed = directed class Node: def __init__(self, value): self.value = value class Vertex(Node): def __init__(self, value): super().__init__(value) self.neighbors = set() def addneighbor(self, vertex, weight): self.neighbors.add((vertex, weight)) def removeneighbor(self, label): for neighbor in self.neighbors: if neighbor[0] == label: self.neighbors.remove(neighbor) class Edge: def __init__(self, vertex1, vertex2, weight=0): self.vertex1 = vertex1 self.vertex2 = vertex2 self.weight = weight def __lt__(self, other): return self.weight < other.weight def __iter__(self): yield self.vertex1 yield self.vertex2 yield self.weight def addVertex(self, label, value=None): self.vertexList[label] = self.Vertex(value) def removeVertex(self, label): self.vertexList.pop(label) for vertex in self.vertexList.keys(): if label in vertex.neighbors: vertex.neighbors.remove(label) def addEdge(self, edge): (v1, v2, w) = edge self.edgeList.enqueue((w, self.Edge(v1, v2, w))) if v1 not in self.vertexList: self.addVertex(v1) if v2 not in self.vertexList: self.addVertex(v2) self.vertexList[v1].addneighbor(v2, w) if self.directed is False: self.vertexList[v2].addneighbor(v1, w) def removeedge(self, label1, label2): for item in self.edgeList: w, edge = item if edge[0] == label1 and edge[0] == label2: self.edgeList.dequeue(item) if self.directed is False: self.removeedge(label2, label1) def __repr__(self): return "Vertices" + repr(__dict__[self.vertexList]) + '\n' \ + "Edge" def dijkstra2(self, start): unvisited = Priority_Queue() unvisited.enqueue((0, start)) visited = set() distance = dict() infinity = 10000 prev = dict() for label in self.vertexList: distance[label] = infinity prev[label] = None distance[start] = 0 prev[start] = start while unvisited: initial_cost, label = unvisited.dequeue() visited.add(label) for neighbor, weight in self.vertexList[label].neighbors: if neighbor not in visited: cost = initial_cost + weight if cost < distance[neighbor]: distance[neighbor] = cost prev[neighbor] = label if neighbor not in unvisited: unvisited.enqueue((cost, neighbor)) else: unvisited[neighbor] = cost return distance, prev def dijkstra(self, start, end): distance = dict() infinity = 10000 for label in self.vertexList: distance[label] = infinity distance[start] = 0 visited = set() minQueue = Priority_Queue() minQueue.enqueue((0, (start, start))) while minQueue: w, edge = minQueue.dequeue() if distance[edge[1]] > distance[edge[0]] + w: distance[edge[1]] = distance[edge[0]] + w if edge[1] not in visited: for label, weight in self.vertexList[edge[1]].neighbors: #print(label, weight, edge[1]) minQueue.enqueue((weight, (edge[1], label))) visited.add(edge[1]) # if distance[end] < infinity: # shorterpath = False # for weight, item in minQueue: # if item[0] < 12: # print(item[0], distance[item[0]]) # if distance[item[0]] < distance[end]: # shorterpath = True # break # if not shorterpath: # return distance[end] if distance[end] < infinity: return distance[end] else: return False def bfs(self, start, end): SENTINEL = object() nodes_to_visit = [self.vertexList[start], SENTINEL] cnt = 0 while nodes_to_visit: node = nodes_to_visit.pop(0) if node is SENTINEL: cnt += 1 nodes_to_visit.append(SENTINEL) elif node == self.vertexList[end]: return cnt else: for vertex, _ in node.neighbors: nodes_to_visit.append(self.vertexList[vertex]) return False def bfs1(self, start, end): SENTINEL = object() nodes_to_visit = [start, SENTINEL] cnt = 0 while nodes_to_visit: node = nodes_to_visit.pop(0) if node is SENTINEL: cnt += 1 nodes_to_visit.append(SENTINEL) elif node == end: return cnt else: for vertex, _ in node.neighbors: nodes_to_visit.append(vertex) return False def minSpanTree(self): copyQueue = self.edgeList copyQueue = [edge for edge in self.edgeList] copyQueue.sort() #w, edge = copyQueue.dequeue() #print(edge.vertex1, edge.vertex2, edge.weight) #return self.partition = dict() self.vertexTree = dict() for vertex in self.vertexList: self.partition[vertex] = vertex self.vertexTree[vertex] = [] while copyQueue: w, currentEdge = copyQueue.pop(0) print(w) v1, v2, _ = currentEdge #print(v1,v2) if self.sameSetAndUnion(v1, v2): self.vertexTree[v1].append(v2) #yield self.vertexTree return self.vertexTree def sameSetAndUnion(self, v1, v2): #print('fn call', v1, v2) if self.partition[self.root(v1)] != self.partition[self.root(v2)]: #print(self.partition[v1], self.partition[v2]) self.partition[self.root(v2)] = self.partition[self.root(v1)] return True def root(self, vertex): while self.partition[vertex] != vertex: vertex = self.partition[vertex] return vertex