1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài tập lớn AI: hành trình quân mã

13 15 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

ĐỀ TÀI: Hành trình quân mã Bài toán duyệt theo chiều rộng và chiều sâu , thực hành code trên python class data: def __init__(self, state, parent, move, depth, cost): self.state = state self.parent = parent self.move = move self.depth = depth self.cost = cost if self.state:

TRƯỜNG ĐẠI HỌC THỦY LỢI KHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP LỚN HỌC PHẦN: TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: Hành trình quân mã Giáo viên hướng dẫn: Nguyễn Thị Kim Ngân Sinh viên/nhóm sinh viên thực hiện: Ngô Thị Hồng Nhung, lớp 62CNTT03 Đỗ Ngọc Minh, lớp 62CNTT03 Nguyễn Huy Mạnh, lớp 62CNTT03 Hà Nội, năm 2021 Phần 1: Tổng quan I Phương pháp Phương pháp duyệt theo chiều rộng: Tìm kiếm theo chiều rộng (BFS) thuật tốn tìm kiếm đồ thị việc tìm kiếm bao gồm thao tác: Cho trước đỉnh đồ thị thêm đỉnh kề với đỉnh vừa cho vào danh sách hướng tới - Mục đích : Có thể sử dụng thuật tốn tìm kiếm theo chiều rộng cho hai mục đích: tìm kiếm đường từ đỉnh gốc cho trước tới đỉnh đích, tìm kiếm đường từ đỉnh gốc tới tất đỉnh khác - Trong đồ thị khơng có trọng số, thuật tốn tìm kiếm theo chiều rộng ln tìm đường ngắn Thuật tốn BFS đỉnh gốc nhìn đỉnh kề với đỉnh gốc Sau đó, với đỉnh số đó, thuật tốn lại nhìn trước đỉnh kề với mà chưa quan sát trước lặp lại - Thuật tốn sử dụng cấu trúc liệu hàng đợi để lưu trữ thơng tin trung gian thu q trình tìm kiếm:  Chèn đỉnh gốc vào hàng đợi (đang hướng tới)  Lấy đỉnh hàng đợi quan sát  Nếu đỉnh đỉnh đích, dừng q trình tìm kiếm trả kết  Nếu khơng phải chèn tất đỉnh kề với đỉnh vừa thăm chưa quan sát trước vào hàng đợi  Nếu hàng đợi rỗng, tất đỉnh đến được quan sát – dừng việc tìm kiếm trả "khơng thấy"  Nếu hàng đợi khơng rỗng quay bước 2 Phương pháp duyệt theo chiều sâu: - Giải thuật tìm kiếm theo chiều sâu (Depth First Search – viết tắt DFS), cịn gọi giải thuật tìm kiếm ưu tiên chiều sâu, giải thuật duyệt tìm kiếm một đồ thị sử dụng stack (ngăn xếp) để ghi nhớ đỉnh liền kề để bắt đầu việc tìm kiếm khơng gặp đỉnh liền kề vòng lặp Giải thuật tiếp tục gặp đỉnh cần tìm tới nút khơng có Khi giải thuật quay lui đỉnh vừa tìm kiếm bước trước - Việc triển khai DFS tiêu chuẩn chia đỉnh biểu đồ thành hai loại:  Đã duyệt  Chưa duyệt - Mục đích thuật tốn đánh dấu đỉnh duyệt tránh việc duyệt theo vòng trịn chu kỳ - Thuật tốn DFS hoạt động sau:  Bắt đầu cách đặt đỉnh biểu đồ lên ngăn xếp  Lấy phần tử ngăn xếp thêm vào danh sách truy cập  Tạo danh sách nút liền kề đỉnh Thêm nút mà khơng có danh sách duyệt vào đầu ngăn xếp  Tiếp tục lặp lại bước ngăn xếp trống rỗng Phần 2: Thực nghiệm (code) 1.Mô tả tốn - Tính tốn số bước cách quân mã từ vị trí gốc tới vị trí đích Input: Trạng thái gốc trạng thái đích Ouput: Cách di chuyển, số bước Method (phương pháp thực hiện): + Mô tả cách xây dựng trạng thái: class data: def init (self, state, parent, move, depth, cost): self.state = state self.parent = parent self.move = move self.depth = depth self.cost = cost  Biến state để lưu trữ tọa độ trạng thái quân mã  Biến parent dùng để nút cha hay trạng thái cha nút  Biến move dùng để cách di chuyển nút cha để tới nút  Biến depth dùng để lưu độ sâu nút  Biến cost dùng để lưu bước biến đổi + Mô tả quy luật chuyển trạng thái:    Quân mã có tối khả di chuyển (như hình) Mỗi khả di chuyển ta tính tọa độ quân mã Nếu qn mã ta vị trí (x;y) ta có khả di chuyển sau: Các khả : (x-2;y-1), (x-2;y+1), (x-1;y-2), (x-1;y+2), (x+1;y-2), (x+1;y+2), (x+2:y-1), (x+2;y+1)  Ta di chuyển cho tọa độ không pham vi bàn cờ + Mơ tả trạng thái đầu, trạng thái đích:  Trạng thái đầu: [3,5] tức quân mã đứng vị trí x = y =  Trạng thái đích: [2,2] vị trí mà quân mã tới + Mô tả cách thực để tìm đường từ trạng thái đầu đến trạng thái đích  BFS(Thuật tốn tìm kiếm theo chiều rộng)  Số bước U Kề(U) (3,5) (1,4) (1,6) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) (1,4) (2,2) (2,6) (3,3) (1,6) (2,4) (2,8) (3,7) (2,3) (1,1) (1,5) (3,1) (4,2) (4,5) (2,7) (1,5) (4,6) (4,8) (4,3) (2,2) (2,4) (3,1) (5,1) (5,5) (6,2) (6,4) (4,7) (2,6) (2,8) (5,5) (6,6) (6,8) (5,4) (3,3) (4,2) (4,6) (6,2) (6,6) (7,3) (7,5) (5,6) (3,7) (4,4) (4,8) (6,4) (6,8) (7,5) (7,7) 10 (2,2)  DFS(Thuật tốn tìm kiếm theo chiều sâu) OPEN (3,5) (1,4) (1,6) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) (1,6) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) (2,2) (2,6) (3,3) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) (2,2) (2,6) (3,3) (2,4) (2,8) (3,7) (2,7) (4,3) (4,7) (5,4) (5,6) (2,2) (2,6) (3,3) (2,4) (2,8) (3,7) (1,1) (1,5) (3,1) (4,2) (4,5) (4,3) (4,7) (5,4) (5,6) (2,2) (2,6) (3,3) (2,4) (2,8) (3,7) (1,1) (1,5) (3,1) (4,2) (4,5) (4,6) (4,8) (4,7) (5,4) (5,6) (2,2) (2,6) (3,3) (2,4) (2,8) (3,7) (1,1) (1,5) (3,1) (4,2) (4,5) (4,6) (4,8) (5,1) (5,5) (6,2) (6,4) (5,4) (5,6) (2,2) (2,6) (3,3) (2,4) (2,8) (3,7) (1,1) (1,5) (3,1) (4,2) (4,5) (4,6) (4,8) (5,1) (5,5) (6,2) (6,4) (6,6) (6,8) (5,6) (2,2) (2,6) (3,3) (2,4) (2,8) (3,7) (1,1) (1,5) (3,1) (4,2) (4,5) (4,6) (4,8) (5,1) (5,5) (6,2) (6,4) (6,6) (6,8) (7,3) (7,5) (2,2) (2,6) (3,3) (2,4) (2,8) (3,7) (1,1) (1,5) (3,1) (4,2) (4,5) (4,6) (4,8) (5,1) (5,5) (6,2) (6,4) (6,6) (6,8) (7,3) (7,5) (4,4) (7,7) (2,6) (3,3) (2,4) (2,8) (3,7) (1,1) (1,5) (3,1) (4,2) (4,5) (4,6) (4,8) (5,1) (5,5) (6,2) (6,4) (6,6) (6,8) (7,3) (7,5) (4,4) (7,7) Số bước U Kề(U) (3,5) (1,4) (1,6) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) (1,4) (2,2) (2,6) (3,3) (2,2) OPEN (3,5) (1,4) (1,6) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) (2,2) (2,6) (3,3) (1,6) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) (1,3) (2,4) (4,1) (4,3) (2,6) (3,3) (1,6) (2,3) (2,7) (4,3) (4,7) (5,4) (5,6) Đánh giá kết tìm được: - Số bước chuyển trạng thái từ trạng thái đầu đến trạng thái đích phương pháp duyệt So sánh kết phương pháp + BFS: Số bước chuyển trạng thái từ trạng thái đầu đến trạng thái đích là: 10 bước + DFS: Số bước chuyển trạng thái từ trạng thái đầu đến trạng thái đích là: bước Số bước thực phương pháp BFS nhiều số bước thực DFS - So sánh thời gian thực phương pháp Do số bước BFS nhiều DFS Thời gian thực BFS lâu DFS Kết luận o o o Tóm lược nội dung mà tập lớn làm Hiểu cách hoạt động thuật tốn tìm kiếm chiều rộng chiều sâu Biết cách xây dựng trạng thái nút Biết cách di chuyển quân mã bàn cờ vua Tài liệu tham khảo - Các tài liệu tham khảo báo cáo o https://kienthuc24h.com/co-ban-ung-dung-bfs-de-giai-quyet-bai-tap-duong-di-cuaquan-ma-trong-thi/ - Ứng dụng BFS để giải tập đường quân mã đồ thị o https://viettuts.vn/cau-truc-du-lieu-va-giai-thuat/giai-thuat-tim-kiem-theo-chieurong-breadth-first-search?fbclid=IwAR3bZHnagp-fH1rtAlSMBMdU0CMlppcm28cUzLLl5g6Vxj5CSaykAXWC5M - Giải thuật tìm kiếm theo chiều rộng (Breadth First Search) import timeit from collections import deque cl1 = [-2,-1] cl2 = [-2, 1] cl3 = [-1,-2] cl4 = [-1, 2] cl5 = [1,-2] cl6 = [1,2] cl7 = [2,-1] cl8 = [2, 1] m,n = 8,8 goalPoint = [2,2] goalNode = None MaxSearchDeep = NodeExpand = path = '' class data: def init (self, state, parent, move, depth, cost): self.state = state self.parent = parent self.move = move self.depth = depth self.cost = cost if self.state: self.map = ''.join(str(e) for e in self.state) def eq (self, other): return self.map == other.map def lt (self, other): return self.map < other.map def str (self): return str(self.map) def bfs(startPoint): global MaxSearchDeep, goalNode Queue = deque([data(startPoint,None,None, 0, 0)]) boardVisited = set() while Queue: node = Queue.popleft() boardVisited.add(node.map) if node.state == goalPoint: goalNode = node return Queue possiblePath = subNode(node) for path in possiblePath: if path.map not in boardVisited: Queue.append(path) boardVisited.add(path.map) if path.depth > MaxSearchDeep: MaxSearchDeep = MaxSearchDeep + def dfs(startPoint): global MaxSearchDeep, goalNode boardVisited = set() stack = list([data(startPoint, None, None, 0, 0)]) while stack: node = stack.pop() boardVisited.add(node.map) if node.state == goalPoint: goalNode = node return stack possiblePath = reversed(subNode(node)) for path in possiblePath: if path.map not in boardVisited: stack.append(path) boardVisited.add(path.map) if path.depth > MaxSearchDeep: MaxSearchDeep = MaxSearchDeep + def subNode(node): global NodeExpand NodeExpand = NodeExpand + nextPath = [] nextPath.append(data(move(node.state, 1), node, 1, node.depth + 1, node.cost + 1)) nextPath.append(data(move(node.state, 2), node,2, node.depth + 1, node.cost + 1)) nextPath.append(data(move(node.state, 3),node, 3, node.depth + 1, node.cost + 1)) nextPath.append(data(move(node.state, 4),node, 4, node.depth + 1, node.cost + 1)) nextPath.append(data(move(node.state, 5),node, 5, node.depth + 1, node.cost + 1)) nextPath.append(data(move(node.state, 6),node, 6, node.depth + 1, node.cost + 1)) nextPath.append(data(move(node.state, 7), node,7, node.depth + 1, node.cost + 1)) nextPath.append(data(move(node.state, 8), node,8, node.depth + 1, node.cost + 1)) nodes = [] for proc in nextPath: if proc.state != None: nodes.append(proc) return nodes def move(state, direction): new_state = state[:] if direction == 1: new_state[0] = cl1[0] + new_state[0] new_state[1] = cl1[1] + new_state[1] if new_state[0]>=1 and new_state[0]=1 and new_state[1]=1 and new_state[0]=1 and new_state[1]=1 and new_state[0]=1 and new_state[1]=1 and new_state[0]=1 and new_state[1]=1 and new_state[0]=1 and new_state[1]=1 and new_state[0]=1 and new_state[1]=1 and new_state[0]=1 and new_state[1]=1 and new_state[0]=1 and new_state[1]

Ngày đăng: 22/12/2021, 08:44

Xem thêm:

TỪ KHÓA LIÊN QUAN

Mục lục

    Ứng dụng BFS để giải quyết bài tập đường đi của quân mã trong đồ thị

    Giải thuật tìm kiếm theo chiều rộng (Breadth First Search)

    from collections import deque

    def __init__(self, state, parent, move, depth, cost):

    def __eq__(self, other):

    def __lt__(self, other):

    Queue = deque([data(startPoint,None,None, 0, 0)])

    for path in possiblePath:

    if path.map not in boardVisited:

    stack = list([data(startPoint, None, None, 0, 0)])

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w