Share 8-puzzle problem using hill climbing in python github

** Vấn đề 8 trò chơi khi sử dụng leo trong Python **

## Giới thiệu

Vấn đề 8 trò chơi là một vấn đề kinh điển trong khoa học máy tính.Đó là một câu đố trong đó bạn được cung cấp một lưới 3x3 với 8 gạch, được đánh số 1-8 và một ô bị thiếu.Mục tiêu của câu đố là di chuyển các gạch xung quanh để chúng theo đúng thứ tự, từ 1 đến 8.

Vấn đề 8 hình chữ cái là một ví dụ nổi tiếng về vấn đề ** np-hard **, điều đó có nghĩa là không có thuật toán đa thức thời gian được biết đến để giải quyết nó.Tuy nhiên, có một số heuristic có thể được sử dụng để tìm ra giải pháp, và một trong những loại phổ biến nhất là ** leo đồi **.

## leo đồi

Leo núi là một thuật toán lặp đơn giản bắt đầu bằng một giải pháp ngẫu nhiên cho vấn đề và sau đó liên tục tạo ra những thay đổi nhỏ đối với giải pháp với hy vọng tìm ra một giải pháp tốt hơn.Thuật toán dừng lại khi nó đạt đến mức tối đa cục bộ, đó là một giải pháp không tốt hơn bất kỳ hàng xóm nào của nó.

Để áp dụng việc leo đồi vào vấn đề 8 trò chơi, chúng ta có thể biểu diễn từng giải pháp dưới dạng ma trận 3x3, trong đó mỗi phần tử của ma trận đại diện cho số lượng gạch ở vị trí đó.Ví dụ: ma trận sau đại diện cho một giải pháp cho vấn đề 8 trò chơi:

`` `
[1, 2, 3]
[4, 5, 6]
[7, 8, 0]
`` `

Thuật toán leo đồi bắt đầu với một giải pháp ngẫu nhiên cho vấn đề và sau đó liên tục tạo ra những thay đổi nhỏ đối với giải pháp với hy vọng tìm ra một giải pháp tốt hơn.Thuật toán dừng lại khi nó đạt đến mức tối đa cục bộ, đó là một giải pháp không tốt hơn bất kỳ hàng xóm nào của nó.

## Thực hiện trong Python

Mã sau đây thực hiện thuật toán leo đồi cho vấn đề 8 trò chơi trong Python:

`` `Python
nhập khẩu NUMPY dưới dạng NP

def get_neighbors (trạng thái):
"" "
Nhận được hàng xóm của một trạng thái nhất định trong vấn đề 8 trò chơi.

Args:
Trạng thái: Một ma trận 3x3 đại diện cho một trạng thái trong vấn đề 8 trò chơi.

Trả lại:
Một danh sách các ma trận 3x3 đại diện cho các nước láng giềng của trạng thái nhất định.
"" "

hàng xóm = []

# Nhận vị trí của gạch trống trong tiểu bang.

trống_tile = np.where (state == 0) [0] [0]
hàng = trống_tile // 3
col = trống_tile % 3

# Nhận hàng xóm của gạch trống.

Đối với tôi trong phạm vi (3):
Đối với J trong phạm vi (3):
Nếu tôi! = ROW hoặc J! = COL:
new_state = np.copy (trạng thái)
new_state [hàng] [col] = state [j]
new_state [j] = 0
hàng xóm.append (new_state)

trở về hàng xóm

def is_goal (trạng thái):
"" "
Kiểm tra xem một trạng thái nhất định có phải là trạng thái mục tiêu trong vấn đề 8 trò chơi hay không.

Args:
Trạng thái: Một ma trận 3x3 đại diện cho một trạng thái trong vấn đề 8 trò chơi.

Trả lại:
Đúng nếu trạng thái nhất định là trạng thái mục tiêu, sai nếu không.
"" "

trả về np.all (state == np.arange (9) .reshape (3, 3)))

def hill_climbing (trạng thái):
"" "
Giải quyết vấn đề 8 trò chơi bằng cách sử dụng leo đồi.

Args:
Trạng thái: Một ma trận 3x3 đại diện cho trạng thái bắt đầu trong vấn đề 8 trò chơi.

Trả lại:
Một ma trận 3x3 đại diện cho trạng thái mục tiêu.
"" "

# Khởi tạo trạng thái hiện tại và trạng thái tốt nhất.

current_state = trạng thái
best_state = trạng thái

# Lặp lại cho đến khi trạng thái hiện tại là trạng thái mục tiêu.

Trong khi không is_goal (current_state):
# Nhận hàng xóm của trạng thái hiện tại.
=======================================
**8-Puzzle Problem using Climbing in Python**

## Introduction

The 8-puzzle problem is a classic problem in computer science. It is a puzzle where you are given a 3x3 grid with 8 tiles, numbered 1-8, and one tile is missing. The goal of the puzzle is to move the tiles around so that they are in the correct order, from 1 to 8.

The 8-puzzle problem is a well-known example of a **NP-hard** problem, which means that there is no known polynomial-time algorithm to solve it. However, there are a number of heuristics that can be used to find a solution, and one of the most popular is **hill climbing**.

## Hill Climbing

Hill climbing is a simple iterative algorithm that starts with a random solution to the problem and then repeatedly makes small changes to the solution in the hope of finding a better solution. The algorithm stops when it reaches a local maximum, which is a solution that is not better than any of its neighbors.

To apply hill climbing to the 8-puzzle problem, we can represent each solution as a 3x3 matrix, where each element of the matrix represents the number of the tile in that position. For example, the following matrix represents a solution to the 8-puzzle problem:

```
[1, 2, 3]
[4, 5, 6]
[7, 8, 0]
```

The hill climbing algorithm starts with a random solution to the problem and then repeatedly makes small changes to the solution in the hope of finding a better solution. The algorithm stops when it reaches a local maximum, which is a solution that is not better than any of its neighbors.

## Implementation in Python

The following code implements the hill climbing algorithm for the 8-puzzle problem in Python:

```python
import numpy as np

def get_neighbors(state):
"""
Gets the neighbors of a given state in the 8-puzzle problem.

Args:
state: A 3x3 matrix representing a state in the 8-puzzle problem.

Returns:
A list of 3x3 matrices representing the neighbors of the given state.
"""

neighbors = []

# Get the position of the empty tile in the state.

empty_tile = np.where(state == 0)[0][0]
row = empty_tile // 3
col = empty_tile % 3

# Get the neighbors of the empty tile.

for i in range(3):
for j in range(3):
if i != row or j != col:
new_state = np.copy(state)
new_state[row][col] = state[j]
new_state[j] = 0
neighbors.append(new_state)

return neighbors

def is_goal(state):
"""
Checks if a given state is a goal state in the 8-puzzle problem.

Args:
state: A 3x3 matrix representing a state in the 8-puzzle problem.

Returns:
True if the given state is a goal state, False otherwise.
"""

return np.all(state == np.arange(9).reshape(3, 3))

def hill_climbing(state):
"""
Solves the 8-puzzle problem using hill climbing.

Args:
state: A 3x3 matrix representing a starting state in the 8-puzzle problem.

Returns:
A 3x3 matrix representing the goal state.
"""

# Initialize the current state and the best state.

current_state = state
best_state = state

# Repeat until the current state is a goal state.

while not is_goal(current_state):
# Get the neighbors of the current state.
 
Join Telegram ToolsKiemTrieuDoGroup
Back
Top