Có 3 phương pháp để giải quyết chúng được dùng trong thực tế: - Nếu kích thước dữ liệu nhập vào đủ nhỏ, có thể sử dụng thuật toán giải chính xác với chi phí thời gian hàm mũ là phương án
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO MÔN HỌC
PHÂN TÍCH VÀ ĐÁNH GIÁ THUẬT TOÁN
Đề bài số 22:
Phương pháp xấp xỉ Bài toán cái túi: có n đồ vật với kích thước s1, ,
sn và các túi có sức chứa T Giả thiết rằng si T, i =1, 2, ,n Tìm cách xếp các đồ vật vào túi sao cho số túi phải sử dụng là ít nhất
Giáo viên hướng dẫn: PGS.TS Đào Thanh Tĩnh
Học viên: Phan Thùy Chi
Hà Nội, 2014
Trang 2Mục lục
I Đặt vấn đề 2
II Bài toán cái túi 3
A Phát biểu bài toán: 3
B Một số thuật toán giải quyết bài toán: 3
1 Phương pháp theo kinh nghiệm: 3
2 Phương pháp tham lam: 4
2.1 Sắp xếp các vật theo kích thước tăng dần: 4
2.2 Sắp xếp các vật theo kích thước giảm dần: 6
III Cài đặt thử nghiệm 9
1 Chương trình minh họa 9
2 Một số kết quả kiểm thử 10
3 Đánh giá – bình luận: 13
KẾT LUẬN 14
TÀI LIỆU THAM KHẢO 15
Trang 3I Đặt vấn đề
Phân tích, thiết kế và đánh giá thuật toán là một trong những nhân tố mấu chốt xác định được hiệu năng hệ thống khi giải quyết bài toán tin học đặt ra Có nhiều bài toán lời giải (thuật toán) được đưa ra chỉ tốt ở một mức độ chấp nhận được
Rất khó có thể tìm được chính xác phương án tối ưu của bài toán, thế nhưng vì tầm quan trọng nên ta không thể bỏ qua được lớp bài toán này Có 3 phương pháp để giải quyết chúng được dùng trong thực tế:
- Nếu kích thước dữ liệu nhập vào đủ nhỏ, có thể sử dụng thuật toán giải chính xác với chi phí thời gian hàm mũ là phương án tốt nhất
- Ta phân loại bài toán ra trường hợp đặc biệt và quan trọng rồi tìm lời giải cho nó với chi phí thời gian đa thức
- Tìm lời giải gần tối ưu cho bài toán với chi phí thời gian đa thức Điều kiện gần tối ưu có nghĩa là đủ tốt Phương pháp tìm lời giải gần tối ưu ta gọi là phương pháp xấp xỉ Thuật toán được áp dụng cho phương pháp này gọi là thuật toán xấp xỉ
Với bài toán cái túi đã có nhiều phương pháp được đề xuất như: phương pháp quy hoạch động, phương pháp nhánh cận ở mỗi phương pháp đều có ưu, nhược điểm riêng Với bài tập này, em nghiên cứu giải bài toán này bằng phương pháp xấp xỉ Do thời gian có hạn, trong báo cáo chưa thể trình bày đầy
đủ chi tiết các thuật toán xấp xỉ, rất mong được sự đóng góp ý kiến của thầy giáo
và các bạn học viên
Qua đây, em xin chân thành biết ơn sự chỉ bảo tận tình của thầy giáo TS Đào Thanh Tĩnh đã giúp em hoàn thành tốt nội dung nghiên cứu này
Trang 4II Bài toán cái túi
A Phát biểu bài toán:
Phương pháp xấp xỉ Bài toán cái túi: có n đồ vật với kích thước s 1 , , s n
và các túi có sức chứa T Giả thiết rằng s i T, i =1, 2, ,n Tìm cách xếp các đồ vật vào túi sao cho số túi phải sử dụng là ít nhất
B Một số thuật toán giải quyết bài toán:
1 Phương pháp theo kinh nghiệm:
a) Tư tưởng thuật toán:
- Tìm vật s[i] có kích thước lớn nhất và nhỏ hơn hoặc bằng sức chứa của túi
tltui[j] (tức là s[i] <= tltui[j]) Khi đó ta cho vật s[i] vào túi j
- Nếu nhét thêm vật thứ i+1 mà có kích thước túi sẽ lớn hơn sức chứa tối đa
của túi [j] thì ta cho vật vào túi j+1 Cứ như vậy cho đến khi không còn đồ vật nào cả
b) Đánh giá:
- Nếu n là lớn, con người không thể làm được vì mất quá nhiều thời gian.
- Kết quả: Nhận được kết quả tốt.
c) Ví dụ minh họa:
Sức chứa của túi T=1 Có 8 đồ vật với kích thước tương ứng như sau:
Trang 52 Phương pháp tham lam:
2.1 Sắp xếp các vật theo kích thước tăng dần:
- Sắp xếp các vật s[i] theo chiều tăng dần của kích thước
- Duyệt các đồ vật từ 1 đến n
Bắt đầu từ túi j=1, nếu túi tltui[j] + s[i] <=T thì cho vật s[i] vào túi tltui[j] Ngược lại nếu tltui[j] + s[i] > T thì ta xét túi tiếp theo
Quá trình lặp lại cho đến khi đã xét hết tất cả các đồ vật (i = n) là kết thúc
a) Mô tả thuật toán:
Input: - Cho n đồ vật
- Gọi s là mảng chứa kích thước của n đồ vật (s1, s2, …, sn)
- Gọi T là sức chứa tối đa của 1 túi.
Output: - Gọi tltui là mảng chứa sức chứa đang có của n túi (tltui1, tltui2,
…, tltuin)
- Gọi mảng bin là mảng lưu trữ thông tin vật nào đã được xếp vào túi nào.
2
8(7)
4(6) 5(8)
2 2 2 3(5) Túi 1
Sức chứa =10 Sức chứaTúi 2 =9 Sức chứa =9Túi 3
Trang 6b) Cài đặt thuật toán:
void sxtang(int s[],int n){
int i,j,tg;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
if(s[i]>s[j]) {
tg = s[i];
s[i] = s[j];
s[j] = tg;
} }
}
c) Ví dụ minh họa:
Có 7 đồ vật, sức chứa của túi T=10 Các vật có kích thước tương ứng: 2, 3, 3, 4,
4, 7, 5
* Xếp các đồ vật theo thứ tự tăng dần kích thước
Sắp xếp các vật tăng
dần theo kích thước 2 3 3 4 4 5 7
* Xếp các đồ vật:
- Đồ vật thứ 1: s[1]=2, túi 1 có sức chứa = 2
- Đồ vật thứ 2: s[2]=3, túi 1 có sức chứa =5
Trang 7- Đồ vật thứ 3: s[3]=3, túi 1 có sức chứa =8.
- Đồ vật thứ 4: s[4]=4, túi 1 có sức chứa = 14 -> thêm túi 2
Thêm đồ vật thứ 4 vào túi 2, túi 2 có tổng sức chứa là 4
- Đồ vật thứ 5: s[5]=4, túi 1 có sức chứa =14 -> thêm vào túi 2
Thêm đồ vật thứ 5 vào túi 2, túi 2 có tổng sức chứa là 8
- Đồ vật thứ 6:s[6]=5, túi 1 có sức chứa =15 -> Thêm vào túi 2
Túi 2 có sức chứa là 13 -> thêm túi 3
- Đồ vật thứ 7:s[7]=7, túi 1 có sức chứa =17
Thêm đồ vật thứ 7 vào túi 2, túi 2 có tổng sức chứa là 15 -> Thêm đồ vật vào túi 3
Thêm đồ vật thứ 7 vào túi 3, túi 3 có tổng sức chứa là 12 -> Thêm đồ vật vào túi 4
Thêm đồ vật thứ 7 vào túi 4, túi 4 có tổng sức chứa là 7
Đã xét hết các đồ vật
Ta được kết quả như hình sau:
C Sắp xếp các vật theo kích thước giảm dần:
a) Tư tưởng thuật toán:
- Sắp xếp mảng s[ ] theo chiều giảm dần của kích thước đồ vật
3(3)
3(2)
2(1)
4(5)
Túi 1
Sức chứa =8
7(7)
Túi 4 Sức chứa =7
Trang 8- Duyệt các vật từ 1 đến n.
Nếu vật s[i] mà cho được vào túi j thì thực hiện cho vào túi j và tăng sức chứa tltui[j]
Nếu vật s[i] không thể thêm vào túi tltui[j] thì ta xét xem túi tltui[j+1] nếu cho vào được thì ta thêm vật s[i] vào túi tltui[j+1]
Lặp đi lặp lại với các vật s[i+1] tiếp theo cho đến khi i = n
b) Mô tả thuật toán:
Input: - Cho n đồ vật
- Gọi s là mảng chứa kích thước của n đồ vật (s1, s2, …, sn)
- Gọi T là sức chứa tối đa của 1 túi.
Output: - Gọi tltui là mảng sức chứa đang có của n túi (tltui1, tltui2, …, tltuin)
- Gọi mảng bin là mảng lưu trữ thông tin vật nào đã được xếp vào túi nào.
c) Cài đặt thuật toán:
void sxgiam(int s[],int n){
int i,j,tg;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
if(s[i]<s[j]) {
tg = s[i];
s[i] = s[j];
s[j] = tg;
} }
}
Trang 9d) Ví dụ minh họa:
Sắp xếp các vật tăng
dần theo kích thước 7 5 4 4 3 3 2
Xếp các đồ vật tương tự như trên ta có kết quả:
e) Đánh giá thuật toán:
- Với phương pháp sắp xếp mảng s[ ] theo chiều giảm dần thì cho kết quả tối ưu hơn so với thuật toán sắp xếp tăng dần
- Thuật toán cũng mất nhiều bộ nhớ khi n là lớn
- Độ phức tạp của thuật toán là O(n)
3(5)
7(1)
9
95
0
7(1)
4(3) 5(2)
2(7) 3(6) 4(4)
Túi 1
Sức chứa=10
Túi 3 Sức chứa =9
Túi 2 Sức chứa =9
Trang 10III Cài đặt thử nghiệm
1 Chương trình minh họa
- Chương trình cài đặt thử nghiệm trên phần mềm DEV C++
- Chương trình thử nghiệm gồm các file:
bai tap.dev
Main.cpp
- Kết quả chạy thử:
Trang 112 Một số kết quả kiểm thử
* File dữ liệu đầu vào: 5.txt
Số lượng đồ vật = 5
Tải trọng của túi = 10
Trọng lượng của các đồ vật lần lượt là: 1 6 2 3 7
Cách 1 sắp xếp các đồ vật theo thứ tự giảm dần
Số lượng túi sử dụng là 2
Túi 1 với các đồ vật có kích thước là 7 – 3, Tổng = 10
Túi 2 với các đồ vật có kích thước là 6 – 2 - 1, Tổng = 9
Thời gian thực hiện thuật toán là không đáng kể
Cách 2 sắp xếp các đồ vật theo thứ tự tăng dần
Số lượng túi sử dụng là 3
Túi 1 với các đồ vật có kích thước là 1 - 2 - 3, Tổng = 6
Túi 2 với các đồ vật có kích thước là 6, Tổng = 6
Túi 3 với các đồ vật có kích thước là 7, Tổng = 7
Thời gian thực hiện thuật toán là không đáng kể
* File dữ liệu đầu vào: 10.txt
Số lượng đồ vật = 10
Tải trọng của túi = 15
Trọng lượng của các đồ vật lần lượt là: 5 7 3 2 6 5 2 8 4 1
Cách 1 sắp xếp các đồ vật theo thứ tự giảm dần
Số lượng túi sử dụng là 3
Túi 1 với các đồ vật có kích thước là 8 – 7, Tổng = 15
Túi 2 với các đồ vật có kích thước là 6 – 5 - 4, Tổng = 15
Túi 3 với các đồ vật có kích thước là 5 – 3 – 2 – 2 – 1 , Tổng = 13
Thời gian thực hiện thuật toán là không đáng kể
Cách 2 sắp xếp các đồ vật theo thứ tự tăng dần
Số lượng túi sử dụng là 4
Trang 12Túi 1 với các đồ vật có kích thước là 1 - 2 – 2 – 3 - 4, Tổng = 12
Túi 2 với các đồ vật có kích thước là 5 - 5, Tổng = 10
Túi 3 với các đồ vật có kích thước là 6 - 7, Tổng = 13
Túi 4 với các đồ vật có kích thước là 8, Tổng = 8
Thời gian thực hiện thuật toán là không đáng kể
* File dữ liệu đầu vào: 100.txt
Số lượng đồ vật = 100
Tải trọng của túi = 540
Trọng lượng của các đồ vật lần lượt là: 2 4 5 6 47 4 3 5 7 8 12 4 7 23 38 2 9
7 10 14 22 4 5 6 7 4 3 5 7 8 12 4 7 3 8 2 9 7 10 14 22 4 5 6 7 4 3 25 7 8 12 4 7 3
8 2 19 7 10 14 2 4 5 6 7 4 3 5 7 8 12 4 17 3 8 2 9 7 10 14 2 4 5 6 17 4 3 5 7 8 12
4 7 3 8 2 39 7 10 14
Cách 1 sắp xếp các đồ vật theo thứ tự giảm dần
Số lượng túi sử dụng là 17
Túi 1 với các đồ vật có kích thước là 47 – 3 , Tổng = 50
Túi 2 với các đồ vật có kích thước là 39- 10, Tổng = 49
Túi 3 với các đồ vật có kích thước là 38- 12 , Tổng = 50
Túi 4 với các đồ vật có kích thước là 25 – 23 - 2 , Tổng = 50
Túi 5 với các đồ vật có kích thước là 22 -22 - 6 , Tổng = 50
Túi 6 với các đồ vật có kích thước là 19 – 17 - 14 , Tổng = 50
Túi 7 với các đồ vật có kích thước là 17 – 14 – 14 - 5 , Tổng = 50
Túi 8 với các đồ vật có kích thước là 14 – 14 – 12 - 10 , Tổng = 50
Túi 9 với các đồ vật có kích thước là 12 – 12 – 12 – 10 - 4, Tổng = 50 Túi 10 với các đồ vật có kích thước là 10 – 10 – 9 – 9 – 9- 3, Tổng = 50 Túi 11 với các đồ vật có kích thước là 8 – 8 – 8 – 8 – 8 – 8 - 2, Tổng = 50 Túi 12 với các đồ vật có kích thước là 8 – 8 – 8 – 7 – 7 – 7 - 5, Tổng = 50 Túi 13 với các đồ vật có kích thước là 7 – 7 – 7 – 7 – 7 – 7 - 7, Tổng = 49 Túi 14 với các đồ vật có kích thước là 7 – 7 – 7 – 7 – 7 – 7 - 7, Tổng = 49
Trang 13Túi 15 với các đồ vật có kích thước là 6 – 6 – 6 – 6 – 5 – 5 – 5 – 5 - 5, Tổng
= 49
Túi 16 với các đồ vật có kích thước là 5 – 5 – 4 – 4 – 4 – 4 – 4 – 4 – 4 – 4 – 4 – 4, Tổng = 50
Túi 17 với các đồ vật có kích thước là 4 – 4 – 4 – 4 – 3 – 3 – 3 – 3 – 3 – 3 – 3 – 2 – 2 – 2 – 2 – 2 – 2 , Tổng = 49
Thời gian thực hiện thuật toán là không đáng kể
Cách 2 sắp xếp các đồ vật theo thứ tự tăng dần
Số lượng túi sử dụng là 19
Túi 1 với các đồ vật có kích thước là 2-2-2-2-2-2-2-2-3-3-3-3-3-3-3-3-3-4, Tổng = 47
Túi 2 với các đồ vật có kích thước là 4-4-4-4-4-4-4-4-4-4-4-4, Tổng = 48 Túi 3 với các đồ vật có kích thước là 4-4-5-5-5-5-5-5-5-5, Tổng = 48
Túi 4 với các đồ vật có kích thước là 5-6-6-6-6-6-7-7, Tổng = 49
Túi 5 với các đồ vật có kích thước là 7-7-7-7-7-7-7, Tổng = 49
Túi 6 với các đồ vật có kích thước là 7-7-7-7-7-7-7, Tổng = 49
Túi 7 với các đồ vật có kích thước là 7-8-8-8-8-8, Tổng = 47
Túi 8 với các đồ vật có kích thước là 8-8-8-8-9-9, Tổng = 50
Túi 9 với các đồ vật có kích thước là 9-10-10-10-10, Tổng = 49
Túi 10 với các đồ vật có kích thước là 10-12-12-12, Tổng = 46
Túi 11 với các đồ vật có kích thước là 12-12-14, Tổng = 38
Túi 12 với các đồ vật có kích thước là 14-14-14, Tổng = 42
Túi 13 với các đồ vật có kích thước là 14-17-17, Tổng = 48
Túi 14 với các đồ vật có kích thước là 19-22, Tổng = 41
Túi 15 với các đồ vật có kích thước là 22-23, Tổng = 45
Túi 16 với các đồ vật có kích thước là 25, Tổng = 25
Túi 17 với các đồ vật có kích thước là 38, Tổng = 38
Túi 17 với các đồ vật có kích thước là 39, Tổng = 39
Trang 14Túi 17 với các đồ vật có kích thước là 47, Tổng = 47
Thời gian thực hiện thuật toán là không đáng kể
* File dữ liệu đầu vào: 1000.txt
Số lượng đồ vật = 1000
Tải trọng của túi = 500
Trọng lượng của các đồ vật lần lượt là:
Cách 1 sắp xếp các đồ vật theo thứ tự giảm dần
Số lượng túi sử dụng là 38
Thời gian thực hiện thuật toán là không đáng kể
Cách 2 sắp xếp các đồ vật theo thứ tự tăng dần
Số lượng túi sử dụng là 41
Thời gian thực hiện thuật toán là không đáng kể
3 Đánh giá – bình luận:
Với 2 thuật toán sắp xếp các đồ vật theo thứ tự tăng dần và giảm dần, dù thời gian thực hiện thuật toán là không đáng kể nhưng thuật toán sắp xếp đồ vật
theo thứ tự giảm dần có Tổng số lượng túi phải sửa dụng ít hơn so với thuật
toán sắp xếp tăng dần và sức chứa của mỗi túi cũng được sử dụng nhiều hơn, tránh lãng phí tài nguyên của túi
Trang 15KẾT LUẬN
Bài toán cái túi được giải theo phương pháp tham lam bằng cách sắp xếp
dữ liệu đầu vào để đưa ra được một kết quả khả thi bằng giá trị tối ưu của bài toán Nhìn chung thuật giải trên đã giải quyết được tình huống của bài toán cơ bản đạt được các chỉ tiêu của thuật toán
Trang 16TÀI LIỆU THAM KHẢO
1 Bài giảng của PGS, TS Đào Thanh Tĩnh
2 Thiết kế và đánh giá thuật toán, Trần Tuấn Minh
3 Knapsack problems (Algorithms and Computer Implementations), Silvano Martello and Paolo Toth
4 Một số trang seb