Xây dựng chương trình mô phỏng thuật toán HEURISTIC giải bài toán xếp BALO

35 1.2K 0
Xây dựng chương trình mô phỏng thuật toán HEURISTIC giải bài toán xếp BALO

Đ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

ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CNTT VÀ TRUYỀN THÔNG BÁO CÁO THỰC TẬP CƠ SỞ Đề tài: XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG THUẬT TOÁN HEURISTIC GIẢI BÀI TOÁN XẾP BALO Sinh viên thực hiện : ĐỖ THỊ MƠ Lớp : CNTT-K9D Giáo viên hướng dẫn : TRƯƠNG HÀ HẢI Thái Nguyên, ngày tháng năm Mục lục Mở đầu 3 Chương 1 4 TÌM HIỂU NGÔN NGỮ VÀ THUẬT TOÁN 4 1.1. Tìm hiểu ngôn ngữ C Sharp 4 1.1.1. Tổng quan về C-Sharp 4 1.1.2. Những cơ sở của ngôn ngữ C# 6 1.1.4. WinForms 15 1.2.Thuật toán heuristic và bài toán xếp balo 23 1.2.1 Thuật toán Heuristic 23 1.2.2. Bài toán xếp balo 27 XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG 30 1.1. Giao diện chính của chương trình 30 2.2. Các chức năng của chương trình 30 a. Chức năng nhập dữ liệu từ bàn phím: 30 b. Chức năng nhập dữ liệu ngẫu nhiên 33 Kết luận 34 TÀI LIỆU THAM KHẢO: 35 Mở đầu Thuật toán là một kiến thức, là bước mở đầu quan trọng để giải bất kỳ một bài toán nào. Thuật toán hay nói một cách khác đó là phương pháp, là các bước giải một bài toán. Thuật toán là sương sống của mọi ngôn ngữa lập trình. Mỗi ngôn ngữ lập trình với cách thể hiện câu lệnh khác nhau nhưng chúng đểu có chung một thuật toán để giải quyết bài toán đó. Qua đó muốn thể hiện được thuật toán đó thành một sản phẩm hoàn chỉnh ta phải dùng ngôn ngữ, vì vậy ta có thể rèn luyện và sử dụng thành thạo ngôn ngữ lập trình. Qua đó ta thấy được vai trò quan trọng của thuật toán và ngôn ngữ. Trong bài thực tập này em đã lựa chọn thuật toán heuristic để giải bài toán xếp balo và kết hợp sử dụng ngôn ngữ C-Sharp để mô phỏng thuật toán ấy vào bài toán cụ thể. Nội dung xây dựng thuật toán được chia thành 2 chương: Chương 1: Tìm hiểu ngôn ngữ và thuật toán Chương 2: Xây dựng chương trình mô phỏng Qua phần nội dung giúp em hiểu sâu hơn về khái niệm thuật toán, cách thức hình thành ý tưởng để giải quyết các bài toán từ dễ đến khó để lập trình trên máy tính. Thông qua nội dung bài thực tập giúp em hiểu thêm giải một bài toán hoàn chỉnh trên máy tính điện tử như thế nào. Ý thức được tầm quan trọng của người lập trình trong cuộc sống. Chương 1 TÌM HIỂU NGÔN NGỮ VÀ THUẬT TOÁN 1.1. Tìm hiểu ngôn ngữ C Sharp 1.1.1. Tổng quan về C-Sharp C# là một ngôn ngữ rất đơn giản, với khoảng 80 từ khóa và hơn mười kiểu dữ liệu dựng sẵn, nhưng C# có tính diễn đạt cao. C# hỗ trợ lập trình có cấu trúc, hướng đối tượng, hướng thành phần. Trọng tâm của ngôn ngữ hướng đối tượng là lớp. Lớp định nghĩa kiểu dữ liệu mới, cho phép mở rộng ngôn ngữ theo hướng cần giải quyết. C# có những từ khóa dành cho việc khai báo lớp, phương thức, thuộc tính mới. C# hỗ trợ đầy đủ khái niệm trụ cột trong lập trình hướng đối tượng: đóng gói, kế thừa, đa hình. Định nghĩa lớp trong C# không đòi hỏi tách rời tập tin tiêu đề với tập tin cài đặt như C++. Hơn thế, C# hỗ trợ kiểu sưu liệu mới, cho phép sưu liệu trực tiếp trong tập tin mã nguồn. Đến khi biên dịch sẽ tạo tập tin sưu liệu theo định dạng XML. C# hỗ trợ khái niệm giao diện, interfaces(tương tự Java). Một lớp chỉ có thể kế thừa duy nhất một lớp cha nhưng có thể cài đặt nhiều giao diện. C# có kiểu cấu trúc, struct (không giống C++). Cấu trúc là kiểu hạng nhẹ và bị giới hạn. Cấu trúc không hể kế thừa lớp hay được kế thừa nhưng có thể cài đặt giao diện. C# cung cấp những đặc trưng lập trình hướng thành phần như property, sự kiện và hướng dẫn hướng khai báo ( được gọi là attribute). Lập trình hướng component được hỗ trợ bởi CLR thông qua siêu dữ liệu (metadata). Siêu dữ liệu mô tả lớp bao gồm các phương thức và thuộc tính, các thông tin bảo mật… C# cũng cho truy nhập trực tiếp bộ nhớ dùng con trỏ kiểu C++, nhưng vùng mã đó được xem như là không an toàn. CLR sẽ không thực hiện thu dọn rác tự động các đối tượng được tham chiếu bởi con trỏ cho đến khi lập trình viên tự giải phóng. Tại sao hiện nay c- sharp lại trở thành ngôn ngữ thông dụng. vì chúng có những ưu điểm sau: − C-sharp là ngôn ngữ đơn giản: C# loại bỏ một vài sự phức tạp rối ren của những ngôn ngữ như java và C++, bao gồm việc loại bỏ những macro, những template, đa kế thừa, và lớp cơ sở ảo(virtual base class). Chúng là những nguyên nhân gây ra sự nhầm lẫn hay dẫn đến những vẫn đề cho những người phát triển C++. − C-Sharp là ngôn ngữ hiện đại: Những đặc tính như là xử lý ngoại lệ và thu gom. Bộ nhớ tự động, những dữ liệu mở rộng, và bảo mật mã nguồn là những đặc tính được mong đợi trong một ngôn ngữ hiện đại. C# chứa tất cả những đặc tính trên. − C-Sharp là ngôn ngữ hướng đối tượng Những đặc điểm chính của ngôn ngữ hướng đối tượng(object-orented language) là sự đóng gói(encapsulation), kế thừa(inheritance) và đa hình(polymorphism). C# hỗ trợ tất cả những đặc tính trên. − C-Sharp là ngôn ngữ mạnh mẽ và cũng mềm dẻo Ngôn ngữ này không đặt rằng buộc lên những việc có thể làm. C# được sử dụng cho nhiều các dự án khác nhau như là tạo ra ứng dụng xử lý văn bản, ứng dựng đồ họa, bản tính, hay thậm chí những trình biên dịch cho các ngôn ngữ khác . − C-Sharp là ngôn ngữ ít từ khóa C# là ngôn ngữ sử dụng bị giới hạn những từ khóa. Phần lớn các từ khóa được sử dụng để mô tả thông tin. Bảng liệt kê các từ khóa của ngôn ngữ C# Abstract Default Foreach Object Sizeof Unsafe As Delegate Goto Operator Stacklloc Ushort Base Do If Out Static Using Bool Double Implicit Override String Vỉtual Break Else In Params Struct Volatile Byte Enum Int Private Switch Void Case Event Interface Protected This While Catch Explicit Internal Public Throw Một điều quan trọng khác với C++là mã nguồn không đòi hỏi phải có tập tin header. Tất cả mã ngồn được viết trong khai báo một lớp. Các bước chuẩn bị cho chương trình Khi tạo một chương trình trong C# hay bất cứ ngôn ngữ nào, chúng ta nên theo nhưng bước tuần tự sau: Bước 1: Xác định mục tiêu của chương trình. Bước 2:Xác định nhưng phương pháp giải quyết vấn đề. Bước 3:Tạo một chương trình để giải quyết vấn đề. Bước 4: Thực thi chương trình để xem kết quả. 1.1.2. Những cơ sở của ngôn ngữ C# 1.1.2.1. Các kiểu C# buộc phải khai báo kiểu của đối tượng được tạo. Khi kiểu được khai báo rõ ràng, trình biên dịch sẽ giúp ngăn ngừa lỗi bằng cách kiểm tra dữ liệu được gán cho đối tượng có hợp lệ không, đồng thời cấp phát đúng kích thước bộ nhớ cho đối tượng. C# phân thành hai loại : loại dữ liệu dựng sẵn và loại do người dùng định nghĩa. C# cũng được chia dữ liệu thành hai kiểu : giá trị và tham chiếu.Biến kiểu giá trị được lưu trữ trong vùng nhớ stack, còn biến kiểu tham chiếu được lưu trữ trong vùng nhớ heap. C# cũng được hỗ trợ kiểu con trỏ của C++, nhưng ít khi được sử dụng.thông thường con trỏ chỉ được sử dụng khi làm việc trực tiếp với Win API hay các đối tượng COM. a . Kiểu dữ liệu định sẵn C# có nhiều kiểu dữ liệu dựng sẵn, mỗi kiểu ánh xạ đến một kiểu hỗ trợ bởi CLS (Commom Language Specification),ánh xạ để đảm bảo rằng đối tượng được tạo tỏng C# không khác gì đối tượng được tạo trong các ngôn ngữ .NET khac. Mỗi kiểu có một kích thước cố định được liệt lê trong bảng sau: Bảng 1-1 Các kiểu dựng sẵn Kiểu Kích thước (byte) Kiểu .Net Mô tả giá trị Byte 1 Byte Không dấu (0…255) Char 1 Char Mã ký tự unicode Bool 1 Boolean True or false Sbyte 1 Sbyte Có dấu(-128…127) Short 2 Int16 Có dấu(-32768-32767) Ushort 2 Uint16 Không dấu(0….65535) Int 4 Int32 Có dấu(-2147483647…. 2147483647) Uint 4 Uint 32 Không dấu(0…4294967295) Float 4 Single Số thực() Double 8 Double Số thực() Decimal 8 Dcimal Số có dấu chấm tĩnh với 28 ký số và dấu chấm Long 8 Int64 Số nguyên có dấu (-922337203685477808 -922337203685477807) Ulong 8 Uint64 Số nguyên không dấu (0… 0xfffffffffff) b. Biến và Hằng Biến dùng để lưu trữ dữ liệu. Mỗi biến thuộc về một kiểu dữ liệu nào đó. Biến có thể được gán giá trị và cũng có thể thay đổi giá trị khi thực hiện các lệnh trong chương trình. Để tạo một biến chúng ta phải khai báo kiểu của biến và gán cho biến một tên duy nhất. Biến có thể được khởi tạo giá trị ngay khi được khai báo, hay nó cũng có thể được gán một giá trị mới vào bất cứ lúc nào trong chương trình. Hằng là một biến nhưng giá trị của nó không thay đổi theo thời gian. Khi cần thao tác trên một giá trị xác định ta dùng hằng. Khai báo hằng tương tự khai báo biến và có thêm từ khóa Const ở trước. hằng một khi khởi động xong không thể thay đổi được nữa cú pháp : <const> <type> <tên hằng> = <giá trị>; Ví dụ const int hang =100; c. Kiểu liệt kê Kiểu liệt kê đơn giản là tập hợp các tên hằng có giá trị không thay đổi (thường được gọi là danh sách liệt kê). Mỗi kiểu liệt kê có một kiểu dữ liệu cơ sở, kiểu dữ liệu có thể là bất cứ kiểu dữ liệu nguyên nào như int, short, long tuy nhiên kiểu dữ lịêu của liệt kê không chấp nhận kiểu ký tự. Để khai báo một kiểu liệt kê ta thực hiện theo cú pháp sau: [thuộc tính] [bổ sung] enum <tên liệt kê> [:kiểu cơ sở] {danh sách các thành phần liệt kê}; d. Kiểu chuỗi ký tự Kiểu dữ liệu chuỗi khá thân thiện với người lập trình trong bất cứ ngôn ngữ lập trình nào, kiểu dữ liệu chuỗi lưu giữ một mảng những ký tự. Để khai báo một chuỗi chúng ta sử dụng từ khoá string tương tự như cách tạo một thể hiện của bất cứ đối tượng nào: String chuỗi; e. Định danh Định danh là tên mà người lập trình chỉ định cho các kiểu dữ liệu, các phương thức, biến, hằng, hay đối tượng Một định danh phải bắt đầu với một ký tự chữ cái hay dấu gạch dưới, các ký tự còn lại phải là ký tự chữ cái, chữ số, dấu gạch dưới. Các định danh không được trùng với các từ khoá mà C# và phân biệt hoa, thường. f. Biểu thức Những câu lệnh mà thực hiện việc đánh giá một giá trị gọi là biểu thức. Một phép gán một giá trị cho một biến cũng là một biểu thức 1.1.2.2 các câu lệnh a. Rẽ nhánh không có điều kiện Có 2 loại câu rẽ nhánh không điều kiện. Một là phương thức: khi trình biên dịch thấy có lời gọi phương thức nó sẽ tạm dừng phương thức hiện hành và nhảy đến phương thức được gọi cho đến hết phương thức này sẽ trở về phương thức cũ. Hai là tạo câu lệnh rẽ nhánh không điều kiện là dung từ khóa goto, break, continue, throw. b. Rẽ nhánh có điều kiện Câu lệnh if else Cú pháp: If ( biểu thức logic) Khối lệnh; Hoặc: If(biểu thức logic) Khối lệnh 1; Else Khối lệnh 2; Biểu thức logic là biểu thức cho giá trị true or false. Nếu biểu thức logic cho giá trị đúng thì “khối lệnh” hay “khối lệnh 1” được thực thi ngược lại “khối lệnh 2” được thực thi. Biểu thức trong câu lệnh if phải là biểu thức logic, không thể là biểu thức số. Lệnh Swich Cú pháp : Switch (biểu thức lựa chọn) { Case biểu_thức _hằng: Khối lệnh; Lệnh nhảy; [default: Khối lệnh; Lệnh nhảy;] } C# cung cấp các lệnh lặp gống như C++ như for, while, do-while và lệnh lặp mới foreach. Nó cũng hỗ trợ các câu lệnh nhảy như: goto, break, continue và return. c. Lệnh nhảy goto Lệnh GOTO: có thể dung để tạo lệnh nhảy nhưng nhiều nhà lập trình chuyên nghiệp khuyên không nên dung câu lệnh này vì nó phá vỡ cấu trúc của chương trình. Cách dùng câu lệnh này như sau: B1: tạo một nhãn B2: goto đến nhãn đó. d. Các câu lệnh lặp Vòng lặp While: Cú pháp : while (biểu_thức_logic) khối lệnh; Khối lệnh sẽ được thực hiện đến khi nào biểu thưc còn đúng. Nếu ngay từ đầ biểu thức sai, khối lệnh sẽ không được thức thi. Vòng lặp Do-While Cú pháp: Do Khối lệnh While (biểu_thức_logic) Khác với while khối lệnh này sẽ được thực hiện trước, sau đó biểu thức được kiểm tra. Nếu biểu thức đúng khối lệnh được thực hiện. Vòng lặp For Cú pháp: For([khởi tạo điều kiện đếm];[biểu thức];[gia tăng biến đếm]) Khối lệnh; e. Các câu lệnh nhảy Câu lệnh break, continue và return. [...]... panel) 1.2 .Thuật toán heuristic và bài toán xếp balo 1.2.1 Thuật toán Heuristic 1.2.1.1.Mở rộng khái niệm thuật toán: giải thuật Trong quá trình nghiên cứu giải quyết các vấn đề - bài toán, người ta đã đưa ra những nhận xét như sau: • Có nhiều bài toán cho đến nay vẫn chưa tìm ra một cách giải theo kểu thuật toán và cũng không biết là có tồn tại thuật toán hay không • Có nhiều bài toán đã có thuật toán nhưng... cách giải theo kiểu heuristic 1.2.1.2 Giải thuật heuristic Thuật giải Heuristic là một sự mở rộng khái niệm thuật toán Nó thể hiện cách giải bài toán với các đặc tính sau : • Thường tìm được lời giải tốt (nhưng không chắc là lời giải tốt nhất) • Giải bài toán theo thuật giải Heuristic thường dễ dàng và nhanh chóng đưa ra kết quả hơn so với giải thuật tối ưu, vì vậy chi phí thấp hơn • Thuật giải Heuristic. .. lập trình trên winform Giúp em rằng có một ngôn ngữ phát triển mạnh về đồ họa Trong bài thực tập trên em đã mô phỏng thành công thuật toán heuristic để giải bài toán xếp balo Tuy đã cố gắng nhưng vẫn còn nhiều hạn chế, mong thầy cô giúp đỡ để em hoàn thiện hơn về kỹ năng cho bài thực tập lần sau Dựa vào thuật toán heuristic và ngôn ngữ lập trình C# em có thể mô phỏng được một số bài toán nữa Như bài. .. nhiều các toán tử như toán tử gán, toán tử toán học, logic a Toán tử gán Toán tử gán hay phép gán làm cho toán hạng bên trái thay đổi giá trị bằng với giá trị của toán hạng bên phải Toán tử gán là toán tử hai ngôi Đây là toán tử đơn giản nhất thông dụng nhất và cũng dễ sử dụng nhất b Toán tử toán học Ngôn ngữ C# cung cấp năm toán tử toán học, bao gồm bốn toán tử đầu các phép toán cơ bản Toán tử cuối... gian giải theo thuật toán đó quá lớn hoặc các điều kiện cho thuật toán khó đáp ứng • Có những bài toán được giải theo nhưng cách giải vi phạm thuật toán nhưng vẫn chấp nhận được Từ những nhận định trên , người ta thấy rằng cần phải có những đổi mới cho khái niệm thuật toán Người ta đã mở rộng hai tiêu chuẩn của thuật toán: tính xác định và tính đúng đắn việc mở rộng tính xác định đối với thuật toán. .. - Dữ liệu ra: : tìm nhóm đồ vật thỏa mãn và đạt max? 1.1 Giao diện chính của chương trình Hình 1 2.2 Các chức năng của chương trình Các chức năng chính của chương trình là: mô phỏng thuật toán heuristic giải bài toán xếp balo Chương trình được mô phỏng trên winform của ngôn ngữ C-Sharp a Chức năng nhập dữ liệu từ bàn phím: dữ liệu sẽ được nhập lần lượt từ các TextBox thể tích, giá trị của winform sau... sẽ xơi ngay, nếu không nó sẽ bỏ đi, sau này không bao giờ xem xét lại Cần lưu ý rằng, thuật toán tham lam trong một số bài toán, nếu xây dựng được hàm chọn thích hợp có thể cho nghiệm tối ưu Trong nhiều bài toán, thuật toán tham lam chỉ tìm được nghiệm gần đúng với nghiệm tối ưu 1.2.2 Bài toán xếp balo − Input: Một balo có thể tích là B, n đồ vật thể tích:a1,a2 an Giá trị tương ứng của các đồ vật là:... chấp nhận một giải pháp gần tối ưu mà chỉ cần máy tính chạy trong vày ngày hoặc vài giờ Các cách giải pháp chấp nhận được nhưng không hoàn toán đáp ứng đầy đủ các tiêu chuẩn các tiêu chuẩn của thuật toán thường được gọi là giải thuật khái niệm mở rộng này của thuật toán đã mở rộng cửa cho chúng ta trong việc tìm kiếm phương pháp để giải quyết các bài toán được đặt ra Một trong những giải thuật được đề... đã được thể hiện qua các giải thuật đệ quy và ngẫu nhiên Tính đúng của thuật toán bây giờ không còn bắt buộc đối với một số cách giải bài toán, nhất là cách giải gần đúng Trong thực tiễn có nhiều trường hợp người ta phải chấp nhận các cách giải thường có kết quả tốt (nhưng không phải lúc nào cũng tốt nhất) nhưng ít phức tạp và hiệu qủa Chẳng hạn nếu có một bài toán bằng thuật toán tối ưu đòi hỏi máy... 3*25+1*6+1*2 =83 Chương 2 XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG - Dữ liệu vào: cho một balo có thể tích B, n đồ vật có thể tích:a 1,a2 an,, Giá trị tương ứng của các đồ vật là: p1,p2 pn Số lượng mỗi loại đồ vật là không hạn chế, x i nguyên là số lượng mỗi loại đồ vật i - Dữ liệu ra: : tìm nhóm đồ vật thỏa mãn và đạt max? 1.1 Giao diện chính của chương trình Hình 1 2.2 Các chức năng của chương trình Các chức . và bài toán xếp balo 23 1.2.1 Thuật toán Heuristic 23 1.2.2. Bài toán xếp balo 27 XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG 30 1.1. Giao diện chính của chương trình 30 2.2. Các chức năng của chương trình. C-Sharp để mô phỏng thuật toán ấy vào bài toán cụ thể. Nội dung xây dựng thuật toán được chia thành 2 chương: Chương 1: Tìm hiểu ngôn ngữ và thuật toán Chương 2: Xây dựng chương trình mô phỏng Qua. HỌC CNTT VÀ TRUYỀN THÔNG BÁO CÁO THỰC TẬP CƠ SỞ Đề tài: XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG THUẬT TOÁN HEURISTIC GIẢI BÀI TOÁN XẾP BALO Sinh viên thực hiện : ĐỖ THỊ MƠ Lớp : CNTT-K9D Giáo

Ngày đăng: 11/02/2015, 06:44

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan