Bài tập lớn Sử dụng phương pháp qui hoạch động giải bài toán cái túi để giải bài toán cái túi, chúng ta cần dùng phương pháp nào để đạt hiệu quả cao nhất, sử dụng phương pháp quy hoạch động làm tăng hiệu suất trong các thao tác xử lý. Mời các bạn cùng tham khảo!
Trang 1TR ƯỜ NG Đ I H C H NG Đ C Ạ Ọ Ồ Ứ
KHOA: CNTT & TT
MÔN: PHÂN TÍCH VÀ THI T K THU T TOÁN Ế Ế Ậ
Đ TÀI: “S D NG PH Ề Ử Ụ ƯƠ NG PHÁP QUI HO CH Đ NG GI I Ạ Ộ Ả
BÀI TOÁN CÁI TÚI”
H và tên : Đ Vi t Vũ ọ ỗ ế
Mã S Viên : 1561030049 ố
L p : K18 –ĐHCNTT ớ
Giáo viên HD : Tr nh Th Phú ị ị
1
Trang 2M C L CỤ Ụ
L i m đ uờ ở ầ
Cùng v i s phát tri n c a khoa h c kĩ thu t, công ngh thông tin nói chung vàớ ự ể ủ ọ ậ ệ
b môn phân tích và thi t k thu t toán nói riêng ngày càng độ ế ế ậ ượ ức ng d ng r ngụ ộ rãi trong nhi u lĩnh v c. V i m t c s d li u kh ng l , vi c đ a ra m tề ự ớ ộ ơ ở ữ ệ ổ ồ ệ ư ộ
phương pháp nh m gi i quy t v n đ tìm ki m d li u có hi u qu và nhanhằ ả ế ấ ề ế ữ ệ ệ ả chóng nh t luôn đấ ược s quan tâm c a các nhà phát tri n ph n m m. Thôngự ủ ể ầ ề
thường có r t nhi u phấ ề ương pháp đ gi i quy t m t bài toán. Vi c truy su t dể ả ế ộ ệ ấ ữ
li u ch a đ t hi u qu cao. S d ng phệ ư ạ ệ ả ử ụ ương pháp quy ho ch đ ng là m t gi iạ ộ ộ ả pháp làm tăng hi u su t trong các thao tác x lý. ệ ấ ử
V n đ đ t ra : đ gi i bài toán cái túi, chúng ta c n dùng phấ ề ặ ể ả ầ ương pháp nào
đ đ t hi u qu cao nh t. Đ gi i quy t v n đ trên ta cùng tìm hi u phể ạ ệ ả ấ ể ả ế ấ ề ể ươ ng pháp quy ho ch đ ng.ạ ộ
Trang 3I. C S LÝ THUY T Ơ Ở Ế
1. Khái ni m ệ
Quy ho ch đ ngạ ộ là m t phộ ương pháp gi m th i gian ch y c a các thu t ả ờ ạ ủ ậ toán th hi n các tínhể ệ ch t c a cácấ ủ bài toán con g i nhauố (overlapping subproblem) và c u trúc con t i uấ ố ư (optimal substructure).
2. C ách ti p c n ế ậ
- Topdown (T trên xu ng): Bài toán đừ ố ược chia thành các bài toán con, các bài toán con này được gi i và l i gi i đả ờ ả ược ghi nh đ phòng trớ ể ường h pợ
c n dùng l i chúng. Đây là đ quy và l u tr đầ ạ ệ ư ữ ược k t h p v i nhau.ế ợ ớ
- Bottomup (T dừ ưới lên): T t c các bài toán con có th c n đ n đ u đấ ả ể ầ ế ề ượ c
gi i trả ước, sau đó được dùng đ xây d ng l i gi i cho các bài toán l n h n.ể ự ờ ả ớ ơ Cách ti p c n này h i t t h n v không gian b nh dùng cho ngăn x p vàế ậ ơ ố ơ ề ộ ớ ế
s l i g i hàm. Tuy nhiên, đôi khi vi c xác đ nh t t c các bài toán con c nố ờ ọ ệ ị ấ ả ầ thi t cho vi c gi i quy t bài toán cho trế ệ ả ế ước không được tr c giác l m.ự ắ
3. Các b ước gi iả m t bài toán v i c u trúc con t i u ộ ớ ấ ố ư
- Chia bài toán thành các bài toán con nh h n.ỏ ơ
- Gi i các bài toán này m t cách t i u b ng cách s d ng đ quyả ộ ố ư ằ ử ụ ệ
- S d ng các k t qu t i uử ụ ế ả ố ư xây d ng m t l i gi i t i u cho bài toán ban ự ộ ờ ả ố ư
đ u.ầ
4. Các b ước gi i m t bài toán quy ho ch đ ngả ộ ạ ộ
- Tên và ý nghĩa các bi n ph c v s đ l p.ế ụ ụ ơ ồ ặ
- Cách khai báo các bi n đó.ế
- S đ (công th c) l p chuy n t m t bơ ồ ứ ặ ể ừ ộ ước sang bước ti p theo.ế
3
Trang 4- Giá tr đ u c a các bi n tham gia tính l p.ị ầ ủ ế ặ
- Tham s đi u khi n l p: thay đ i t đâu đ n đâu.ố ề ể ặ ổ ừ ế
- K t qu : đâu và làm th nào đ d n xu t ra.ế ả ở ế ể ẫ ấ
II. BÀI TOÁN CÁI TÚI
1. Mô hình bài toán
Bài toán x p cái túi (hay là bài toán ba lô)ế là m t bài toán t i u hóa ộ ố ư tổ h p. Bàiợ toán được đ t tên t v n đ ch n nh ng gì quan tr ng có th bặ ừ ấ ề ọ ữ ọ ể ỏ v a vào trongừ
m t cái túi (v i gi i h n kh i lộ ớ ớ ạ ố ượng) đ mang theo trong m tể ộ chuy n đi. Các bàiế toán tương t thự ường xu t hi n trong kinh doanh, toán tấ ệ ổ h p, lý thuy t đ ph cợ ế ộ ứ
t p tính toán, m t mã h c và toán ng d ng.ạ ậ ọ ứ ụ
2. Xây d ng h ự ướng gi iả
a. Nh p và xu t d li u ậ ấ ữ ệ
- Ch n phọ ương án khai báo bi n toàn c c.ế ụ
- Ch n cách nh p d li u t bàn phím và xu t b ng tính ra màn hình.ọ ậ ữ ệ ừ ấ ả
b. Xây d ng b ng tính b ng ph ụ ả ằ ương pháp qui ho ch đ ngạ ộ
- Hàm m c tiêu f: t ng giá tr c a cái túi (vali).ụ ổ ị ủ
- Nh n xét: giá tr c a cái túi ph thu c vào hai y u t , đó là giá tr c a cáiậ ị ủ ụ ộ ế ố ị ủ túi và tr ng lọ ượng c a các đ v t. Do đó ta có th dùng m ng hai chi u đủ ồ ậ ể ả ề ể
l u tr F[i][j]: là t ng giá tr l n nh t c a cái túi khi xét t v t th 1 đ nư ữ ổ ị ớ ấ ủ ừ ậ ứ ế
v t th i và tr ng lậ ứ ọ ượng không vượt quá j
- Khi xét đ n f[i][j] thì các giá tr trên b ng phế ị ả ương án đ u đề ượ ố ư t i u
Trang 5- Tính f[i][j] có 3 kh năng x y ra:ả ả
N u f[i][0] = 0 và f[0][j] = 0.ế
N u a[i] > j thì f[i][j]=f[i1][j].ế
N u a[i] <= j thì f[i][j ]= max (f[i1][j],f[i1][ja[i]] + c[i]).ế
c. Xây d ng hàm tìm giá tr l n nh t ự ị ớ ấ
- Xây d ng hàm b ng cách so sáng hai giá tr (hai s ) và đ a ra giá tr l n ự ằ ị ố ư ị ớ
h n (s l n h n). ơ ố ớ ơ
d. Xây d ng hàm truy v t tìm ra k t qu ự ế ế ả
- Xét t cu i b ng:ừ ố ả
N u f[i][j] != f[i1][j] thì xu t giá tr đó ra.ế ấ ị
III. CH ƯƠNG TRÌNH BÀI TOÁN CÁI TÚI S D NGỬ Ụ
PHƯƠNG PHÁP QUI HO CH Đ NGẠ Ộ
1. Ch ương trình
#include"stdio.h"
#include"conio.h"
int a[100],W, c[100], f[100][100];
int n,i,j,GT;
// nhap du lieu dau vao
void nhap( ){
printf("\nNhap so luong do vat = "); scanf("%d", &n);
printf("\nNhap khoi luong gioi han do vat = ");
scanf("%d", &W);
for( int i = 1; i<= n; i++ ){
printf("\nNhap khoi luong do vat thu %d = ",i);
scanf("%d", &a[i]);
} for( int i = 1; i<= n; i++ ){
5
Trang 6printf("\nNhap vao so cong dung cua do vat thu %d = ",i); scanf("%d", &c[i]);
}
}
// xuat bang tinh
void xuat(){
printf("\n\n **** BANG TINH****\n");
for(i=1;i<=n;i++){
for(j=0;j<=W;j++){
printf("%5d", f[i][j]);
}
printf("\n");
}
}
// tìm gia tri lon nhat
int max(int a, int b){
return (a>b)?a:b;
}
// hàm tinh gia tri cua bang
int bangphuongan(){
for(i=0;i<=n;i++){
f[i][0]=0;
}
for(j=0;j<=W;j++){
f[0][j]=0;
}
for(i=1;i<=n;i++){
for(j=1;j<=W;j++){
if (a[i]<=j){
Trang 7f[i][j]=max(f[i1][j],f[i1][ja[i]]+c[i]);
}
else{
f[i][j]=f[i1][j];
}
}
}
}
// hàm tìm ket qua cua bai toan
int truyvet(){
i=n;
j=W;
while ((i!=0)&&(j!=0)){
if (f[i][j]!=f[i1][j]){
printf("%2d ",i);
GT+=c[i];
j=a[i];
}
i;
}
}
int main(){
nhap();
printf("\n ****** CAC GIA TRI SAU KHI NHAP*****");
printf("\n Trong luong gioi han cua tui la = %d\n",W);
printf("\n trong luong cua do vat : \n");
for(i=1;i<=n;i++){
printf("%4d", c[i]);
}
7
Trang 8for(i=1;i<=n;i++){
printf("%4d", a[i]);
} bangphuongan();
xuat();
printf("\n\n Cac do vat duoc cho vao tui la: ", i);
truyvet();
printf("\n\n Tong gia tri toi da cua tui la = %d",W);
printf("\n\n Tong trong luong cua do vat duoc cho vao tui la= %d", GT); getch();
return 0; }
2. Yêu c u khi ch y ầ ạ
- Xu t ra đấ ược b ng tính.ả
- Hàm tìm ki m có th tìm ra đế ể ược k t qu ế ả
IV. DEMO C A BÀI TOÁN CÁI TÚI Ủ
1. D li u đ u vào ữ ệ ầ
Tr ng lọ ượng gi i h nớ ạ W = 10
S đ v t gi i h n ố ồ ậ ớ ạ n = 4
Giá trị
Đ v tồ ậ
Tr ng lọ ượng
c a đ v tủ ồ ậ
Công d ngụ
đ v tồ ậ
Đ v t th 1ồ ậ ứ 7 9
Đ v t th 2ồ ậ ứ 4 4
Đ v t th 3ồ ậ ứ 3 3
Đ v t th 4ồ ậ ứ 2 1
2. K t qu ế ả
a. B ng tính s d ng ph ả ử ụ ương pháp QHĐ
Trang 90 0 0 0 0 0 0 9 9 9 9
0 0 1 3 4 4 5 9 9 10 12
b. K t qu bài toán ế ả
Giá tr đị ược in
Giá tr c n in ị ầ
Giá tr in raị màn hình
T ng giá tr t i đa có th cho vào túi.ổ ị ố ể 10
Đ v t đồ ậ ược cho vào túi là đ v t th ồ ậ ứ 3 1
T ng công d ng (tr ng lổ ụ ọ ượng) c a các đ v tủ ồ ậ
được cho vào túi 12
V K T LU N Ế Ậ
Sau m t th i gian tìm hi u, nghiên c u và th c hi n đ tài. Các yêu c u chínhộ ờ ể ứ ự ệ ề ầ
c a đ tài c b n đã hoàn t t v i các n i dung sau:ủ ề ơ ả ấ ớ ộ
1 Ư u đi mể
Xây d ng đự ược chương trình “ bài toán cái túi” s d ng ử ụ phương pháp qui
ho ch đ ng đ gi i.ạ ộ ể ả
Chương trình s lý nhanh và tử ương đ i chính xác.ố
2 Khuy t đi m ế ể
M c dù r t c g ng nh ng trong th i gian ng n, kinh nghi m còn h nặ ấ ố ắ ư ờ ắ ệ ạ
ch nên k t qu còn thi u sót c n ti p t c đế ế ả ế ầ ế ụ ược hoàn thi n đ có thệ ể ể
gi i đả ược các yêu c u ph c t p h n.ầ ứ ạ ơ
9
Trang 10Chương trình còn nhi u l i nh : v v n đ x lý hay thu t toán truy v tề ỗ ư ề ấ ề ử ậ ế (tìm ki m k t qu ) ch a t i u …ế ế ả ư ố ư
3 H ướng phát tri nể
Xây d ng hoàn thi n các ch c năng giúp ngự ệ ứ ườ ử ụi s d ng d dàng h n,ễ ơ
phương pháp qui ho ch đ ng tạ ộ ương đ i t i u và hi u qu h n.ố ố ư ệ ả ơ
Có th s d ng phể ử ụ ương pháp đ gi i m t s bài toán tể ả ộ ố ương t ự
Trên đây là k t qu đ t đế ả ạ ược cũng nh còn m t s t n t i, hư ộ ố ồ ạ ướng phát tri nể
c a đ tài.ủ ề
Sinh viên th c hi n.ự ệ
Đ Vi t Vũỗ ế
TÀI LI U THAM KH OỆ Ả
1. C m nang thu t toán – cu n 1 – Robert Sedgewich – Tr n Đan Th ẩ ậ ố ầ ư
2. L p trình = Thu t toán + CTDL, N. Wirth.ậ ậ