Bài toán “ Mã đi tuần” là một bài toán thú vị, tương đối kinh điển của thuật toán quay lui vét cạn – 1 thuật toán quan trọng và phổ biến trong Trí tuệ Nhân tạo. Mã đi tuần (hay hành trình của quân mã) là bài toán về việc di chuyển một quân mã trên bàn cờ vua ( 8 x 8). Quân mã được đặt ở một ô trên một bàn cờ trống nó phải di chuyển theo quy tắc của cờ vua để đi qua mỗi ô trên bàn cờ đúng một lần. Chính vì vây ch ̣ úng em đã đi đến viêc l ̣ ựa chọn đề tài “ÁP DỤNG THUẬT TOÁN QUAY LUI VÉT CẠN GIẢI QUYẾT BÀI TOÁN MÃ ĐI TUẦN” cho bài tâp lớn môn C ̣ ấu trúc dữ liêu ṿ à giải thuât nâng cao. Chúng em vô cùng biết ơn ̣ thầy Phạm Đức Hồng, người trực tiếp giảng dạy, hướng dẫn nhiệt tình cho chúng em trong quá trình nghiên cứu và thực hiện đề tài.
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUN ĐỀ HỌC PHẦN NHẬP MƠN TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: ÁP DỤNG THUẬT TOÁN QUAY LUI VÉT CẠN GIẢI QUYẾT BÀI TOÁN MÃ ĐI TUẦN Sinh viên thực : TRẦN ĐĂNG QUANG PHẠM LÊ KHÁNH HUYỀN PHẠM QUANG KHẢI Giảng viên hướng dẫn : PHẠM ĐỨC HỒNG Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : QUẢN TRỊ AN NINH MẠNG Lớp : D13QTANM Khóa : 2018-2023 Hà Nội, tháng 10 năm 2020 TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUN ĐỀ HỌC PHẦN NHẬP MƠN TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: ÁP DỤNG THUẬT TOÁN QUAY LUI VÉT CẠN GIẢI QUYẾT BÀI TOÁN MÃ ĐI TUẦN Sinh viên thực : TRẦN ĐĂNG QUANG PHẠM LÊ KHÁNH HUYỀN PHẠM QUANG KHẢI Giảng viên hướng dẫn : PHẠM ĐỨC HỒNG Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : QUẢN TRỊ AN NINH MẠNG Lớp : D13QTANM Khóa : 2018-2023 Hà Nội, tháng 10 năm 2020 PHIẾU CHẤM ĐIỂM Sinh viên thực hiện: PHIẾU CHẤM ĐIỂM STT Họ tên sinh viên Trần Đăng Quang Phạm Lê Khánh Huyền Phạm Quang Khải Nội dung thực Điểm Chữ ký Giảng viên chấm: Họ tên Giảng viên chấm : Chữ ký Ghi Giảng viên chấm : MỤC LỤC DANH MỤC HÌNH ẢNH LỜI MỞ ĐẦU CHƯƠNG 1: GIỚI THIỆU VỀ AI VÀ THUẬT TOÁN QUAY LUI VÉT CẠN 1.1 GIỚI THIỆU VỀ TRÍ TUỆ NHÂN TẠO .9 1.1.1 Trí tuệ nhân tạo gì ? .9 1.1.2 Lịch sử .10 1.1.3 Lĩnh vực AI 11 1.2 GIỚI THIỆU VỀ KỸ THUẬT QUAY LUI 12 1.2.1 Tư tưởng 12 1.2.2 Heuristic 13 1.2.3 Phương pháp 13 1.2.4 Mơ hình toán .14 1.3 MỘT SỐ BÀI TOÁN ỨNG DỤNG .15 1.3.1 Liệt kê dãy nhị phân có độ dài n 15 1.3.2 Bài toán liệt kê hoán vị tổ hợp .18 1.3.3 Bài toán quân hậu (n quân hậu) .20 1.4 Kết luận 27 CHƯƠNG 2: BÀI TOÁN MÃ ĐI TUẦN 28 2.1 BÀI TOÁN 28 2.1.1 Nước quân Mã (♘) bàn cờ 28 2.1.2 Xuất xứ toán .30 2.2 GIẢI QUYẾT BÀI TOÁN 30 2.2.1 Ý tưởng 30 2.2.2 Thiết kế thuật toán .31 CHƯƠNG 3: CÀI ĐẶT, ĐÁNH GIÁ THỬ NGIỆM 35 3.1 Cài đặt với C++ .35 3.1.1 Code 35 3.1.2 Kết đạt 38 3.1.3 Kết luận 38 3.2 Cặt đặt với C# Winform 38 3.2.2 Giao diện chương trình 44 3.2.3 Kết luận 50 KẾT LUẬN .51 TÀI LIỆU THAM KHẢO 52 DANH MỤC HÌNH ẢNH Hình 1.1: Cây mơ tả thuật tốn quay lui .15 Hình 1.2: Hàm gen 16 Hình 1.3: Hàm xuất 16 Hình 1.4: Kết chạy chương trình liệt kê dãy nhị phân có đo dài n 17 Hình 1.5: Liệt kê hốn vị với n=3 18 Hình 1.6: Kết chạy chương trình liệt kê hốn vị tổ hợp .20 Hình 1.7: Kết chạy chương trình tốn qn hậu 26 Hình 2.1: Vị trí xuất phát qn Mã bàn cờ 28 Hình 2.2: Nước quân Mã .29 Hình 2.3: Mã rìa giống đồ trang trí 30 Hình 2.4: Các nước có ngựa .32 Hình 3.1: Kết đạt với C++ .38 Hình 3.2: Giao diện chạy chương trình 44 Hình 3.3: Nhập kích thước bàn cờ tạo bàn cờ 45 Hình 3.4: Chọn vị trí bắt đầu cho quân mã 46 Hình 3.5: Qn mã có đầy đủ nước .47 Hình 3.6: Qn mã cạnh bàn cờ có số nước .48 Hình 3.7: Quân mã tuần 49 Hình 3.8: Kết cuối 50 LỜI MỞ ĐẦU Bài toán “ Mã tuần” toán thú vị, tương đối kinh điển thuật toán quay lui vét cạn – thuật tốn quan trọng phổ biến Trí tuệ Nhân tạo Mã tuần (hay hành trình quân mã) toán việc di chuyển quân mã trên bàn cờ vua ( x 8) Quân mã đặt bàn cờ trống phải di chuyển theo quy tắc cờ vua để qua ô bàn cờ lần Chính vì vâ ̣y chúng em đã đến viê ̣c lựa chọn đề tài “ÁP DỤNG THUẬT TOÁN QUAY LUI VÉT CẠN GIẢI QUYẾT BÀI TOÁN MÃ ĐI TUẦN” cho bài tâ ̣p lớn môn Cấu trúc dữ liê ̣u và giải thuâ ̣t nâng cao Chúng em vô biết ơn thầy Phạm Đức Hồng, người trực tiếp giảng dạy, hướng dẫn nhiệt tình cho chúng em trình nghiên cứu thực đề tài Mặc dù đề tài hồn thành, chắn khơng thể tránh khỏi thiếu sót, chúng em mong muốn nhận ý kiến đóng góp thầy để hồn thiện Chúng em xin chân thành cảm ơn! CHƯƠNG 1: GIỚI THIỆU VỀ AI VÀ THUẬT TOÁN QUAY LUI VÉT CẠN 1.1 GIỚI THIỆU VỀ TRÍ TUỆ NHÂN TẠO 1.1.1 Trí tuệ nhân tạo gì ? Để hiểu trí tuệ nhân tạo (artificial intelligence) bắt đầu với khái niệm bay nhân tạo (flying machines), tức máy bay Đã từ lâu, loài người mong muốn làm máy mà di chuyển không trung mà không phụ thuộc vào địa hình mặt đất, hay nói cách khác máy bay Khơng có ngạc nhiên ý tưởng làm máy bay từ nghiên cứu cách chim bay Những máy biết bay thiết kế theo nguyên lý “vỗ cánh” chim bay quãng đường ngắn lịch sử hàng không thực sang trang kể từ anh em nhà Wright thiết kế máy bay dựa nguyên lý khí động lực học (aerodynamics) Các máy bay nay, thấy, có sức trở lớn bay qng đường vịng quanh giới Nó khơng thiết phải có nguyên lý bay chim bay chim (dáng vẻ), tốt chim Quay lại câu hỏi Trí tuệ nhân tạo Trí tuệ nhân tạo trí thơng minh máy người tạo Ngay từ máy tính điện tử đời, nhà khoa học máy tính hướng đến phát hiển hệ thống máy tính (gồm phần cứng phần mềm) cho có khả thơng minh loài người Mặc dù nay, theo quan niệm người viết, ước mơ xa thành thực, thành tựu đạt không nhỏ: làm hệ thống (phần mềm chơi cờ vua chạy siêu máy tinh GeneBlue) thắng vua cờ giới; làm phần mềm chứng minh tốn hình học; v.v Hay nói cách khác, số lĩnh vực, máy tính thực tốt tương đương người (tất nhiên tất lĩnh vực) Đó hệ thống thơng minh Có nhiều cách tiếp cận để làm trí thơng minh máy (hay trí tuệ nhân tạo), chẳng hạn nghiên cứu cách não người sản sinh trí thơng minh lồi người nhưthế ta bắt chước nguyên lý đó, có cách khác sử dụng nguyên lý hoàn toàn khác với cách sản sinh trí thơng minh lồi người mà làm máy thông minh người; giống máy bay bay tốt chim có chế bay giống chế bay chim Như vậy, trí tuệ nhân tạo nói đến khả máy thực công việc mà người thường phải xử lý; dáng vẻ ứng xử kết thực máy tốt tương đương với người ta gọi máy thơng minh hay máy có trí thơng minh Hay nói cách khác, đánh giá thông minh máy dựa nguyên lý thực nhiệm vụ có giống cách người thực hay khơng mà dựa kết dáng vẻ ứng xử bên ngồi có giống với kết dáng vẻ ứng xử người hay không Các nhiệm vụ người thường xuyên phải thực là: giải tốn (tìm kiếm, chứng minh, lập luận), học, giao tiếp, thể cảm xúc, thích nghi với mơi trường xung quanh, v.v., dựa kết thực nhiệm vụ để kết luận có thơng minh hay khơng Mơn học Trí tuệ nhân tạo nhằm cung cấp phương pháp luận để làm hệ thống có khả thực nhiệm vụ đó: giải tốn, học, giao tiếp, v.v cách làm có người hay không mà kết đạt dáng vẻ bên ngồi người Trong mơn học này, tìm hiểu phương pháp để làm cho máy tính biết cách giải tốn, biết cách lập luận, biết cách học, v.v 1.1.2 Lịch sử Vào năm 1943, Warren McCulioch Walter Pitts bắt đầu thực nghiên cứu ba sở lý thuyết bản: triết học chức noron thần kinh; phân tích mệnh đề logic; lý thuyết dự đoán Turing Các tác giả nghiên cứu đề xt mơ hình noron nhân tạo, noron đặc trưng hai trạng thái “bật”, “tắt” phát mạng noron có khả học Thuật ngữ “Trí tuệ nhân tạo” (Artificial Intelligence - AI) thiết lập John McCarthy Hội thảo chủ đề vào mùa hè năm 1956 Đồng thời, ông đề xuất ngơn ngữ lập trình Lisp – ngơn ngữ lập trình hàm tiêu biểu, sử dụng lĩnh vực AI Sau đó, Alan Turing đưa "Turing test" phương pháp kiểm chứng hành vi thông minh Thập kỷ 60, 70 Joel Moses viết chương trình Macsyma - chương trình tốn học sử dụng sở tri thức thành công Marvin Minsky Seymour Papert đưa chứng minh giới hạn mạng nơ-ron đơn giản Ngơn ngữ lập trình logic Prolog đời phát triển Alain Colmerauer Ted Shortliffe xây dựng thành công số hệ chuyên gia trợ giúp chẩn đoán y học, hệ thống sử dụng ngôn ngữ luật để biểu diễn tri thức suy diễn Vào đầu năm 1980, nghiên cứu thành công liên quan đến AI hệ chuyên gia (expert systems) – dạng chương trình AI mơ tri thức kỹ phân tích nhiều chuyên gia người Vào năm 1990 đầu kỷ 21, AI đạt thành tựu to lớn nhất, AI áp dụng logic, khai phá liệu, chẩn đoán y học nhiều lĩnh vực ứng dụng khác công nghiệp Sự thành công dựa vào nhiều yếu tố: tăng khả tính tốn máy tính, tập trung giải toán cụ thể, xây dựng mối quan hệ AI lĩnh vực khác giải toán tương tự, chuyển giao nhà nghiên cứu cho phương pháp toán học vững chuẩn khoa học xác 1.1.3 Lĩnh vực AI Lập luận, suy diễn tự động: Khái niệm lập luận (reasoning), suy diễn (reference) sử dụng phổ biến lĩnh vực AI Lập luận suy diễn logic, dùng để tiến trình rút kết luận (tri thức mới) từ giả thiết cho (được biểu diễn dạng sở tri thức) Như vậy, để thực lập luận người ta cần có phương pháp lưu trữ sở tri thức thủ tục lập luận sở tri thức Biểu diễn tri thức: Muốn máy tính lưu trữ xử lý tri thức cần có phương pháp biểu diễn tri thức Các phương pháp biểu diễn tri thức bao gồm ngôn ngữ biểu diễn kỹ thuật xử lý tri thức Một ngôn ngữ biểu diễn tri thức đánh giá “tốt” có tính biểu đạt cao tính hiệu thuật tốn lập luận ngơn ngữ Tính biểu đạt ngơn ngữ thể khả biểu diễn phạm vi rộng lớn thông tin miền ứng dụng Tính hiệu thuật tốn lập luận thể chi phí thời gian khơng gian dành cho việc lập luận Tuy nhiên, hai yếu tố dường đối nghịch nhau, tức ngôn ngữ có tínhbiểu đạt cao thuật tốn lập luận có độ phức tạp lớn (tính hiệu thấp)và ngược lại (ngơn ngữ đơn giản, có tính biểu đạt thấp thuật tốn lập luận có hiệu cao) Do đó, thách thức lớn lĩnh vực AI xây dựng ngôn ngữ biểu diễn tri thức mà cân hai yếu tố này, tức ngơn ngữ có tínhbiểu đạt đủ tốt (tùy theo ứng dụng) lập luận hiệu 10 } 3.1.2 Kết đạt Với n = 8; x = 1; y =1: Hình 3.1: Kết đạt với C++ 3.1.3 Kết luận - Ưu điểm: Cài đặt thuật toán nhanh , dễ hiểu dễ cài đặt ngắn gọn - Nhược điểm: Chạy lâu đệ quy nhiều lần, khơng có giao diện khó hình dung 3.2 Cặt đặt với C# Winform 3.2.1 Cài đặt thuật toán Bước 1: Cấu trúc nước quân mã struct nuocDi { public int n; //So o co the di tiep public int x, y; //Vi tri }; 37 Bước 2: Khai báo biến cần thiết private int x, y; // toạ độ quân mã private int kichThuoc; //kích thước bàn cờ private bool ngung = false; private int[,] duongDi = new int[2501, 2501]; private int[,] vt = new int[2, 2501]; public int[,] _vt = new int[2, 2501]; quân mã //đường quân mã //vị trí quân mã //mảng tổng hợp vị trí int[] dx = { 2, 1, -1, -2, -2, -1, 1, }; //mảng chứa nước có quân mã int[] dy = { 1, 2, 2, 1, -1, -2, -2, -1 }; nuocDi temp = new nuocDi(); Bước 3: Set giá trị cho biến public void SetGT(int _x, int _y, int _kt) { x = _x; y = _y; kichThuoc = _kt; } Bước 4: Khởi tạo private void KhoiTao() { //Khoi tao gia tri ban dau cho vi tri cua quan ma = 38 for (int i = 0; i < kichThuoc * kichThuoc; i++) { vt[0, i] = 0; vt[1, i] = 0; _vt[0, i] = 0; _vt[1, i] = 0; } //Khoi tao duong di cua quan Ma = for (int i = 0; i < kichThuoc; i++) { for (int j = 0; j < kichThuoc; j++) { duongDi[i, j] = 0; } } //một quân mã nước } Bước 5: Tính số nước đi tiếp quân mã private int TinhSoNuocDi(int _x, int _y) { int i, j, n = 0; for (int k = 0; k < 8; k++) { 39 i = _x + dx[k]; j = _y + dy[k]; //ơ nằm bàn cờ quân Mã chưa qua if (i >= && i = && j = && i = && j 0) { //Sap xep cac nuoc di tang dan theo so o co the di tiep for (i = 0; i < soNuocDi - 1; i++) 41 { for (j = i + 1; j < soNuocDi; j++) { if (luaChon[i].n > luaChon[j].n) { temp = luaChon[i]; luaChon[i] = luaChon[j]; luaChon[j] = temp; } } } //lưu tọa độ bước for (i = 0; i < soNuocDi; i++) { duongDi[luaChon[i].x, luaChon[i].y] = buoc + 1; vt[0, buoc] = luaChon[i].x; vt[1, buoc] = luaChon[i].y; TimDuong(luaChon[i].x, luaChon[i].y, buoc + 1); duongDi[luaChon[i].x, luaChon[i].y] = 0; } } } } 42 } 3.2.2 Giao diện chương trình 3.2.2.1 Giao diện chạy chương trình Hình 3.2: Giao diện chạy chương trình 3.2.2.2 Nhập kích thước bàn cờ tạo bàn cờ ( sử dụng thư viện System.Drawing để vẽ bàn cờ ) 43 Hình 3.3: Nhập kích thước bàn cờ tạo bàn cờ 44 3.2.2.3 Chọn vị trí bắt đầu cho quân mã ( cách click vào bàn cờ ) Hình 3.4: Chọn vị trí bắt đầu cho quân mã 45 3.2.2.4 Xem vị trí qn mã Hình 3.5: Qn mã có đầy đủ nước 46 Hình 3.6: Quân mã cạnh bàn cờ có số nước 47 3.2.2.5 Bắt đầu tuần ( click vào button tuần ) Hình 3.7: Quân mã tuần 48 3.2.2.6 Kết cuối Hình 3.8: Kết cuối 3.2.3 Kết luận - Uư Điểm: Có giao diện dễ sử dụng, gần gũi với người dùng - Nhược Điểm: Code dài cài đặt phức tạp người tiếp cận lập trình 49 KẾT LUẬN Với kiến thức có mình, chúng em hồn thành u cầu tiến hành thực hiê ̣n đề tài “ÁP DỤNG THUẬT TOÁN QUAY LUI VÉT CẠN GIẢI QUYẾT BÀI TOÁN MÃ ĐI TUẦN” Tuy nhiên, trình làm khơng tránh khỏi thiếu sót, có chỗ cịn vướng mắc, vậy, chúng em mong góp ý giúp đỡ thầy giáo, để hoàn thiện hơn ! Chúng em xin gửi lời cảm ơn chân thành tới giảng viên Phạm Đức Hồng giảng viên giảng dạy mơn Nhập mơn Trí tuệ nhân tạo lớp D13QTANM tận tình hướng dẫn chúng em hồn thành đề tài này! Chúng em xin chân thành cảm ơn! 50 TÀI LIỆU THAM KHẢO Phạm Đức Hồng, Giáo trình Nhập mơn Trí tuệ Nhân tạo, Đại học Điện Lực Phạm Thọ Hồn, Phạm Thị Anh Lê, Giáo trình Trí tuệ Nhân tạo, Đại học Sư Phạm Hà Nội Đinh Mạnh Tường, Cấu trúc liệu giải thuật, NXB khoa học kỹ thuật, 2001 N Wirth, Algorithms and Data Structure, Prentice Hall, 1985 Cẩm nang thuật toán – – Robert Sedgewich – Trần Đan Thư Lập trình = Thuật tốn + CTDL, N Wirth Trang web GeekforGeek.com 51 ... 27 CHƯƠNG 2: BÀI TOÁN MÃ ĐI TUẦN 28 2. 1 BÀI TOÁN 28 2. 1.1 Nước quân Mã (♘) bàn cờ 28 2. 1 .2 Xuất xứ toán .30 2. 2 GIẢI QUYẾT BÀI TOÁN ... đường quân Mã 2. 2 GIẢI QUYẾT BÀI TỐN 2. 2.1 Ý tưởng Có nhiều cách giải cho toán ngựa tuần Nhưng ta sử dụng thuật toán quay lui để giải tốn Xuất phát từ ơ, gọi số nước t = 1, ta cho quân mã thử tiếp... DENDRAL, … Robotics … 1 .2 GIỚI THIỆU VỀ KỸ THUẬT QUAY LUI Thuật toán quay lui vét cạn (Backtracking) kĩ thuật thiết kế giải thuật dựa đệ quy Ý tưởng quay lui tìm lời giải bước, bước chọn số lựa