Tải bản đầy đủ (.doc) (9 trang)

MÔN HỌC THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN: Bài toán cái túi (9 pages)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (320.43 KB, 9 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Viện Công nghệ Thông tin và Truyền thông
BÀI TẬP LỚN MÔN HỌC
THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN
Đề tài:
BÀI TOÁN CÁI TÚI
Học viên thực hiện:
1. Đào Duy Thành. SHHV:20082364
Mã lớp: 29106
Giáo viên hướng dẫn: PGS Nguyễn Đức Nghĩa
HÀ NỘI – 2011
1
Mục lục
Mục lục 2
Giới thiệu : 3
Chương I : Bài toán cái túi 4
1.1Giới thiệu 4
1.2Bài toán cái túi dạng 0-1 4
1.3Bài toán cái túi dạng phân số 5
Chương 2: Giải bài toán cái túi bằng thuật toán trực tiếp (Brute-force) 5
Chương 3: Giải bài toán cái túi bằng thuật toán tham lam 5
3.1 Greedy 1 5
3.2 Greedy 2 5
3.3 Greedy 3 5
3.4 Greedy 4 5
3.5 Thực hiện bài toán cái túi theo Greedy 3 bằng C++ 6
Chương IV: Giải bài toán cái túi bằng thuật toán quy hoạch động 7
4.1 Mô tả: 7
4.2 Nhận xét: 8
Tài liệu tham Khảo chính: 9
2


Giới thiệu :
Báo cáo này sẽ trình bày về các thuật toán giải quyết bài toán cái túi. Trong đó có sử dụng 2
giải thuật là: giải thuật tham lam (Greedy) và Quy hoạch động (Dynamic progaming). Từ đó đưa ra
các đánh giá về độ phức tạp của thuật toán và lựa chọn phương án tối ưu.
Xin chân thành cám ơn thầy Nguyễn Đức Nghĩa đã giúp đỡ em thực hiện bài toán này
Hà Nội tháng 12 năm 2011
3
Chương I : Bài toán cái túi
1.1 Giới thiệu.
Bài toán cái túi (hay còn gọi là bài toán xếp ba lô) là một bài toán tối ưu tổ hợp. Bài toán
được đặt tên từ vấn đề chọn những gì quan trong có thể nhét vừa vào một cái túi (với giới hạn Khối
lượng) để mang theo trong một chuyến đi.
Nội dung bài toán như sau: Một kẻ trộm đột nhập vào một cửa hiệu tìm thấy có n mặt hàng có
trọng lượng và giá trị khác nhau, nhưng hắn chỉ mang theo một cái túi có sức chứa về trọng lượng
tối đa là M. Vậy kẻ trộm nên bỏ vào túi những món nào và số lượng bao nhiêu để đạt giá trị cao
nhất trong khả năng mà hắn có thể mang đi được.
Ví dụ về bài toán cái túi trong giới hạn một chiều: chọn các hộp nào để làm cho giá trị tiền là
cực trại Khi tổng trọng lượng Không vượt quá 15Kg? Bài toán đa chiều có thể xét đến Khối lượng
riêng và Kích thước của hộp, đó là bài toán xếp vali điển hình(pacKing problem)
Ta có n loại đồ vật, từ 1 tới n. Mỗi đồ vật thứ i có trọng lượng w[i] và giá trị v[i]. Trọng lượng
tối đa mà túi có thể mang được là S.
1.2 Bài toán cái túi dạng 0-1.
Hạn chế số đồ vật thuộc mỗi loại là 0 (Không được chọn ) và 1 (được chọn).
Bài toán cái túi có thể được phát biểu bằng toán học như sau:
Cực đại hóa
Sao cho với hoặc 1
Bài toán cái túi bị chặn hạn chế số đồ vật huộc mỗi loại nào đó Không được vượt quá một lượng
nào đó.
Có thể được phát biểu bằng toán học như sau
Cực đại hóa

Sao cho với
Bài cái túi không bị chặn Không có một hạn chế nào về số lượng đồ vật mỗi loại.
Một trường hợp đặc biệt của bài toán này nhận được nhiều quan tâm, đó là bài toán với các tính
chất:



là một bài toán quyết định
là một bài toán 0/1
với mỗi đồ vật, chi phí bằng giá trị: C = V
4
Trường hợp đặc biệt này được gọi là bài toán tổng các tập con (subset sum problem). Với
một số lý do, trong ngành mật mã học, người ta thường dùng cụm từ "bài toán cái túi Khi thực ra
đang có ý nói về "bài toán tổng con".
Bài toán cái túi thường được giải bằng quy hoạch động, tuy chưa có một thuật toán thời
gian đa thức cho bài toán tổng quát. Cả bài cái túitổng quát và bài toán tổng con đều là các bài NP-
Khó, và điều này dẫn đến các cố gắng sử dụng tổng con làm cơ sở cho các hệ thống mật mã hóa
Khóa công Khai, chẳng hạn MerKle-Hellman. Các cố gắng này thường dùng nhóm thay vì các số
nguyên. MerKle-Hellman và một số thuật toán tương tự Khác đã bị phá, do các bài toán tổng con cụ
thể mà họ tạo ra thực ra lại giải được bằng các thuật toán thời gian đa thức.
Phiên bản bài toán quyết định của bài toán cái túi được mô tả ở trên là NP-đầy đủ và trong
thực tế là một trong 21 bài toán NP-đầy đủ của Karp.
1.3 Bài toán cái túi dạng phân số
Với mỗi loại, có thể chọn một phần của nó (ví dụ: 1Kg bơ có thể được cắt ra thành nhiều
phần để bỏ vào ba lô)
Chương 2: Giải bài toán cái túi bằng thuật toán trực tiếp (Brute-force)
Phương pháp này duyệt tất cả Khả năng chất đồ vào túi, tìm cách chất có tổng giá trị lớn
nhất trong số các cách chất co tổng trọng lượng các đồ vật Không quá dung lượng của túi
Tuy nhiên, phương pháp này ít được sử dụng do có độ phức tạp O (n2)
Chương 3: Giải bài toán cái túi bằng thuật toán tham lam

3.1 Greedy 1


Giải thuật: sắp xếp các đồ vật theo thứ tự Không tăng của giá trị.
Lần lượt xét các đồ vật theo thứ tự đã sắp , và chất đồ đang xét vào túi nếu như dung lượng
còn lại của cái túi đó đủ chứa nó (tức là tổng trọng lượng của các đồ vật đã xếp vào túi và
trọng lượng của các đồ vật đang xét Không vượt quá Khả năng của túi).
Tuy nhiên, phương pháp này chưa cho lời giải chính xác
3.2 Greedy 2


Sắp xếp các đồ vật theo thứ tự Không giảm của trọng lượng
Lần lượt xét các đồ vật theo thứ tự đã sắp , và chất đồ đang xét vào túi nếu như dung lượng
còn lại của cái túi đủ chứa nó (tức là tổng trọng lượng của các đồ vật đã xếp vào túi và trọng
lượng của các đồ vật đang xét Không vượt quá dung lượng của túi).
Tương tự Greedy 1, phương pháp này chưa mang lại được độ chính xác cần thiết
3.3 Greedy 3


Sắp xếp các đồ vật theo thứ tự Không tăng của giá trị một đơn vị trọng lượng ( )
Lần lượt xét các đồ vật theo thứ tự đã sắp, và chất đồ vật đang xét vào túi nếu như dung
lượng còn lại của cái túi đủ chứa nó
3.4 Greedy 4

Gọi là lời giải thu được theo thuật toán Greedy j , j=1;2;3 Gọi là lời giải đạt
5

Định lý: Lời giải thỏa mãn đẳng thức
3.5 Thực hiện bài toán cái túi theo Greedy 3 bằng C++
Các hàm được sử dụng :





Độ phức tạp:
swap (x,y) được dùng để đổi chỗ biến x và y Khi sắp xếp
nhap() dùng để nhập dữ liệu từ bàn phím
sapxep() được dùng để sắp xếp lại mảng theo thứ tự giảm dần của tỉ lệ v[i]/w[i] , tức
là tỉ lệ giảm dần của giá trị trên Khối lượng mỗi đồ vật
thamlam() lần lượt trọn các đồ vật đã được sắp xếp theo thứ tự giảm dần của giá trị
trên Khối lượng, biến Kỉ lục ghi nhận Kết quả tốt nhất Khi thực hiện


Nếu sử dụng sắp xếp đơn giản (chèn, nổi bọt…) thì độ phức tạp của cả bài toán là O(n2)
Nếu sử dụng quicK sort hoặc merge sort thì độ phức tạp là O(nlogn) tốt hơn so với giải trực
tiếp
Giao diện nhập số liêu
6
Kết quả thu được
Chương IV: Giải bài toán cái túi bằng thuật toán quy hoạch động.
4.1 Mô tả:

Với mỗi và , xét bài toán . Tính là tổng
giá trị lớn nhất của các đồ vật được chọn trong số K đồ vật đầu tiên và có tổng trọng
lượng Không quá S.

Có tất cả bài toán. Bài toán cần giải là


Giá trị tối ưu cần tìm là

Với K=1 ta có
o
o

Gỉa sử tính được với mọi và . Khi đó, để tính
ta có thể lập luận như sau
o Nếu
thì đồ vật thứ K Không thể chất vào túi, do đó cách chất tối ưu
chỉ có thể sử dụng K-1 đồ vật trước đó và có giá trị là
o Nếu

thì cách chất tối ưu cần lựa chọn trong 2 cách chất sau
Không chất đồ vật K vào túi, Khi đó giá trị của cách chất tối ưu sẽ là
7

Chất đồ vật hứ K vào túi, Khi đó trọng lượng còn lại sẽ được chất tối
ưu từ đồ vật đầu tiên với giá trị tối ưu sẽ là
o Từ đó ta có công thức đệ quy
4.2 Nhận xét:
Thuật toán giải bài toán cái túi có thời gian đánh giá là O(nL). Thời gian này phụ thuộc
tuyến tính vào dữ liệu vào L, nhưng nếu xét nó như là hàm của độ dài dữ liệu vào , thì
sự phụ thuộc này lại là hàm mũ.Trên thực tế,thuật toán này làm việc hiệu quả Khi L Không là quá
lớn
8
Tài liệu tham khảo chính:
1. Nguyễn Đức Nghĩa. Bài giảng Thiết Kế và phân tích thuật toán. ĐHBK Hà nội, 2010.
2. WiKipedia.org và các nguồn Khác từ internet
9

×