Рубрики
Без рубрики

Klotski Adventure – часть 2

Если вы хотите играть и чувствовать Клоцки. www.schoolarchimedes.com Теперь, чтобы получить кратчайшее решение не является мозгом, просто используйте BFS. “ .time () () par = {b: нет} q = …

Автор оригинала: 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 уловка точка очевидна

1_ve0cftuq9e9rjrd5o0gvew.png.
  • Метод 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 имеет собственную сетку. Так что странные формы (даже с отверстиями/порезами в нем, как приведены ниже). Все те же типы кусков назначаются номер/идентификатор, поэтому разные кусочки того же типа могут рассматриваться как отдельная доска

1_ve0cftuq9e9rjrd5o0gvew.png.

Прежде чем попасть в решение. Как выглядит приложение

1_axwpujrcsrinbwwi7g95nw.png.
1_ve0cftuq9e9rjrd5o0gvew.png.

Теперь давайте решать несколько головоломок, которые я нашел с большим размером доски (поскольку большая сетка – это больше времени)

#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-оценкой для * поиска или лучшего подхода, чем грубая сила в следующем приключении.