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

Báo cáo đồ án 1Phạm Duy Anh

18 967 18

Đ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

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 606,89 KB

Nội dung

Tài liệu chia sẻ cách viết bài báo cáo đồ án 1 đề tài game tic tắc toe và các thuật toán sắp xếp cho các bạn sinh viên lần đầu làm báo cáo đồ án công nghệ thông tin. Mình mong rằng sẽ nhận được sự ủng hộ tích cực từ phía các bạn.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THỒNG o0o Đồ án 1: Lập trình Giảng viên hướng dẫn: TS.Ngô Lam Trung Họ tên: Phạm Duy Anh MSSV: 20155076 Lớp: CN-CNTT2-K60 Hà Nội, tháng năm 2017 MỤC LỤC PHẦN MỞ ĐẦU CHUƠNG GIỚI THIỆU 1.1 Các thuật toán xếp .3 1.2 Nén giải nén giải thuật Huffman 1.3 Game Tic Tac Toe CHƯƠNG PHÁT BIỂU VẤN ĐỀ 2.1 Các thuật toán xếp .4 2.1.1 Sắp xếp bọt( Bubble sort) 2.1.2 Sắp xếp chọn( select sort) 2.1.3 Sắp xếp chèn ( Insert sort) 2.1.5 Sắp xếp trộn( Merge sort) 2.1.6 Sắp xếp vun đống( Heap sort) .10 2.2 Nén giải nén giải thuật Huffman 13 2.2.1 Tổng quan .13 2.2.2 Nén giải nén .13 2.3 Game Tic Tac Toe 15 2.3.1 Giới thiệu 15 2.3.2 Phân tích thiết kế 16 CHƯƠNG KẾT QUẢ VÀ ỨNG DỤNG 18 PHẦN MỞ ĐẦU Sau đề tài môn học Đồ án 1, em đạt số học kĩ cho thân Trong trình làm đề tài với hướng dẫn tận tình TS Ngô Lam Trung, em phát khắc phục nhiều lỗi nhỏ Các kĩ thuật xử lý liệu với file, pointer, … Em xin gửi lời cảm ơn chân thành sâu sắc tới TS Ngô Lam Trung- giảng viên hướng dẫn Đồ án 1: Lập trình giúp em nhiều trình thực Sự hướng dẫn tận tình thầy giúp em thu nhiều kết tốt CHUƠNG GIỚI THIỆU Bài báo cáo vấn đề: Các thuật toán xếp, Nén giải nén giải thuật Huffman, game Tic Tac Toe 1.1 Các thuật toán xếp Các thuật toán xếp thuật toán tìm kiếm vấn đề nhiều nhà khoa học quan tâm Trong khoa học máy tính toán học, thuật toán xếp thuật toán xếp phần tử danh sách mảng theo thứ tự tăng( giảm), thường xét đến trường hợp số 1.2 Nén giải nén giải thuật Huffman Trong khoa học máy tính lý thuyết thông tin, mã hóa Huffman thuật toán mã hóa khởi đầu cho việc nén liệu dựa bảng tần suất xuất kí tự cần mã hóa để xây dựng mã nhị phân cho kí tự cho dung lượng( tổng số bit) nhỏ 1.3 Game Tic Tac Toe Tic Tac Toe trò chơi phổ biến nay, chơi bàn cờ có kích thước 3x3 Hai người chơi, người dùng kí hiệu O, người dùng kí hiệu X, điền kí hiệu vào ô trống Người thắng người tạo nước cờ ngang, dọc chéo CHƯƠNG PHÁT BIỂU VẤN ĐỀ 2.1 Các thuật toán xếp 2.1.1 Sắp xếp bọt( Bubble sort) Sắp xếp bọt thuật toán xếp đơn giản, với thao tác so sánh cặp phần tử liền nhau, chúng chưa đứng vị trí đổi vị trí ( swap) chúng cho Có thể tiến hành từ xuống( bên trái sang) từ lên( bên phải sang) Sắp xếp bọt sử dụng phép so sánh phần tử nên giải thuật so sánh a) Giải thuật Giả sử dãy cần xếp có n phần tử Ta bắt đầu so sánh từ cặp phần tử 2, cặp phần tử n-1 n, phần tử đứng trước lớn phần tử đứng sau ta swap Sau n-1 bước so sánh phần tử cuối phần tử lớn Ta tiếp tục so sánh với dãy n-1 số đầu dãy vừa xếp … ( Trong lần duyệt mà không cần swap lần có nghĩa dãy xếp) b) Mã giả procedure swap(var a, b:integer) var temp:integer; temp=a;a=b;b=a; endprocedure procedure bubbleSort(list L, number n) for number i from n downto //n số phần tử dãy for number j from to (i - 1) if L[j] > L[j + 1] //nếu chúng không thứ tự swap(L[j], L[j + 1]) //đổi chỗ chúng cho endif endfor endfor endprocedure c) Độ phức tạp Với i=n, n-1, …, ta cần i-1 phép so sánh Vì số phép so sánh cần (𝑛−1).𝑛 thực là: 1+2+3+…+n-1= Vậy độ phức tạp thuật toán O(n2) 2.1.2 Sắp xếp chọn( select sort) Sắp xếp chọn thuật toán xếp đơn giản dựa việc so sánh chỗ( xếp không cần dùng thêm mảng phụ) Chọn phần tử nhỏ n phần tử ban đầu đưa vị trí thứ dãy số Tiếp tục chọn phần tử nhỏ n-1 phần tử lại xếp vào vị trí thứ hai dãy,… tiếp tục chọn n-1 phần tử đứng vị trí a) Giải thuật Bước 1: i←1 Bước 2: tìm phần tử amin dãy số từ i→n Bước 3: hoán đổi vị trí a[i] với amin Bước 4: i L[j] //nếu chúng không thứ tự swap(L[i], L[j]) //đổi chỗ chúng cho endif endfor endfor endprocedure c) Độ phức tạp Với i=1,2,…,n-1 cần thực n-1, n-2,…,1 phép so sánh Suy cần (𝑛−1).𝑛 1+2+3+…+n-1= phép so sánh Vậy độ phức tạp O(n2) 2.1.3 Sắp xếp chèn ( Insert sort) Sắp xếp chèn thuật toán xếp có nét tương đồng với việc xếp quân người chơi Muốn xếp quân theo thứ tự định từ quân thứ người chơi so sánh với quân trước để chèn vào vị trí a) Giải thuật Giả sử danh sách gồm n phần tử Danh sách có phần tử danh sách xếp Giả sử danh sách a1,…,an-1 xếp ta cần chèn phần tử an vào vị trí thích hợp để danh sách xếp Vị trí chèn vị trí mà phần tử an lớn phần tử đứng trước nó, nhỏ phần tử đứng sau nó( có) b) Mã giả Procedure insert(array a, int k, value) { int i:= k-1; while (i > and a[i] > value) { a[i+1]:= a[i]; i:= i - 1; } a[i+1]:= value; } Procedure insertSort(array a, int length) { int k:= 2; while (k < length) { insert(a, k, a[k]); k:= k + 1; } } c) Độ phức tạp Độ phức tạp thuật toán Sắp xếp chèn O(n2) 2.1.4 Sắp xếp nhanh( Quick sort) Sắp xếp nhanh, gọi xếp kiểu phân chia( part sort) thuật toán phát triển C.A.R Hoare Danh sách chia thành hai danh sách Chọn phần tử danh sách làm chốt, phần tử nhỏ chốt đưa bên trái chốt thuộc dãy thứ nhất, phần tử lớn chốt đưa bên phải chốt thuộc dãy thứ hai Tiếp tục độ dài danh sách a) Giải thuật • Phần tử chốt: cách tìm phần tử chốt ảnh hưởng lớn đến hiệu chương trình Vậy cần phải chọn phần tử chốt để đạt hiệu tốt nhất( sau log2(length) lần chia để danh sách có độ dài 1) Ta có vài cách chọn phần tử chốt sau: - Chọn phần tử đứng đầu cuối làm phần tử chốt - Chọn phần tử đứng danh sách làm phần tử chốt - Chọn phần tử trung vị phần tử đầu, cuối làm phần tử chốt - Chọn phần tử ngẫu nhiên danh sách làm phần tử chốt • Thuật phân chia: Chọn phần tử chốt xong ta chia nào? Duyệt từ đầu đến cuối so sánh phần tử danh sách với phần tử chốt, ta cần thực n phép so sánh n không gian nhớ cho giá trị trung gian Duyệt theo hai đường, đường từ đầu, đường từ cuối danh sách Đổi chỗ phần tử lớn chốt từ bên trái với phần tử nhỏ chốt từ bên phải, lặp đến hai đường giao b) Mã giả Thuat phan chia: //left la dau danh sach, right la cuoi danh sach Function partition (array, left, right, pivotIndex){ pivotValue:=array[pivotIndex]; swap(array[pivotindex, array[right]);//chuyen chot ve cuoi storeIndex:=left; for i:=left to right-1 if(array[i]freq+newNode->freq; length=length-1;//rung giam di mot cay } // - void setPrefixCode(NODE *treeHuff, char *strCode){ if(treeHuff->pLeft==NULL && treeHuff->pright==NULL) prefixCodeOfChar =strCode; else setPrefixCode(treeHuff->pLeft,strCode1); //strCode1=strCode them setPrefixCode(treeHuff->pRight, strCode2); //strCode2=strCode them } e) Nén file mã Huffman Sau xây dựng mã Huffman tập hợp kí hiệu có file, giả sử ta lưu mã mảng prefixCode[i], i=1 n Ta nén file theo bước sau: Đọc byte file cần nén hết tệp Chuyển theo mã Huffman thành xâu nhị phân Ghép với xâu nhị phân dư từ bước trước Nếu có đủ bit xâu cắt bit ghi vào tệp nén Nếu hết tệp cần nén dừng Trong nén, đến đọc đến cuối tẹp cần nén, số bit xâu nhị phân lại không chia hết cho 8, mà đủ bit xâu ta cắt bit để ghi vào tệp nén, số bit thừa ta xử lí sao? Em chèn thêm số bit vào cuối bit xâu cho độ dài Chuyển sang mã ASCII ghi file nén, ghi thêm dộ dài số bit ta thêm vào Như giải nén ta lấy hai giá trị cuối tệp nén để giải bit thừa nói • Giải thuật để dịch ngược chuỗi bit dựa vào Huffman: Đi từ gốc Huffman, đọc bit tệp nén: - Nếu bit 0, rẽ sang nhánh trái - Nếu bit 1, rẽ sang nhánh phải - Nếu node lá, in tệp giải nén kí hiệu 2.3 Game Tic Tac Toe 2.3.1 Giới thiệu Tic tac toe trò chơi phổ biến viết bàn cờ có ô (3x3) Hai người chơi, người dùng kí hiệu O, người dùng kí hiệu X, điền ký hiệu vào ô Người thắng người tạo dãy ký hiệu theo chiều ngang, dọc hay chéo Nếu sau lấp đầy ô trống mà đạt dãy ô thẳng hàng hòa Hình sau mô tả trường hợp ví dụ: 2.3.2 Phân tích thiết kế Giả sử ban đầu tất ô trống bàn cờ( board), người chơi dùng kí hiệu X, máy dùng kí hiệu O Để thực bước đi, người chơi sử dụng phím điều khiển ←↕→ bàn phím, để đánh nước người chơi nhấn phím Enter, ô trống nước X ghi nhận, ngược lại không ghi nhận người chơi phải đánh vào vị trí khác Đó phần điều khiển chơi dành cho người chơi, máy sao? Ta làm tương tự không? Nếu tương tự chẳng khác hai người chơi chơi với Vì cần phải có chút thay đổi khác phần máy so với phần người chơi Ta sử dụng thuật toán Min-Max để giúp máy có trí tuệ nhân tạo chơi người Thuật toán Min-Max gì? Trong người chơi người gọi người chơi cực đại( MAX) đối thủ họ người chơi cực tiểu( MIN) Cả hai đấu thủ cố gắng nước cho điểm tuyệt đối lớn hay cao Tức người chơi MAX cố gắng làm cho điểm cao làm cho điểm đối thủ bớt âm ( giảm trị số), ngược lại, người chơi MIN cố gắng làm cho điểm âm làm giảm điểm đối thủ Giải thuật tìm kiếm Min-Max sử dụng để tìm kiếm tất “diễn biến” trò chơi tầng yêu cầu Điểm số ban đầu gán cho lá, sau cách lượng giá nước đi, điểm số gán cho tầng qua giải thuật Min-Max, thuật giải thực lát cắt cho trước tính điểm Ý tưởng thuật giải Min-Max theo đệ quy: - Nếu mức xét người chơi cực tiểu áp dụng thuật toán MinMax cho Lưu kết giá trị nhỏ - Nếu mức xét người chơi cực đại ấp áp dụng thuật toán Min-Max cho Lưu kết giá trị lớn - Nếu mức xét tính giá trị tĩnh cờ ứng với người chơi lúc Lưu giữ kết Mã 1: MinMax (int x){ //x la node muon tinh diem if x is left return score of x; else if x in a MinNode for all children of x:v1,v2, …,vn return min(MinMax(v1), MinMax(v2), …, Minmax(vn)) else for all children of x:v1,v2, …,vn return max(MinMax(v1), MinMax(v2), …, Minmax(vn)) } Do số lượng nước tối đa trò chơi Tic tac toe 9, số lượng nhỏ nên ta tìm kiếm tất node, mà không cần thêm tham số độ sâu( depth) để giới hạn số lượng node CHƯƠNG KẾT QUẢ VÀ ỨNG DỤNG Như qua báo cáo này, em đạt số kết sau: Về thuật toán xếp, trước hết, với dãy số sinh cách ngẫu nhiên, số lượng lớn, với việc đánh giá độ phức tạp thuật toán lý thuyết, nhìn vào kết chạy chương trình, ta so sánh thời gian chạy thuật toán với dãy số Từ ta biết thuật toán chạy nhanh hơn, thuật toán chạy chậm hơn, trường hợp thuật toán tối ưu Về phần nén giải nén giải thuật Huffman, sau nén tệp cần nén em nhận thấy tổng dung lượng tiết kiệm thường lớn 40% tổng dung lượng ban đầu tệp cần nén Không vậy, em học hỏi nhiều kiến thức cách xử lý file Về game Tic Tac Toe, em biết ứng dụng thuật toán Min-Max để xây dựng trò chơi với số kĩ khác để tạo trò chơi đơn giản người với máy có trí tuệ người TÀI LIỆU THAM KHẢO https://vi.wikipedia.org/wiki/Thuat_toan_sap_xep https://vi.wikipedia.org/wiki/ma_hoa_huffman https://vi.wikipedia.org/wiki/li_thuyet_tro_choi ... Với i =1, 2,…,n -1 cần thực n -1, n-2,… ,1 phép so sánh Suy cần (

Ngày đăng: 11/06/2017, 10:20

TỪ KHÓA LIÊN QUAN

w