Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 27 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
27
Dung lượng
809,2 KB
Nội dung
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NÂNG CAO ĐỀ TÀI: QUAY LUI VÀ SUDOKU Sinh viên thực : NGUYỄN THẾ SINH GIÁP ANH TÀI NGUYỄN HẢI NAM Giảng viên hướng dẫn : VŨ VĂN ĐỊNH Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : Lớp : Khóa : 2018 - 2023 Hà Nội, tháng 07 năm 2020 PHIẾU CHẤM ĐIỂM STT Họ tên sinh viên Nguyễn Thế Sinh Giáp Anh Tài Nguyễn Hải Nam Họ tên giảng viên Nội dung thực Chữ ký Điểm Chữ ký Ghi Giảng viên chấm 1: Giảng viên chấm 2: MỤC LỤC PHIẾU CHẤM ĐIỂM MỤC LỤC DANH MỤC HÌNH ẢNH LỜI MỞ ĐẦU NỘI DUNG THỰC HIỆN Chương Giới thiệu toán thực 1.1 Giới thiệu toán sudoku .1 1.2 Giới thiệu kỹ thuật quay lui 1.2.1 Giải thích 1.2.2 Cài đặt 1.2.3 Heuristic 1.2.4 Tư tưởng thuật toán 1.2.5 Ví dụ 1.2.6 Phương pháp 1.2.7 Mô tả 1.3 Kết luận .7 1.3.1 Về toán sudoku 1.3.2 Về kỹ thuật quay lui Chương Phân tích toán 2.1 Phân tích tốn 2.2 Giải thuật cho toán 2.2.1 Giải thuật cho toán .9 2.2.2 Tổ chức chương trình .9 2.2.3 Các hàm giải 10 2.3 Cấu trúc liệu sử dụng 10 Chương Cài đặt, đánh giá thử nghiệm 12 3.1 Giới thiệu chương trình 12 3.2 Các thành phần chương trình .13 3.2.1 Thành phần hiển thị nhập bảng sudoku 13 3.2.2 Bảng đếm số lượng chưa nhập 14 3.2.3 Nút giải 15 3.3 Một số hình ảnh chạy chương trình 15 3.4 Kết luận .18 KẾT LUẬN 19 DANH MỤC TÀI LIỆU THAM KHẢO 20 DANH MỤC HÌNH ẢNH Hình 1.1: Ví dụ sudoku .2 Hình 1.2: Ví dụ quay lui .6 Hình 2.1: Input Sudoku Hình 2.2: Output Sudoku Hình 3.1: Giao diện .12 Hình 3.2: Giao diện nhập 13 Hình 3.3: Bảng đếm số lại .14 Hình 3.4: Bảng đếm số cịn lại hoạt động 14 Hình 3.5: Nút giải 15 Hình 3.6: Giao diện nhập .15 Hình 3.7: Giao diện giải thành công .16 Hình 3.8: Giao diện thơng báo bảng giải 16 Hình 3.9: Giao diện thông báo lỗi 17 Hình 3.10: Giao diện bảng giải thành cơng 17 Hình 3.11: Giao diện khơng thể giải .18 LỜI MỞ ĐẦU Môn học Cấu trúc liệu giải thuật nâng cao cung cấp kiến thức chiến lược, kỹ thuật, cấu trúc liệu phức tạp Với kiến thức đạt trình học tập, nhóm chúng em vận dụng vào đề tài giải toán đố sudoku với kỹ thuật quay lui Đề tài Quay lui sudoku sử dụng ba ngôn ngữ html css javascript để biểu diễn kỹ thuật quay lui với công cụ lập trình Visual Studio Code 2020, với trình quản lý phiên Git, chạy node package live-server offline Chương trình deploy lên GitHub chạy online với tên miền: Nhóm chúng em xin cảm ơn thầy Vũ Văn Định tận tình truyền đạt kiến thức trình học tập trình làm chuyên đề NỘI DUNG THỰC HIỆN Chương Giới thiệu toán thực 1.1 Giới thiệu tốn sudoku Trị chơi kiến trúc sư Howard Garns New York thiết kế giới thiệu lần vào năm 1979 tạp chí Dell (Mỹ) với tên gọi "Number Place" Tháng 4/1984, Number Place lần giới thiệu Nhật báo Monthly Nikolist với tên gọi "Suuji wa dokusinh ni kagiru", dịch sang tiếng Anh có nghĩa "những số phải độc nhất" "những số tìm thấy lần" "rút gọn" thành sudoku (su = number, doku = single) Nhưng trò chơi trở nên phổ biến người Anh nhập Báo Times số ngày 12/11/2004 giới thiệu với tên gọi “sudoku” dựa kết phát triển chương trình trị chơi máy vi tính quan tòa hưu người New Zealand sống Hongkong tên Wayne Gould Sau đó, sudoku xuất hầu hết tờ báo hàng đầu Anh "đưa" đến Australia nhờ tập đoàn báo chí Telegarph Từ ngày 2/8/2005, chương trình Radio Times đài BBC (Anh) có chuyên đề tuần sudoku mang tên Super sudoku sudoku xuất tivi lần vào ngày 1/7/2005 chương trình sudoku Live kênh Sky One Đây thi gồm đội (mỗi đội người với nhân vật tiếng) tranh tài với nhau, tạo nên bảng sudoku lớn giới (rộng 84 m với 1905 giải pháp đúng), câu đố khắc sườn đồi Chipping Sodbury nước Anh Hiện nay, sudoku có mặt báo, tạp chí hàng đầu trở thành trò chơi gây sốt 40 quốc gia vùng lãnh thổ giới, có Việt Nam sudoku xuất Việt Nam sớm tạp chí Khám Phá (Trực thuộc Sở Khoa học Công nghệ Thành phố Hồ Chí Minh), sau đến Thanh Niên, Hoa Học Trị, xem hình thức giải trí đầy trí tuệ giới trẻ Đặc biệt, mục Vua trị chơi báo Hoa Học Trị với "món chủ lực" sudoku thu hút đông học sinh tham gia (theo kết công bố báo) Quy luật trị chơi tương đối đơn giản Cho bàn hình vuông chia thành lưới 81 ô nhỏ gồm hàng cột, 81 nhỏ lại chia thành vùng, vùng có Đề sudoku bàn hình vng thế, số người ta điền sẵn số giá trị Cách chơi sau: Phải điền số từ đến vào hàng dọc, ngang không trùng lặp Ở hàng dọc, hàng ngang ô vuông 3*3 phân cách vạch đen đậm số sử dụng lần khơng lặp lại Ví dụ sau: Hình 1.1: Ví dụ sudoku 1.2 Giới thiệu kỹ thuật quay lui Quay lui (tiếng Anh: backtracking) chiến lược tìm kiếm lời giải cho toán thỏa mãn ràng buộc Người đề thuật ngữ (backtrack) nhà toán học người Mỹ D H Lehmer vào năm 1950 1.2.1 Giải thích Các tốn thỏa mãn ràng buộc tốn có lời giải đầy đủ, thứ tự phần tử không quan trọng Các toán bao gồm tập biến mà biến cần gán giá trị tùy theo ràng buộc cụ thể toán Việc quay lui để thử tất tổ hợp để tìm lời giải Thế mạnh phương pháp nhiều cài đặt tránh việc phải thử nhiều tổ hợp chưa hồn chỉnh, nhờ giảm thời gian chạy Phương pháp quay lui có quan hệ chặt chẽ với tìm kiếm tổ hợp 1.2.2 Cài đặt Về chất, tư tưởng phương pháp thử khả tìm thấy lời giải Đó q trình tìm kiếm theo độ sâu tập hợp lời giải Trong trình tìm kiếm, ta gặp hướng lựa chọn không thỏa mãn, ta quay lui điểm lựa chọn nơi có hướng khác thử hướng lựa chọn Khi thử hết lựa chọn xuất phát từ điểm lựa chọn đó, ta quay lại điểm lựa chọn trước thử hướng lựa chọn Q trình tìm kiếm thất bại khơng cịn điểm lựa chọn Quy trình thường cài đặt hàm đệ quy mà thể hàm lấy thêm biến gán tất giá trị cho biến đó, với lần gán trị lại gọi chuỗi đệ quy để thử biến Chiến lược quay lui tương tự với tìm kiếm theo độ sâu sử dụng khơng gian nhớ hơn, lưu giữ trạng thái lời giải cập nhật 1.2.3 Heuristic Để tăng tốc q trình tìm kiếm, giá trị chọn, trước thực lời gọi đệ quy, thuật tốn thường xóa bỏ giá trị khỏi miền xác định biến có mâu thuẫn chưa gán (kiểm tra tiến forward checking) kiểm tra tất số để tìm giá trị khác bị loại trừ giá trị vừa gán (lan truyền ràng buộc - constraint propagation) Người ta thường sử dụng số phương pháp heuristic để tăng tốc cho trình quay lui Do biến xử lý theo thứ tự bất kỳ, việc thử biến bị ràng buộc chặt (nghĩa biến có lựa chọn giá trị nhất) thường có hiệu tỉa tìm kiếm từ sớm (cực đại hóa ảnh hưởng lựa chọn sớm hành) Các cài đặt quay lui phức tạp thường sử dụng hàm biên, hàm kiểm tra xem từ lời giản chưa đầy đủ thu lời giải hay không, nghĩa hướng liệu có ích hay khơng Nhờ đó, kiểm tra biên phát lời giải dở dang chắn thất bại nâng cao hiệu tìm kiếm Do hàm hay chạy, bước, phí tính tốn biên cần tối hiểu, khơng, hiệu tồn cục thuật tốn khơng cải tiến end; end; end; (Thuật toán quay lui bắt đầu lời gọi Try(1);) Ta trình bày q trình tìm kiếm lời giải thuật tốn quay lui sau: Hình 1.2: Ví dụ quay lui 1.3 Kết luận 1.3.1 Về toán sudoku Đây tốn đơn giản lại địi hỏi nhiều trí tuệ Thích hợp để rèn luyện khả tư Và vơ thích hợp để ứng dụng quay lui để giải 1.3.2 Về kỹ thuật quay lui Ưu điểm: Việc quay lui thử tất tổ hợp để tìm lời giải Thế mạnh phương pháp nhiều cài đặt tránh việc phải thử nhiều trường hợp chưa hoàn chỉnh, nhờ giảm thời gian chạy Nhược điểm: Trong trường hợp xấu độ phức tạp quay lui cấp số mũ Vì mắc phải nhược điểm sau: - Rơi vào tình trạng "thrashing": qúa trình tìm kiếm gặp phải bế tắc với nguyên nhân - Thực công việc dư thừa: Mỗi lần quay lui, cần phải đánh giá lại lời giải đơi lúc điều không cần thiết - Không sớm phát khả bị bế tắc tương lai Quay lui chuẩn, khơng có chế nhìn tương lai để nhận biết đc nhánh tìm kiếm vào bế tắc Chương Phân tích tốn 2.1 Phân tích toán Input: Một bảng số người dùng nhập giao diện (GUI) Ví dụ người dùng nhập sau: Hình 2.1: Input Sudoku Output: Kết tốn Có thể có đáp án khơng có đáp án Sẽ hiển thị sau: Hình 2.2: Output Sudoku 2.2 Giải thuật cho toán 2.2.1 Giải thuật cho toán Bước Lấy tất số phù hợp với ô trống Bước Tạo tất hàng phù hợp hàng tùy thuộc vào danh sách số phù hợp Bước Chọn hàng từ danh sách hàng đặt vào hàng Bước Đi đến hàng tìm tất số phù hợp với ô Bước Tạo tất hàng phù hợp hàng này, sau chuyển sang bước đến hàng cuối khơng cịn hàng cịn lại Bước Nếu hàng khơng cịn khả chuyển sang hàng trước thử khả từ danh sách hàng khả Bước Nếu hàng cuối đạt hàng thỏa mãn tìm thấy tốn giải 2.2.2 Tổ chức chương trình Chương trình tổ chức theo dạng hàm thủ tục với hàm ứng với nhiệm vụ khác Chương trình viết theo hướng đơn giản với 1giao diện để người dùng tương tác Dự kiến giao diện gồm bảng sudoku chính, bảng đếm số lượng nút chạy giải 2.2.3 Các hàm giải function getColumns(grid) {}: trả trả mảng cột bảng sudoku function getBlocks(grid) {}: trả giá trị khối 3x3 bảng sudoku function replaceCharAt(string, index, char) {}: thực thay giá trị ô bảng function generatePossibleNumber(rows, columns, blocks) {}: Sinh tất số thỏa yêu cầu để điền vào bảng sudoku function solveGrid(possibleNumber, rows, startFromZero) {}: Gọi hàm nextStep() để giải toán, trả kết bảng có, khơng trả khơng giải function nextStep(level, possibleNumber, rows, solution, startFromZero) {}: hàm chạy đệ quy, kiểm tra xem giá trị hàng có hay chưa kiểm tra tính hợp lệ giá trị ô Trả có đáp án, -1 khơng có function generatePossibleRows(possibleNumber) {}: Sinh hàng số thỏa yêu cầu để điền vào bảng sudoku function ViewPuzzle(grid) {}: Đọc đầu vào người dùng function readInput() {}: Đọc đầu vào người dùng function checkValue(value, row, column, block, defaultValue, currectValue) {}: kiểm tra giá trị người dùng nhập function updateRemainingTable(){}:Hỗ trợ cập nhật giá trị bảng remaining function solveSudoku(changeUI) {}: thay đổi giao diện kết Function solveButtonClick() {} Gọi tất hàm người dùng bấm, thực thi việc giải toán 2.3 Cấu trúc liệu sử dụng Cấu trúc liệu toán liệu kiểu mảng người dùng điền liệu vào bảng sudoku Một mảng chứa liệu bảng sudoku mà người dùng nhập vào: let puzzle = []; Một mảng chứa kết đầu bảng sudoku giải: let solution = []; Một mảng dùng để đếm số lượng ứng với số chưa người dùng nhập: let remaining = [9, 9, 9, 9, 9, 9, 9, 9, 9]; Ví dụ puzzle = [[1,2,3,4,5,6,7,8,9]] nghĩa người dùng nhập vào dòng bảng sudoku giá trị ô thứ nhất, ô thứ 2,… ô thứ solution=[ [1,2,3,4,5,6,7,8,9], 10 [4,5,6,7,8,9,1,2,3], [7,8,9,1,2,3,4,5,6], [2,1,4,3,6,5,8,9,7], [3,6,5,8,9,7,2,1,4], [8,9,7,2,1,4,3,6,5], [5,3,1,6,4,2,9,7,8], [6,4,2,9,7,8,5,3,1], [9,7,8,5,3,1,6,4,2] ] đáp án cho toán người dùng nhập Tương ứng hàng đầu tiên, giá trị điền vào ô thuộc hàng bảng, giá trị điền vào ô thứ hai hàng bảng, tiếp tục tới số hàng cuối điền vào ô cuối hàng cuối remaining=[8,9,8,9,9,9,0,9,7] tức người dùng điền vào bảng giá trị bảng có giá trị 1, giá 3, giá trị 9, giá trị Chương Cài đặt, đánh giá thử nghiệm 3.1 Giới thiệu chương trình Chương trình có giao diện Người dùng nhập bảng sudoku thơng qua bảng hình Bên trái có bảng đếm số lượng số chưa nhập Trên nút giải bảng sudoku Chương trình nhắm tới mục tiêu giải tốn nhanh xác 11 Hình 3.1: Giao diện 3.2 Các thành phần chương trình 3.2.1 Thành phần hiển thị nhập bảng sudoku 12 Hình 3.2: Giao diện nhập Đây hình hiển thị đáp án cho sudoku Các chức bao gồm nút di chuyển nút tab ta sử dụng chuột hỗ trợ cho trình nhập liệu 13 3.2.2 Bảng đếm số lượng chưa nhập Hình 3.3: Bảng đếm số lại Bảng giúp đếm số lượng số chưa nhập Ví dụ người dùng nhập số lần số lượng cịn 8: Hình 3.4: Bảng đếm số cịn lại hoạt động 3.2.3 Nút giải 14 Hình 3.5: Nút giải Khi người dùng bấm nút chạy chương trình giải Sau khoảng thời gian ngắn ( tối đa giây) thông báo giải đáp án 3.3 Một số hình ảnh chạy chương trình Hình 3.6: Giao diện nhập 15 Hình 3.7: Giao diện giải thành cơng Hình 3.8: Giao diện thơng báo bảng giải 16 Hình 3.9: Giao diện thơng báo lỗi Hình 3.10: Giao diện bảng giải thành cơng 17 Hình 3.11: Giao diện khơng thể giải 3.4 Kết luận Chương trình đáp ứng yêu cầu giải toán 18 KẾT LUẬN Chương trình tạo có ưu nhược điểm sau: Ưu điểm - Cài đặt kỹ thuật quay lui - Chương trình giải tốn, thỏa mãn yêu cầu đặt - Giao diện đẹp, thân thiện dễ dùng Nhược điểm - Thuật toán cài đặt chưa tối ưu - Giải sudoku hạn chế, giải dạng chuẩn 9x9 - Phần nhập liệu cịn bất tiện - Cịn có vấn đề với dạng sudoku giải, dễ làm chương trình bị lỗi Hướng phát triển Sudoku ngày có nhiều dạng nên chương trình cần phát triển theo hướng giải nhiều dạng sudoku khác nhau, áp dụng thêm nhiều thuật toán nhằm giải tối ưu hơn, đồng thời nâng cao số đáp án giải 19 DANH MỤC TÀI LIỆU THAM KHẢO Tiếng Việt [1].Giải thuật lập trình, tác giả Lê Minh Hoàng Websites www.wikipedia.org www.codepen.io 20 ... chiến lược, kỹ thuật, cấu trúc liệu phức tạp Với kiến thức đạt q trình học tập, nhóm chúng em vận dụng vào đề tài giải toán đố sudoku với kỹ thuật quay lui Đề tài Quay lui sudoku sử dụng ba ngôn... function solveSudoku(changeUI) {}: thay đổi giao diện kết Function solveButtonClick() {} Gọi tất hàm người dùng bấm, thực thi việc giải toán 2.3 Cấu trúc liệu sử dụng Cấu trúc liệu toán liệu kiểu... end; end; (Thuật toán quay lui bắt đầu lời gọi Try(1);) Ta trình bày q trình tìm kiếm lời giải thuật tốn quay lui sau: Hình 1.2: Ví dụ quay lui 1.3 Kết luận 1.3.1 Về toán sudoku Đây tốn đơn giản