8-puzzle using a* algorithm in python

## 8-puzz bằng thuật toán* trong Python

8-Puzle là một trò chơi giải đố cổ điển đã xuất hiện trong nhiều thế kỷ.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. Câu đố thường được sử dụng như một công cụ giảng dạy cho các thuật toán trí tuệ nhân tạo, vì đó là một vấn đề đầy thách thức đòi hỏi phải tìm kiếm tốtChiến lược để giải quyết.

Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách giải quyết 8 trò chơi bằng thuật toán* trong Python.Thuật toán A* là một thuật toán tìm kiếm tham lam thường được sử dụng cho các vấn đề tìm đường.Nó hoạt động bằng cách lặp đi lặp lại các nút hứa hẹn nhất trong không gian tìm kiếm, cho đến khi nó đạt đến trạng thái mục tiêu.

Để thực hiện thuật toán A* trong Python, trước tiên chúng ta sẽ cần xác định một vài cấu trúc dữ liệu.Chúng tôi sẽ cần một đại diện trạng thái cho 8-Puzle, một chức năng heuristic để ước tính chi phí đạt được trạng thái mục tiêu và hàng đợi ưu tiên để lưu trữ các nút trong không gian tìm kiếm.

Biểu diễn trạng thái cho 8 trò chơi là một mảng 3x3 của các số nguyên, trong đó mỗi số nguyên đại diện cho giá trị của một gạch.Trạng thái mục tiêu được biểu thị bằng mảng `[1, 2, 3, 4, 5, 6, 7, 8].

Chức năng heuristic cho 8 trò chơi là khoảng cách Manhattan giữa trạng thái hiện tại và trạng thái mục tiêu.Khoảng cách Manhattan là tổng các giá trị tuyệt đối của sự khác biệt giữa các chỉ số hàng và cột của các ô ở hai trạng thái.

Hàng đợi ưu tiên sẽ lưu trữ các nút trong không gian tìm kiếm theo thứ tự được sắp xếp, với các nút gần trạng thái mục tiêu nhất ở đầu hàng đợi.Chúng tôi sẽ sử dụng chức năng ưu tiên sau để sắp xếp các nút:

`` `
Ưu tiên của Def (trạng thái):
Trả lại Manhattan_distance (State, Goal_State)
`` `

Khi chúng tôi đã xác định các cấu trúc dữ liệu, chúng tôi có thể thực hiện thuật toán*.Thuật toán hoạt động bằng cách lặp đi lặp lại các nút hứa hẹn nhất trong không gian tìm kiếm.Để mở rộng một nút, trước tiên chúng tôi tạo ra tất cả các nút con của nó.Một nút con được tạo bằng cách di chuyển một gạch duy nhất ở trạng thái hiện tại.Sau đó, chúng tôi tính toán giá trị heuristic cho mỗi nút trẻ và thêm nó vào hàng đợi ưu tiên.

Thuật toán chấm dứt khi nó đạt đến trạng thái mục tiêu.Độ phức tạp về thời gian của thuật toán A* là O (b^d), trong đó B là yếu tố phân nhánh của cây tìm kiếm và D là độ sâu của trạng thái mục tiêu.

Mã sau đây thực hiện thuật toán* cho 8 trò chơi:

`` `Python
def astar (init_state):
# Tạo hàng đợi ưu tiên và thêm trạng thái ban đầu vào nó.
ưu tiên_queue = ưu tiên ()
ưu tiên_queue.put ((0, initing_state))

# Tạo một bộ để theo dõi các trạng thái đã truy cập.
Đã truy cập = set ()

# Trong khi hàng đợi ưu tiên không trống, hãy tiếp tục mở rộng các nút.
Trong khi không ưu tiên_queue.empty ():
# Nhận nút với mức độ ưu tiên cao nhất từ hàng đợi ưu tiên.
(chi phí, trạng thái) = ưu tiên_queue.get ()

# Nếu trạng thái hiện tại là trạng thái mục tiêu, hãy trả lại giải pháp.
Nếu trạng thái == Goal_State:
Chi phí trả lại

# Nếu trạng thái hiện tại đã được truy cập, hãy bỏ qua nó.
Nếu trạng thái được truy cập:
Tiếp tục

# Đánh dấu trạng thái hiện tại như đã truy cập.
Đã truy cập.ADD (Bang)

# Tạo các nút con của trạng thái hiện tại.
Child_States = Generate_Child_States (State)

# Đối với mỗi nút trẻ, hãy tính giá trị heuristic của nó và thêm nó vào hàng đợi ưu tiên.
cho trẻ em trong trẻ em_states:
heuristic_value = manhattan_distance (Child_state, Goal_state)
Ưu tiên_queue.put ((chi phí + heuristic_value, Child_state))

# Nếu không tìm thấy trạng thái mục tiêu, không trả lại.
trả lại không
`` `

Để sử dụng thuật toán*
=======================================
## 8-Puzzle using A* algorithm in Python

The 8-puzzle is a classic puzzle game that has been around for centuries. The goal of the puzzle is to move the tiles around so that they are in the correct order, from 1 to 8. The puzzle is often used as a teaching tool for artificial intelligence algorithms, as it is a challenging problem that requires a good search strategy to solve.

In this tutorial, we will show you how to solve the 8-puzzle using the A* algorithm in Python. The A* algorithm is a greedy search algorithm that is often used for pathfinding problems. It works by iteratively expanding the most promising nodes in the search space, until it reaches the goal state.

To implement the A* algorithm in Python, we will first need to define a few data structures. We will need a state representation for the 8-puzzle, a heuristic function to estimate the cost of reaching the goal state, and a priority queue to store the nodes in the search space.

The state representation for the 8-puzzle is a 3x3 array of integers, where each integer represents the value of a tile. The goal state is represented by the array `[1, 2, 3, 4, 5, 6, 7, 8]`.

The heuristic function for the 8-puzzle is the Manhattan distance between the current state and the goal state. The Manhattan distance is the sum of the absolute values of the differences between the row and column indices of the tiles in the two states.

The priority queue will store the nodes in the search space in a sorted order, with the nodes that are closest to the goal state being at the top of the queue. We will use the following priority function to sort the nodes:

```
def priority(state):
return manhattan_distance(state, goal_state)
```

Once we have defined the data structures, we can implement the A* algorithm. The algorithm works by iteratively expanding the most promising nodes in the search space. To expand a node, we first generate all of its child nodes. A child node is created by moving a single tile in the current state. We then calculate the heuristic value for each child node and add it to the priority queue.

The algorithm terminates when it reaches the goal state. The time complexity of the A* algorithm is O(b^d), where b is the branching factor of the search tree and d is the depth of the goal state.

The following code implements the A* algorithm for the 8-puzzle:

```python
def astar(initial_state):
# Create the priority queue and add the initial state to it.
priority_queue = PriorityQueue()
priority_queue.put((0, initial_state))

# Create a set to keep track of the visited states.
visited = set()

# While the priority queue is not empty, continue to expand nodes.
while not priority_queue.empty():
# Get the node with the highest priority from the priority queue.
(cost, state) = priority_queue.get()

# If the current state is the goal state, return the solution.
if state == goal_state:
return cost

# If the current state has already been visited, skip it.
if state in visited:
continue

# Mark the current state as visited.
visited.add(state)

# Generate the child nodes of the current state.
child_states = generate_child_states(state)

# For each child node, calculate its heuristic value and add it to the priority queue.
for child_state in child_states:
heuristic_value = manhattan_distance(child_state, goal_state)
priority_queue.put((cost + heuristic_value, child_state))

# If the goal state was not found, return None.
return None
```

To use the A* algorithm to
 
`` `
# Xác định vấn đề 8 trò chơi.

lớp Puzzlestate:

def __init __ (tự, gạch):
self.tiles = gạch

def is_goal_state (tự):
"" "
Kiểm tra xem trạng thái hiện tại có phải là trạng thái mục tiêu không.

Trạng thái mục tiêu là lưới 3x3 với các số 1-8 trong mỗi ô,
và không gian trống (0) trong ô trung tâm.
"" "

# Kiểm tra xem các gạch có đúng thứ tự không.

Đối với tôi trong phạm vi (3):
Đối với J trong phạm vi (3):
if self.tiles [j]! = i * 3 + j + 1:
trả lại sai

# Kiểm tra xem không gian trống có trong ô trung tâm không.

Nếu self.tiles [1] [1]! = 0:
trả lại sai

trả về đúng

def get_neighbors (tự):
"" "
Nhận tất cả các quốc gia lân cận có thể.

Một trạng thái lân cận là một trạng thái có thể đạt được bằng cách di chuyển không gian trống
đến một trong các tế bào liền kề.
"" "

# Nhận tọa độ của không gian trống.

i, j = self.get_blank_poseition ()

# Nhận tất cả các động tác có thể cho không gian trống.

di chuyển = [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]]

# Lọc ra các di chuyển sẽ để lại khoảng trống ra khỏi lưới.

hàng xóm = []
Để di chuyển trong các động tác:
Nếu 0 <= di chuyển [0] <3 và 0 <= di chuyển [1] <3:
hàng xóm.append (self.move_blank (di chuyển))

trở về hàng xóm

def move_blank (tự, di chuyển):
"" "
Di chuyển không gian trống đến vị trí đã cho.

Nhà nước mới được trả lại.
"" "

# Tạo một bản sao của trạng thái hiện tại.

new_tiles = self.tiles.copy ()

# Trao đổi không gian trống với gạch tại vị trí đã cho.

new_tiles [di chuyển [0]] [di chuyển [1]] = 0
new_tiles [j] = new_tiles [di chuyển [0]] [di chuyển [1]]

# Trả lại trạng thái mới.

trả lại puzzlestate (new_tiles)

def get_blank_poseition (self):
"" "
Nhận vị trí của không gian trống.

Vị trí được trả lại dưới dạng tuple (i, j).
"" "

Đối với tôi trong phạm vi (3):
Đối với J trong phạm vi (3):
if self.tiles [j] == 0:
Trả lại tôi, j

def __str __ (tự):
"" "
Nhận một đại diện chuỗi của trạng thái.
"" "

trả về "\ n" .join (["" .join (bản đồ (str, hàng)) cho hàng trong self.tiles])


# Xác định thuật toán A*.

def a_star (start_state, goit_state):
"" "
Thực hiện thuật toán A* để giải quyết vấn đề 8 trò chơi.

Trạng thái bắt đầu và trạng thái mục tiêu được đưa ra dưới dạng các đối tượng Puzzlestate.

Thuật toán trả lại đường dẫn từ trạng thái bắt đầu sang trạng thái mục tiêu,
hoặc không có nếu không có con đường tồn tại.
"" "

# Tạo một hàng đợi ưu tiên để lưu trữ các trạng thái được khám phá.

biên giới = []

# Khởi tạo trạng thái bắt đầu.

start_state.g = 0
start_state.h = start_state.get_heuristic (mục tiêu_state)
start_state.f = start_state.g + start_state.h
Frontier.Append (start_state)

# Tạo một bộ để lưu trữ các trạng thái được khám phá.

đã khám phá = set ()

# Vòng lặp cho đến khi trạng thái mục tiêu được tìm thấy hoặc biên giới trống rỗng.

Trong khi biên giới:

# Nhận trạng thái có giá trị F thấp nhất từ biên giới.

current_state = heapq.HeAppop (biên giới)

# Kiểm tra xem trạng thái hiện tại có phải là trạng thái mục tiêu không.

Nếu current_state.is_goal_state ():
trả về current_state.get_path ()

# Thêm trạng thái hiện tại vào tập hợp được khám phá.

đã khám phá.ADD (
 
`` `Python
def solve_8_puzz (câu đố):
# Kiểm tra xem câu đố có thể giải quyết được không.
Nếu không is_solvable (câu đố):
trả lại sai

# Khởi tạo hàng đợi ưu tiên.
Hàng đợi = [(0, câu đố)]

# Trong khi hàng đợi không trống,
Trong khi xếp hàng:
# Bật phần tử hàng đầu từ hàng đợi.
(chi phí, câu đố) = hàng đợi.pop (0)

# Nếu câu đố được giải quyết,
Nếu is_solved (câu đố):
Chi phí trả lại

# Nếu không, tạo ra những đứa trẻ của câu đố.
Đối với trẻ trong Generate_children (câu đố):
# Tính chi phí của trẻ.
Child_cost = Chi phí + 1

# Nếu đứa trẻ không ở trong hàng đợi,
Nếu trẻ không xếp hàng:
# Thêm trẻ vào hàng đợi.
Hàng đợi.Append ((Child_cost, Child))

# Câu đố không thể giải được.
trả lại sai

`` `
 
Join ToolsKiemTrieuDoGroup
Back
Top
AdBlock Detected

We get it, advertisements are annoying!

Sure, ad-blocking software does a great job at blocking ads, but it also blocks useful features of our website. For the best site experience please disable your AdBlocker.

I've Disabled AdBlock