Exemple #1
0
    def a_star(self):
        que = MyQueue()  # kolejka wierzchołków do sprawdzenia
        finished = MyQueue()  # kolejka skończonych
        counter = 0
        added_to_frontier = []
        que.insert(
            Vertex(index=self.start,
                   previous=-1,
                   graph_distance=0,
                   heuristic_distance=self.manhattan(self.start, self.target),
                   path=''))
        added_to_frontier.append(self.start)

        while not que.is_empty():
            current = que.remove()
            counter += 1
            current.considered = counter
            if current.index != self.target:
                for child in self.adjacency_list[current.index]:
                    if not que.contains(child[0]) and not finished.contains(
                            child[0]):
                        que.insert(
                            Vertex(
                                index=child[0],
                                previous=current.index,
                                graph_distance=current.graph_distance +
                                int(child[1]),
                                heuristic_distance=self.manhattan(
                                    child[0], self.target),
                                path=
                                f'{current.path}{LETTER_INDEXES[current.index]} -> '
                            ))
                        added_to_frontier.append(child[0])
                    elif que.contains(child[0]):
                        if current.distance + child[1] < que[
                                child[0]].distance:
                            que.set_distance(child[0],
                                             current.distance + child[1])
                            que.set_previous(
                                child[0],
                                current.index)  # aktualizuj poprzednika
                            que.set_path(
                                child[0],
                                f'{current.path}{LETTER_INDEXES[current.index]} -> '
                            )  # aktualizuj sciezke
                finished.insert(current)
            else:
                while not que.is_empty():
                    finished.insert(que.remove())
                for index in added_to_frontier:
                    print(f'{finished[index].considered}, {finished[index]}')
                print(
                    f'najkrótsza znaleziona ścieżka z {LETTER_INDEXES[self.start]} do {LETTER_INDEXES[self.target]}:'
                )
                print(str(current.path) + str(LETTER_INDEXES[self.target]))
                return str(current.path) + str(LETTER_INDEXES[self.target])
        for index in added_to_frontier:
            print(f'{finished[index].considered}, {finished[index]}')
        print('ścieżka nie została odnaleziona')
        return 'brak ścieżki'