Мне нужно сохранить текущее состояние рекурсивного цикла в файл. Как это сделать?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Мне нужно сохранить текущее состояние рекурсивного цикла в файл. Как это сделать?

Сообщение Anonymous »

Я создал игру-головоломку, которая решается сама собой, используя грубую силу. Моя решающая функция, кажется, работает нормально. Он проходит через все мои фрагменты и даже запускает новый экземпляр, если значение «is_valid» истинно, и восстанавливает предыдущий экземпляр, если оно неверно. Это мой код решателя.

Код: Выделить всё

def solve(board, pieces_used_unused, positions, position_index, ax, prev_match_counter=0):
global match_counter

if match_counter >= TOTAL_MATCHES:
return True

if position_index == len(positions):  # If all positions are processed
return False

row, col = positions[position_index]

for i, piece in enumerate(pieces_used_unused['unused']):
# Check edge and corner constraints for pieces with 0 patterns
if piece.sides.count(0) == 2:
if not is_corner_position(row, col):
continue
elif 0 in piece.sides:
if not is_edge_position(row, col):
continue
elif is_edge_position(row, col):
continue

for _ in range(4): # Try all four rotations
if is_valid(board, piece, row, col):
matches = count_matches(board, piece, row, col)
match_counter += matches

board[row][col] = piece

pieces_used_unused['used'].append(piece)
remaining_pieces = pieces_used_unused['unused'][:i] + pieces_used_unused['unused'][i + 1:]
pieces_used_unused['unused'] = remaining_pieces

print_board(board)

if solve(board, pieces_used_unused, positions, position_index + 1, ax, prev_match_counter):
return True

match_counter -= matches
board[row][col] = None

pieces_used_unused['unused'].insert(i, piece)
pieces_used_unused['used'].pop()

print_board(board)

piece.rotate() # Rotate the piece for the next attempt

return False

try:
board, pieces_used_unused, positions, position_index, match_counter = load_state()
print("Loaded saved state.")

except FileNotFoundError:

pieces_array = [
Piece(139,[6,11,18,6]),
Piece(1,[1,17,0,0]),
Piece(2,[1,5,0,0]),
Piece(3,[9,17,0,0]),
Piece(4,[17,9,0,0]),
Piece(5,[2,1,0,1]),
# More pieces....
]

# Initialize the board and pieces
board = [[None for _ in range(16)] for _ in range(16)]

radius = 1
positions = []
start_position = (8, 7)

while radius < 9:
positions.extend(get_clockwise_positions(start_position, radius))
radius += 1

del positions[255-len(positions):]

pieces_array[0].rotate()
pieces_array[0].rotate()
# Place Piece 139 at (8, 7)
board[8][7] = pieces_array[0]

pieces_used_unused = {
'used': [pieces_array[0]],
'unused': pieces_array[1:]
}

position_index = 0
match_counter = 0

print("Initialized new state.")

# Create a figure and axis for drawing the board
fig, ax = plt.subplots(1, figsize=(9, 9))

# Draw the initial board configuration
print_board(board)

# Solve the puzzle
if solve(board, pieces_used_unused, positions, position_index, ax):
print("Puzzle solved!")
else:
print("No solution found.")

# Print the final board configuration
print_board(board)
Моя проблема в том, что если мое приложение завершается по ошибке из-за сбоя компьютера, я хочу начать с того места, где оно осталось. Итак, я попробовал это:

Код: Выделить всё

def save_state(board, pieces_used_unused, positions, position_index, match_counter):
state = {
'board': [[{'id': piece.id, 'sides': piece.sides} if piece else None for piece in row] for row in board],
'pieces_used_unused': {
'used': [{'id': piece.id, 'sides': piece.sides} for piece in pieces_used_unused['used']],
'unused': [{'id': piece.id, 'sides': piece.sides} for piece in pieces_used_unused['unused']]
},
'positions': positions,
'position_index': position_index,
'match_counter': match_counter
}
with open('puzzle_state.json', 'w') as f:
json.dump(state, f)
и добавил сюда вызов моего решателя:

Код: Выделить всё

# snip
pieces_used_unused['unused'] = remaining_pieces

print_board(board)
if match_counter > prev_match_counter: # Save the state only if match_counter is bigger than previously saved match_counter
save_state(board, pieces_used_unused, positions, position_index + 1, match_counter)
prev_match_counter = match_counter
#snip

Но он никогда не догонит то, что было до поломки. Фактически, «for i, Piece in enumerate(pieces_used_unused['unused']):» просто проходит через все неиспользованные части и завершает головоломку без решения, что неверно.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -this-be-d
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Сохраните текущее состояние рекурсивного цикла в файл.
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Повышение эффективности рекурсивного цикла в функции генерации чисел
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как я мог повторить блок кода в сфере цикла для цикла, не перейдя на следующий цикл цикла? [дублировать]
    Anonymous » » в форуме Python
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Как я могу указать текущее состояние элемента с помощью frontRef в реакции?
    Гость » » в форуме Javascript
    0 Ответы
    50 Просмотры
    Последнее сообщение Гость
  • Каково текущее состояние атрибута "scoped" для элемента стиля в HTML5?
    Anonymous » » в форуме CSS
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»