Bài toán cái túi 0-1 Một tên trộm đột nhập cửa hàng tìm thấy n đồ vật có trọng lượng và giá trị khác nhau.. Tên trộm mang theo cái túi có trọng lượng tối đa là M, M nguyên.. Hãy chọn
Trang 1II BÀI TOÁN TỐI ƯU quy hoạch động
1 Bài toán cái túi 0-1
Một tên trộm đột nhập cửa hàng tìm thấy n đồ vật có trọng lượng và giá trị khác
nhau Tên trộm mang theo cái túi có trọng lượng tối đa là M, M nguyên
Hãy chọn các đồ vật mà tên trộm có thể cho vào túi mang đi sao cho tổng giá trị
là lớn nhất
Giải
Ký hiệu w(i) là trọng lượng vật i,
i=1 n
v(i) là giá trị vật i, i=1 n
Mô hình toán học của bài toán là bài toán quy hoạch tuyến tính nhị phân:
Nếu đồ vật thứ i không được chọn, thì:
Trang 2F(i, L) = F(i -1, L) Nếu đồ vật thứ i được chọn, thì:
F(i, L) = F(i -1, L – w(i)) + v(i)
F(i, L) = max{ F(i -1, L); F(i -1, L – w(i)) + v(i)}
- Điều kiện đầu :
Trang 31 0
2 0
: :
- Sử dụng công thức truy hồi tính toán F(i,L) theo thứ tự i=1,2,…,n
Truy vết tìm phương án tối ưu
Tra bảng: F(n,M) là giá trị lớn nhất
Bắt đầu từ ô F(n, M) trên dòng n ta dò ngược về dòng 0 theo nguyên tắc:
• Nếu F(i,L) > F(i–1,L), thì đồ vật thứ i được chọn, ta truy tiếp ô F(i1, Lw(i))
• Nếu F(i,L) = F(i–1,L), thì đồ vật thứ i không được chọn, ta truy tiếp ô F(i1,L)
Trang 4Truy vết tìm phương án tối ưu
Các đồ vật được chọn là: 5, 3, 2, 1 Giá trị tối ưu F(5,13)=16
if (w[i] <= L && F[i, L] < F[i-1, L - w[i]] + v[i])
F[i, L] = F[i-1, L - w[i]] + v[i];
}
}
Thủ tục truy vết
void TruyVet(F[0 n][0 M])
Trang 62 Bài toán cái túi 0-n
Một tên trộm đột nhập cửa hàng tìm thấy n loại đồ vật có trọng lượng và
giá trị khác nhau Tên trộm mang theo cái túi có trọng lượng tối đa là M, M nguyên Hãy chọn các đồ vật mà tên trộm có thể cho vào túi mang đi sao cho tổng giá trị là lớn nhất Mỗi loại đồ vật có thể lấy nhiều cái
Giải
Ký hiệu w(i) là trọng lượng loại đồ vật i,
i=1 n
v(i) là giá trị loại đồ vật i, i=1 n
Mô hình toán học của bài toán là bài toán quy hoạch tuyến tính nguyên: Tìm
vectơ x = [x(1), …, x(n)] thỏa :
f(x) = v(1).x(1)+v(2).x(2)+ … + v(n).x(n) ->max
w(1).x(1)+w(2).x(2)+ … + w(n).x(n) <=M
x(i) >=0 và nguyên, với mọi i=1,…,n
Với các giá trị i và L: i = 0, 1, 2, , n và L = 0, 1, 2, , M Gọi F(i,L) là tổng giá trị lớn nhất có thể chọn trong i đồ vật (1, , i) với trọng lượng tối đa L
Lập công thức truy hồi
Nếu loại đồ vật i không được chọn, thì:
F(i, L) = F(i-1, L) Nếu có k đồ vật loại i được chọn: (1 <= k <= L/w[i])
F(i, L) = F(i-1, L – w[i]*k) + v[i]*k
Do đó:
Trang 7F(i, L) = max{F(i-1, L – w[i]*k) + v[i]*k | k thuộc [0, L/w[i]]}
Ký hiệu s(i, L), i=1 n, L=1 M, là giá trị k thuộc [0, L/w[i]] làm cho biểu
n
- Điền giá trị đầu: F(i, L)
Trang 8- Sử dụng công thức truy hồi tính toán F(i,L), s(i,L) theo thứ tự i=1,2,…,n
Truy vết tìm phương án tối ưu
Bắt đầu từ ô s(n, M) trên dòng n ta dò ngược về
– Loại đồ vật i không được chọn,
– Truy tiếp ô s(i-1, L)
Trang 10Truy ngược lên ô s(4-1,13-5*2) = s(3,3) = 0, ta có x3 = 0
Truy ngược lên ô s(3-1,3) = s(2,3) = 0, ta có x2 = 0
Truy ngược lên ô s(2-1,3) = s(1,3) = 1, ta có x1 = 1
Đến đây ta nhận được phương án tối ưu:
(1, 0, 0, 5, 0) với trị tối ưu F(5,13) = 19
if (F[i, L] < F[i-1, L - w[i]*k] + v[i]*k)
{ F[i, L] = F[i-1, L - w[i]*k] + v[i]*k;
s[i, L] = k;
} }
Trang 113 Bài toán dãy con chung lớn nhất
Cho X = x1, x2, …, xm và Y = y1, y2, …, yn Hãy tìm dãy con chung lớn nhất Z của X và Y, ký hiệu LCS(X,Y)
Ví dụ
Lập công thức truy hồi
- Xác định tham số
Bài toán con có 2 tham số (i, j) là các tiền tố x1, x2, …, xi, với i ≤ m và y1, y2,
…, yj, với j ≤ n của 2 dãy X và Y Có thể phát biểu lại bài toán như sau: Hãy tìm dãy con chung dài nhất của 2 dãy x1, x2, …, xi và y1, y2, …, yj - Công thức
+ Với bài toán con (1, 1) nếu x1 = y1 thì độ dài dãy Z là 1, ngược lại là 0
+ Với bài toán con (i, j) thì:
Nếu xi = yj, thì độ dài dãy Z sẽ là độ dài dãy con chung dài nhất thu được
từ bài toán con (i – 1, j -1) thêm một phần tử chung nữa
Nếu xi ≠ yj, thì độ dài dãy Z, hoặc là độ dài dãy con chung dài nhất thu
được từ bài toán con (i – 1, j) hoặc là từ bài toán con (i, j - 1), dãy nào dài hơn
Trang 12thì ch ọ
Trang 14- Sử dụng công thức truy hồi tính toán f(i,j) theo thứ tự dòng i=1,2,…,m
Truy vết tìm phương án tối ưu
Gọi x[1 m], y[1 n] là 2 dãy đầu vào
Bắt đầu từ ô [m,n] trên dòng m ta dò ngược về dòng 0 hoặc cột 0 theo
nguyên tắc:
Nếu x[i] = y[j], thì phần tử x[i] được chọn, ta truy tiếp ô [i-1,j-1]
Ngược lại, tức x[i]0= y[j], nếu f(i,j) = f(i-1,j), thì truy đến ô [i-1,j], ngược lại, thì truy đến ô [i,j-1]
Trang 17Các phần tử được chọn là: x[7]=y[6]=A, x[4]=y[5]=B, x[3]=y[3]=C,
x[2]=y[1]=B Dãy con chung dài nhất là BCBA với độ dài tối ưu f(7,6)=4
Trang 18 Thủ tục truy vết tìm lời giải
void tracking(int m,int n)
4 Bài toán đổi tiền
Cho số tiền S, và n loại tiền với các mệnh giá a[1], a[2],…, a[n], hãy tìm
phương án đổi số tiền S sao cho số tờ tiền dùng ít nhất
Ví dụ: n = 3, S = 13
Số tờ tiền ít nhất là 4: 1 tờ loại 1, 1 tờ loại 2 và 2 tờ loại 3
Lập công thức truy hồi
Trang 19- Xác định tham số
Gọi t[i] là số tờ tiền cần dùng ít nhất để đổi số tiền i Vậy kết quả bài toán cần tìm là t[S]
Bài toán con t[i] có 1 tham số i = 1, …, S
Công thức truy hồi
Ta lập công thức tính t[i] theo các giá trị trước nó
Giả sử i >= a[k] và chọn tờ tiền a[k] để đổi Khi đó, rõ ràng là
t[i] <= t[i-a[k]]+1
Suy ra
t[i] = 1 + min{t[i -a[k]] | k=1, …, n & i >=a[k]}
- Giá trị đầu: Hiển nhiên t[0] = 0
Ngoài ra, nếu không đổi được số tiền i, thì t[i] = vô cùng
- Sử dụng công thức truy hồi tính toán t[i] và u[i] theo thứ tự i=1,2,…,S
• Truy vết tìm phương án tối ưu
Trang 20Bắt đầu từ ô u[S] ta dò ngược về u[0] theo nguyên tắc:
Nếu u[i] = k, thì tờ tiền a[k] được chọn, ta truy tiếp ô u[ia[k]]
Truy vết tìm phương án tối ưu
Kết quả: Số tờ tiền ít nhất là t[13] = 4: 1 tờ loại 1, 1 tờ loại 2 và 2 tờ loại 3
Trang 21for(i=1 ; i<=S ; i++)
{t[i] = +vôcug ; u[i] = 0 ;}
//t[i] = 1 + min{t[i-a[k]] | k=1, …, n & i>=a[k]}
for(i=1 ; i<=S ; i++ )
for(k=1 ;k<=n ;k++)
if ((i >= a[k]) && (1+t[i-a[k]) < t[i]))
{t[i] = 1+t[i-a[k] ; u[i] = k ;} }