Автор оригинала: Rahul Iragavarapu.
Если вы хотите играть и чувствовать Клоцки. www.schoolarchimedes.com Теперь, чтобы получить кратчайшее решение не является мозгом, просто используйте BFS.
start_time = time.time() vis = set() par = {b: None} q = [b] vis.add(b.eff_key()) sol_found = False cur_board = None while len(q) > 0: cur_board = q[0] q = q[1:] next_boards = cur_board.all_boards(vis) for board in next_boards: if board.eff_key() not in vis: q.append(board) vis.add(board.eff_key()) par[board] = cur_board if board.solved(): cur_board = board sol_found = True break if sol_found: break solution = [] if sol_found: while cur_board != None: solution.append(cur_board) cur_board = par[cur_board] solution.reverse() for sol in solution: sol.print_grid() print("found in ",len(solution)," steps") print("done in ", time.time() - start_time)
Самое короткое решение, найденное в 116 шагах 🤔 Производино в 7,02 с 🤦♂️ Что, почему самое короткое решение составляет 116 шагов? BFS не может ошибаться. Быстрый поиск показывает, что 81 шаговые решения читов, перемещая 1 или более в одном перемещении. Теперь это кратчайшее решение достигается. Что, черт возьми, произошло со временем исполнения. 1 уловка точка очевидна
- Метод All_boards в классе Board, все фигуры проверяются, если они могут перемещаться, можно проверить только детали вокруг пустых квадратов. Но я не хочу менять это, так как он будет более пустыми квадратами в движении. Это просто BFS, позвольте мне попробовать * поиск с H-оценкой как манхэттенское расстояние от красного штука (2×2 шт.) И целевого местоположения.
#Showing Diff for Brevity class Board: def __init__(self, pieces=None): ... piece = self.piece_map[0] self.dist = abs(piece.srow-3) + abs(piece.scol - 1) #auxillary functions for Heap def __lt__(self, other): return self.dist < other.dist def __gt__(self, other): return self.dist > other.dist #BFS Changes while len(q) > 0: cur_board = heapq.heappop(q) ... if board.eff_key() not in vis: heapq.heappush(q,board) ...
G-Оценка Если я возьму 1 на каждый шаг, он так же медленнее, как обычный BFS. Итак, я избавился от G-оценки 🤞 Решение, найденное в 381 ступенях 🤦♂️, сделанные в 1.62 🤦♂️ Это не хорошо, я не получаю кратчайшее решение и время хуже, чем DF для аналогичного этапа. Я попробовал кучу G & H-баллов, но ничто не дало в кратчайшие сроки решения, но время колебается около 1-2 сек, увидим, будет ли какая-либо другая оптимизация позже. Я закрою эту часть с несколькими головоломками, решающимися, перед решением, высота, целевое местоположение ширины должно быть сделано глобальным, кусок класса необходимо модифицировать так, чтобы он мог поддерживать разнообразие предметов в Mostit Game Now Piece имеет собственную сетку. Так что странные формы (даже с отверстиями/порезами в нем, как приведены ниже). Все те же типы кусков назначаются номер/идентификатор, поэтому разные кусочки того же типа могут рассматриваться как отдельная доска
Прежде чем попасть в решение. Как выглядит приложение
Теперь давайте решать несколько головоломок, которые я нашел с большим размером доски (поскольку большая сетка – это больше времени)
#puzzle 1 b = Board(pieces=[Piece(2, 0, [[1, 1, 1]]), Piece(2, 3, [[2, 2]]), Piece(3, 0, [[7, 7]]), Piece(3, 2, [[6, 6, 6]]), Piece(4, 0, [[3, 3, 3], [-1, -1, 3], [-1, -1, 3]]), Piece(4, 3, [[4, 4], [-1, 4]]), Piece(5, 3, [[5, -1], [5, 5]]), Piece(5, 0, [[0, 0], [0, 0]]) ]) #puzzle 2 b = Board(pieces=[Piece(0, 0, [[1, 1, ]]), Piece(0,3, [[2, 2]]), Piece(3, 3, [[3, 3]]), Piece(6, 3, [[4,4]]), Piece(2, 3, [[5 ]]), Piece(4, 3, [[6]]), Piece(3, 0, [[7,7,7]]), Piece(0, 2, [[8], [8], [8]]), Piece(4, 2, [[9], [9], [9]]), Piece(5, 0, [[0, 0], [0, 0]]) ])
С этими конфигурациями доски я пытался подходить подходящим подходам DFS/Backtracking, но ничего не найдено, Python мертв с пределом рекурсионами, решается с целевыми ступенями для 1-й головоломки в 6 мин. , решил оба из них через 1-2 секунд не с целевым решением, но разумным ~ 100 ступенчатым раствором недостаточно хорош, но хорошо. Давайте посмотрим, смогу ли я добраться до этого целевого решения с некоторым G-H-оценкой для * поиска или лучшего подхода, чем грубая сила в следующем приключении.