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
예제 #3
0
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