3.1 Thuật toán nhánh cận giải bài toán Ba lô
Phát biểu bài toán: Có đồ vật với trọng lượng là và giá trị sử dụng là . Cần chất các đồ vật vào túi với trọng lượng là sao cho tổng giá trị sử dụng của các đồ vật trong túi là lớn nhất.
Sử dụng thuật toán nhánh cận giải bài toán ba lô:
Thuật toán
Bước 1: chọn nút gốc biểu diễn cho trạng thái ban đầu của ba lô, ở đó ta chưa chọn một vật nào. Tổng giá trị được chọn TGT = 0. Cận trên của nút gốc CT = W * Ðơn giá lớn nhất. Bước 2: Nút gốc sẽ có các nút con tương ứng với các khả năng chọn đồ vật có đơn giá lớn nhất. Với mỗi nút con ta tính lại các thông số:
TGT = TGT (của nút cha) + số đồ vật được chọn * giá trị mỗi vật.
W = W (của nút cha) – số đồ vật được chọn * trọng lượng mỗi vật.
CT = TGT + W * Ðơn giá của vật sẽ xét kế tiếp.
Bước 3: Trong các nút con, ta sẽ ưu tiên phân nhánh cho nút con nào có cận trên lớn hơn trước. Các con của nút này tương ứng với các khả năng chọn đồ vật có đơn giá lớn tiếp theo. Với mỗi nút ta lại phải xác định lại các thông số TGT, W, CT theo công thức đã nói trong bước 2.
Bước 4: Lặp lại bước 3 với chú ý: đối với những nút có cận trên nhỏ hơn hoặc bằng giá lớn nhất tạm thời của một phương án đã được tìm thấy thì ta không cần phân nhánh cho nút đó nữa (cắt bỏ).
Thân chương trình con TimMax
Bước 5: Nếu tất cả các nút đều đã được phân nhánh hoặc bị cắt bỏ thì phương án có giá lớn nhất là phương án cần tìm.
LƯU ĐỒ GIẢI THUẬT
Đọc dữ liệu từ file Test Sắp xếp dữ liệu Gọi chương trình con
Max=TimMax()
(i<=n-1)
TGT=TGT+j*a[i][3];
W=W-j*a[i][2];
CT=TGT+W*a[i+1][4];
sl=a[i+1][1];
Đ
Đ Đ Đ
MaxTam=TGT S
(W>0) và (W - (a[i][2]*j)<0)
S
(W>0) và (W - (a[i][2]*j)>=0)
j>=0
S
CT<Max S
J=sl
Kết thúc lời gọi hàm TimMax Return giá trị MaxTam Đ
Gọi chương trình con chonvat()
j=j-1
Begin
Thân chương trình con chonvat()
End
i=0
i<=n-1
j=a[i][1]
j>=0
(Max-(j*a[i][3])>=0)
Max=Max-j*a[i][3];
cout <<"So do vat loai "
<<ten[i]<<" la:"
<<j<<endl;
break;
j=j-1
S Đ
Đ
i=i+1
S
Hình 3.1 Lưu đồ giải thuật bài toán Ba lô theo phương pháp nhánh cận
3.2. Sơ lược về chương trình Demo
Chương trình mô phỏng thuật toán nhánh cận giải bài toán Ba lô
được xây dựng dựa trên bộ Framework Microsoft .NET 4.5 bằng ngôn ngữ lập trình C# và sử dụng bộ công cụ lập trình Visual Studio 2010.
Visual C# 2010 Express là phần mềm nằm trong dải sản phẩm Visual Studio 2010 Express với chức năng cung cấp bộ công cụ cho người sử dụng Windows để tạo ra các ứng dụng tùy chỉnh kèm thiết lập cơ bản và nâng cao.
Cùng với sự đơn giản, mạnh mẽ, an toàn và nhiều cải tiến, Visual C#
được thiết kế để xây dựng các ứng dụng khác nhau chạy trên .NET Framework sao cho hiệu quả nhất.
C# là ngôn ngữ đơn giản: C Shap loại bỏ một vài sự phức tạp 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. Chúng là những nguyên nhân gây ra sự
Hình 3.2 Giới thiệu phần mềm Visual C# 2010 Express
nhầm lẫn hay dẫn đến những vấn đề cho người phát triển C++. Ngôn ngữ C#
đơn giản vì nó dựa trên nền tảng C và C++. C# khá giống C và C++ về diện mạo, cú pháp, biểu thức, toán tử và những chức năng khác được lấy trực tiếp từ ngôn ngữ C và C++, nhưng nó đã được cải tiến để làm cho ngôn ngữ đơn giản hơn, loại bỏ các dư thừa, hay thêm vào những cú pháp thay đổi.
C# 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 là sự đóng gói, sự kế thừa, và đa hình. C# hỗ trợ tất cả những đặc tính trên.
C# là ngôn ngữ mạnh mẽ và cũng mềm dẻo : C# được sử dụng cho nhiều 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# là ngôn ngữ sử dụng 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.
C# là ngôn ngữ hướng module : Mã nguồn C# có thể được viết trong những phần được gọi là những lớp, những lớp này chứa các phương thức thành viên của nó. Những lớp và những phương thức có thể được sử dụng lại trong ứng dụng hay các chương trình khác. Bằng cách truyền các mẫu thông tin đến những lớp hay phương có thể tạo ra những mã nguồn dùng lại có hiệu quả.
C# sẽ là một ngôn ngữ phổ biến : C# được sử dụng bởi Microsoft.
Nhiều sản phẩm của công ty này đa chuyển đổi và viết lại bằng C#. Bằng cách sử dụng ngôn ngữ này Microsoft đã xác nhận khả năng của C# cần thiết cho những người lập trình.
Ngoài hai lý do trên ngôn ngữ C# cũng sẽ trở nên phổ biến do những đặc tính của ngôn ngữ này được đề cập trong mục trước như: đơn giản, hướng đối tượng, mạnh mẽ ...
3.3. Chương trình Demo
Giao diện của chương trình
Chạy thử nghiệm chương trình Demo
Chương trình được chạy thử nghiệm với 18 bộ dữ liệu từ số lượng đồ vật n = 4 cho đến số lượng đồ vật n = 40 đều cho kết quả chính xác. Đối với các bộ dữ liệu với số lượng đồ vật n nhỏ, thời gian chạy của thuật toán tương đối nhanh.Tuy nhiên, tùy thuộc vào các bộ dữ liệu đầu vào ( trọng lượng và giá trị của các đồ vật) mà thời gian chạy của thuật toán có sự khác nhau.
Hình 3.3 Giao diện chương trình bài toán Ba lô