Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
452,12 KB
Nội dung
TRƯỜNG ĐẠI HỌC TRẦN ĐẠI NGHĨA KHOA CÔNG NGHỆ THÔNG TIN MÔ PHỎNG BÀI TOÁN BẰNG THUẬT TOÁN MINMIAX - Giáo viên hướng dẫn: Tiến sĩ – Phùng Thế Bảo - Người thực hiện: Đinh Hữu Luận Đỗ Hoàng Cương Đoàn Anh Khoa Nguyễn Mai Chí Trung TP.Hồ Chí Minh 2015 MỞ ĐẦU - - Trong thời đại, việc tìm lời giải tối ưu cho toán vấn đề khó để thực Đã có nhiều nghiên cứu để tìm phương pháp hữu hiệu giải toán tối ưu Có lẽ thuật toán sử dụng nhiều nhất, quan trọng kỹ thuật “ chia để trị” Kỷ thuật chia toán thành N toán nhỏ hơn, thực lời giải cho toán nhỏ từ xây dựng thuật toán cho toán tổng hợp Một toán thực tế ta thường gặp là: Sắp xếp trộn tìm giá trị Min Max…… toán tìm lời giải dễ dàng cách sử dụng phương pháp chia để trị Hiểu rõ cài đặt thuật toán, tìm lời giải tối ưu cho toán dựa tài liệu học yêu cầu thiếu sinh viên nghành Tin học Tuy nhiên, giới hạn đề tài, chúng em trình bày tất thuật toán có liên quan đến đồ thị mà húng em trình bày “bài toán Min Max” Đây nội dung đề tài chúng em chọn MỤC LỤC Phần 1:Mục tiêu hướng giải Phần 2:Cở sở lý thuyết • Bài toán • Ý tưởng • Giải thuật • Minh họa • Đánh giá độ phức tạp • Phần 3: Mô chương trình • Giới thiệu chương trình • Mô tả lời • Mô tả sơ đồ khối • Kết • Phần 4: Tài liệu tham khảo • • PHẦN MỤC TIÊU VÀ HƯỚNG GIẢI QUYẾT Mục tiêu: • Nắm vững khái niệm phương pháp chia để trị, bước giải toán dùng phương pháp chia để trị • Nắm vững thuật toán “bài toán MinMax” 2.Yêu cầu cần đạt: • Thiết kế đánh giá toán: ý tưởng, giải thuật, minh họa đánh giá độ phức tạp giải thuật • Mô phỏng : mô lời sơ đồ khối “ toán MinMax” 3.Hướng giải quyết: • Về lý thuyết: tìm hiểu khái niệm phương pháp chia để trị, giải thuật yêu cầu đề tài • Về chương trình: Sử dụng ngôn ngữ Visual Basic Net ( Visual Basic 2008) để viết chương trình PHẦN CƠ SỞ LÝ THUYẾT • Giới thiệu phương pháp chia để trị Chia để trị phương pháp thiết kế giải thuật bao gồm thao tác: Chia: chia toán cần giải thành loạt toán độc lập Trị: đòi hỏi việc giải toán thu Tổng hợp:thực việc xây dựng lời giải toán đặt từ lời giải toán SƠ ĐỒ CHUNG Sơ đồ chung thuật toán chia để trị( Divide and Conquer) gồm thành phần • Chia (Divide) : chia toán cần giải S thành toán S1, S2, S3…… • Trị (conquer) : giải toán cách đẹ quy • Tổng hợp (Combie) : tổng hợp lời giải toán S1, S2, S3… thành lời giải toán S Để phân tích độ phức tạp thuật toán sử dụng công thức đệ quy Vấn đề đặt cần giải toán độc lập cách ? vấn đề trung tâm toán • Bài toán MinMax • • Phát biểu toán Tìm giá trị Min, Max đoạn a[1…r] mảng a[1…n] Ý tưởng Tại bước, chia đôi đoạn cần tìm tìm Min, Max đoạn, sau tổng hợp kết lại Nếu đoạn chia có phần tử Min = Max phần tử Minh họa: I A[i] 10 15 19 Tìm giá trị Min, Max đoạn a[2….7] mảng a[1… 7] Ký hiệu: MinMax(a,1,r,Min,Max) cho Min Max đoạn a[1….r] MinMax(a,2,7,Min,Max) cho Min=0 Max =15 đoạn a[2 7] • Thuật toán Input : a[l r], ( l ≤ r ) Output: Min = Min (a[l], ,a[r]), Max = Max (a[l], ,a[r]) MinMax(a,l, r, Min, Max) if (l == r) { Min = a[l]; Max = a[l]; } Else { MinMax(a,l, (l+r) / 2, Min1, Max1); MinMax(a,(l+r) /2 + 1, r , Min2, Max2); • If (Min1 < Min2) Min = Min1; Else Min = Min2; If (Max1 > Max2) Max = Max1; Else Max = Max2; } Độ phức tạp thuật toán Gọi t(n) số phép toán so sánh cần thực Khi ta có: T(n) = T(n / 2) + T(n / 2) + 2;n > 1;n = 0;n = Với n = 2k , T(n) = + 2T(n/2) = + 22 + 22T(n/22) = ….= 2k-1T(2) + ∑i=1k-12i = ∑ki=1 2i – 2k-1 = 2k+1 – 2k-1 – = (3n/2) – Vậy T(n) € O (n) • Cài đặt Void MinMax(int a[.], int l, int r, int &Min, int &Max) { Int Min1,Min2,Max1,Max2 ; If(l==r) { Min = a[l] ; Max = a[l] ; } Else { MinMax( a,l,(l+r)/2, Min1, Max1) ; MinMax(a,(l+r)/2 + 1,r,Min2,Max2) ; If (Min1 < Min2) Min = Min1 ; Else Min = Min2 ; If (Max1 > Max2) Max = Max1 ; Else Max = Max2 ; } } PHẦN MÔ PHỎNG CHƯƠNG TRÌNH Giới thiệu chương trình using using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms; namespace Chia_De_Tri _Min_Max { public partial class frmMain : Form { int[] manglamviec = null; int min, max, x, y, n; Button btnCreate = new Button(); public frmMain() { InitializeComponent(); } void tim(int[] manglamviec, int x, int y, ref int min, ref int max) { int min1 = 0, min2 = 0, max1 = 100, max2 = 100; if (x == y) { = manglamviec[x]; max = manglamviec[x]; if(btnCreate.Text==min.ToString() || btnCreate.Text == max.ToString()) { } } else { tim(manglamviec, (x + y) / + 1, y, ref min1, ref max1); tim(manglamviec, x, (x + y) / 2, ref min2, ref max2); if (min1 < min2) = min1; else = min2; if (max1 < max2) max = max2; } else max = max1; } private void btnExit_Click_1(object sender, EventArgs e) { DialogResult thongbao; thongbao = MessageBox.Show("Bạn có chắn muốn thoát khỏi chương trình?", "Message", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (thongbao == DialogResult.Yes) this.Close(); } private void btnReset_Click(object sender, EventArgs e) { txtPhanTu.Text = ""; txtMax.Text = ""; txtMin.Text = ""; txtXuatmang.Text = ""; txtPhanTu.Focus(); xoa(); } private void btnStart_Click(object sender, EventArgs e) { if (txtMin.Text != "".ToString()) { MessageBox.Show("Vui lòng Restart trước chạy lại chương trình!", "Thông báo"); txtPhanTu.Focus(); } else { int dem = 0; try { n = int.Parse(txtPhanTu.Text); } catch { MessageBox.Show("Nhập giá trị phần tử mảng kiểu integer.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); dem++; txtPhanTu.Focus(); } if (dem == 0) { int[] mangso = new int[n]; //khoi tao gia tri cho mang Random bien = new Random(); for (int i = 0; i < n; i++) { mangso[i] = bien.Next(-100, 100); } ///duyet mang de xuat man hinh manglamviec = mangso; txtXuatmang.Text = ""; int dodai = mangso.Length; for (int i = 0; i < dodai; i++) { txtXuatmang.Text += mangso[i].ToString() + " "; } x = 0; y = manglamviec.Length; = manglamviec[0]; max = manglamviec[y - 1]; tim(manglamviec, x, y - 1, ref min, ref max); txtMax.Text = max.ToString(); txtMin.Text = min.ToString(); khoiTao(); } } if(btnCreate.Text==min.ToString()|| btnCreate.Text==max.ToString()) { btnCreate.Location = new Point(100, 50); } } private void txtPhanTu_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsDigit(e.KeyChar)) e.Handled = true; } public void khoiTao() { int left = 30; int top = 240; int sizes = * (420 / n) / 10; int sizess = (420 / n); for (int i = 0; i < n; i++) { Button btnCreate = new Button(); btnCreate.Text = manglamviec[i].ToString(); btnCreate.ForeColor = Color.White; btnCreate.BackColor = Color.Black; btnCreate.Font = new Font(btnCreate.Font, FontStyle.Bold); btnCreate.Font = new Font("Time New Roman", 12); btnCreate.Size = new Size(sizes, 50); if (btnCreate.Text == txtMax.ToString() || btnCreate.Text == txtMin.ToString()) { btnCreate.Location = new Point(left, top + 300); } else { btnCreate.Location = new Point(left, top); } this.Controls.Add(btnCreate); left = left + sizess; } } public void xoa() { Application.Restart(); } private void btnAbout_Click(object sender, EventArgs e) { frmAbout frm = new frmAbout(); frm.Show(); } private void frmMain_Load(object sender, EventArgs e) { } } } Mô lời • Nội dung phần mềm: Phần mềm thiết kế giao diện Microsoft Visual ngôn ngữ C# Sau chi tiết giao diện khởi động: Bắt đầu chương trình ta nhập N phần hay chiều dài mảng hình dưới: Sau ta bấm để bắt đầu tiềm max, giá trị dãy chọn ngẫu nhiên khoảng -100 đến 100 Ví dụ ta nhập số phần tử giao diện xuất Các số chọn ngẫu nhiên Hoặc thấy giá trị ngẫu nhiên bên góc phải giao diện Kết tìm giá trị Min Max xuất hiên Để thực nhập lại giá trị mảng ta nhấn vào nút diện ban đầu nhập lại số phần tử mảng Để thoát giao diện ta bấm vào Có thể bấm vào • để trở lại giao để biết thông tin chi tiết Các công nghệ sử dụng: Sử dụng phần mềm Microsoft Visual 2010 (MV) để tạo giao diện Trong MV ta thiết kế Windown Form sử dụng ngôn ngữ C# để viết chương trình • Sau sơ đồ khối: Begin Nhập N, a[l r], ( l ≤ r ) Min1,Min2,Max1,Max2 if (l == r) Đúng Min = a[l] Max = a[l] Sai MinMax(a,l, (l+r) / 2, Min1, Max1); MinMax(a,(l+r) /2 + 1, r , Min2, Max2) If (Min1 < Min2) Sai Min = Min2 Đúng Min = Min1 If (Max1 > Max2) Sai Max = Max2 Đúng Max = Max1 Min = Min (a[l], ,a[r]) Max = Max (a[l], ,a[r]) MinMax(a,l, r, Min, Max) END [...]... void btnAbout_Click(object sender, EventArgs e) { frmAbout frm = new frmAbout(); frm.Show(); } private void frmMain_Load(object sender, EventArgs e) { } } } Mô phỏng bằng lời • Nội dung phần mềm: Phần mềm được thiết kế trên giao diện Microsoft Visual bằng ngôn ngữ C# Sau đây chi tiết về giao diện khi khởi động: Bắt đầu chương trình ta nhập N phần hay chiều dài của mảng như hình dưới: Sau đó ta bấm để bắt... Begin Nhập N, a[l r], ( l ≤ r ) Min1,Min2,Max1,Max2 if (l == r) Đúng Min = a[l] Max = a[l] Sai MinMax( a,l, (l+r) / 2, Min1, Max1); MinMax( a,(l+r) /2 + 1, r , Min2, Max2) If (Min1 < Min2) Sai Min = Min2 Đúng Min = Min1 If (Max1 > Max2) Sai Max = Max2 Đúng Max = Max1 Min = Min (a[l], ,a[r]) Max = Max (a[l], ,a[r]) MinMax( a,l, r, Min, Max) END ... Nắm vững thuật toán bài toán MinMax 2.Yêu cầu cần đạt: • Thiết kế đánh giá toán: ý tưởng, giải thuật, minh họa đánh giá độ phức tạp giải thuật • Mô phỏng : mô lời sơ đồ khối “ toán MinMax ... lời giải toán S1, S2, S3… thành lời giải toán S Để phân tích độ phức tạp thuật toán sử dụng công thức đệ quy Vấn đề đặt cần giải toán độc lập cách ? vấn đề trung tâm toán • Bài toán MinMax •... ưu cho toán vấn đề khó để thực Đã có nhiều nghiên cứu để tìm phương pháp hữu hiệu giải toán tối ưu Có lẽ thuật toán sử dụng nhiều nhất, quan trọng kỹ thuật “ chia để trị” Kỷ thuật chia toán thành