KHOA CÔNG NGHỆ THÔNG TIN
MÔN: PHÂN TÍCH ĐÁNH GIÁ THUẬT TOÁN
BÀI TẬP LỚN
ĐỀ TÀI: Phương pháp quy hoạch động. Giải bài toán ba lô không hạn chế:
cho n loại đồ vật có khối lượng w1, ..., wn và có giá trị v1, ..,vn. Xếp đồ vật vào
ba lô có sức chứ T sao cho tổng giá trị lớn nhất. Giả thiết T, wi, vi, i=1,..,n, đều
là các số nguyên dương.
Giáo viên hướng dẫn
: Đào Thanh Tĩnh
Sinh viên thực hiện
: Lê Hoàng Phương - 13870819
Lớp
: HTTT3 - K25B
Hà Nội, 28 tháng 5 năm 2014
Bài toán ba lô không giới hạn
GIỚI THIỆU
Bài toán xếp ba lô (còn có tên gọi là bài toán cái túi) 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ể nhét
vừa vào trong một cái ba lô(với giới hạn khối lượng) để mang theo trong một
chuyến đi. Sao cho tổng giá trị đồ vật trong túi mang theo được là lớn nhất.
Quy hoạch động thực chất là một phương pháp cải tiến hơn của phương pháp
giải quyết vấn đề theo hướng phân rã. Cả 2 đều dựa trên nguyên lý "chia để trị".
Nghĩa là ta chia bài toán ban đầu thành các bài toán nhỏ hơn và cứ như vậy cho
đến khi các bài toán đủ nhỏ để có thể tìm ra nghiệm.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ầyNguyễn Đức Nghĩa đã giúp đỡ chúng em thực hiện
bài tập này.
Hà Nội tháng 05 năm 2014
12/13
Bài toán ba lô không giới hạn
Mục Lục
12/13
Bài toán ba lô không giới hạn
1. Quy hoạch động
Giải quyết các bài toán bằng cách kết hợp các giải pháp của các bài toán con.
Điểm khác biệt là một thuật toán quy hoạch động giải quyết tất cả các bài toán
con đúng một lần và sau đó ghi kết quả của chúng trong một bảng, như vậy
tránh được việc phải tính lại các kết quả khi bài toán con được gặp lại.
Nguyên lý tối ưu Bellman
- Quy hoạch động là quá trình điểu khiển tối ưu với trạng thái bắt đầu. Mọi trạng
thái A bất kỳ thuộc quá trình này cũng tối ưu.
- Tư tưởng chính: Thực hiện các bài toán con trước, sử dụng các kết quả này để
giải bài toán lớn
- Hướng tiếp cận:
+ Giải bài toán theo công thức truy hồi
+ Giải các bài toán con trước
+ Dựa vào bài toán con để giải bài toán lớn hơn cho đến khi gặp bài toán
cần giải
- Tổng quát:
+ Giải bài toán qua N bước
+ Giải bài toán sao cho tổng chi phí 1 -> N-1 và từ N-1 -> N là tối ưu
Thuật toán quy hoạch động
Bước 1: Xây dựng công thức truy hồi
Giả sử: Chia bài toán thành N giai đoạn 1->N
Xác định F(1) - cơ sở quy nạp
- Gọi (i) là hàm số xác định giá trị tối ưu, tính đến giá trị thứ i
-> F(n) là nghiệm của bài toán
- Đối với bài toán
+ Tìm Min: F(N) = Min{F(i), F(j)}
i = 1, N-1
j = N-1, N
12/13
Bài toán ba lô không giới hạn
+ Tìm Max: F(N) = Max{F(i), F(j)}
i = 1, N-1
j = N-1, N
Bước 2: Tìm cơ sở quy hoạch động
Để chia bài toán lớn thành các bài toán con có cùng một cách giải thì phải
yêu cầu phải biến đổi một số bài toán con ở trường hợp cơ sở quy nạp
bằng cách thêm biến phụ, chính là cơ sở quy hoạch động
Bước 3: Lấp đầy bảng phương án, dựa vào cơ sở quy hoạch động, công thức
quy
hoạch động Giải bài toán
Bước 4: Truy vết
Tìm nghiệm của bài toán
2. Bài toán cái ba lô - không giới hạn: unbounded knapsack problem
•
Có N đồ vật như sau:
...
•
•
Đồ vật thứ i có cân nặng: Wi
•
Đồ vật thứ i có giá trị là: Vi
Không giới hạn:
Có đủ – cung ứng đủ đồ vật của từng loại khác nhau trong N
đồ vật trên.
•
Có 1 ba lô với sức chứa T:
12/13
Bài toán ba lô không giới hạn
•
Vấn đề:
Xếp đồ vật vào ba lô có sức chứ T sao cho tổng giá trị lớn
nhất. Giả thiết T, wi, vi, i=1,..,n, đều là các số nguyên
dương.
Giải quyết bài toán trong trường hợp sau: Mỗi vật được chọn nhiều lần (không
hạn chế số lần)
Ví dụ:
12/13
Bài toán ba lô không giới hạn
InputData: file văn bản Bag.inp
Dòng 1: n, T cách nhau ít nhất một dấu cách
n dòng tiếp theo: Mỗi dòng gồm 2 số Wi, Vi, là chi phí và giá trị đồ vật
thứ i.
OutputData: file văn bản bag.out: Ghi giá trị lớn nhất tên trộm có thể lấy
Example
3. Giải quyết bài toán
3.1. Ý tưởng tiếp cận bài toán ba lô–không giới hạn bằng quy hoạch động
Phân chia bài toán về các vấn đề nhỏ hơn. Ta nhận thấy rằng:
Giá trị của cái ba lô phụ thuộc vào 2 yếu tố: Có bao nhiêu vật đang được xét
và trọng lượng còn lại cái ba lô có thể chứa được, do vậy chúng ta có 2 đại
lượng biến thiên. Cho nên hàm mục tiêu sẽ phụ thuộc vào hai đại lượng biến
thiên. Do vậy bảng phương án của chúng ta sẽ là bảng 2 chiều.
12/13
Bài toán ba lô không giới hạn
Gọi F[i,j] là tổng giá trị lớn nhất của cái ba lô khi xét từ vật 1 đến vật i và
trọng của cái ba lô chưa vượt quá j. Với giới hạn j, việc chọn tối ưu trong số các
vật {1,2,…,i-1,i} để có giá trị lớn nhất sẽ có hai khả năng:
- Nếu không chọn vật thứ i thì F[i,j] là giá trị lớn nhất có thể chọn trong số
các vật {1,2,…,i-1} với giới hạn trọng lượng là j, tức là:
F[i,j] := F[i-1,j]
- Nếu có chọn vật thứ i (phải thỏa điều kiện W[i] ≤ j) thì F[i,j] bằng giá trị
vật thứ i là V[i] cộng với giá trị lớn nhất có thể có được bằng cách chọn
trong số các vật {1,2,…,i} (vì vật i vẫn có thể được chọn tiếp) với giới
hạn trọng lượng j-W[i] tức là về mặt giá trị thu được:
F[i,j] := V[i]+F[i,j-W[i]]
Do vậy chúng ta có công thức truy hồi như sau:
F[0,j] = 0 (hiển nhiên) – Bài toán con nhỏ nhất.
F[i,j] = max(F[i-1,j], V[i]+F[i,j-W[i]]
Với giải pháp giải quyết bài toán ba lô – không giới hạn là giải quyết các bài
toán nhỏ hơn:
Sơ đồ:
Bước chia: tạo nên 1 vấn đề nhỏ được giải quyết và có thể hỗ trợ giải quyết bài
toán gốc.
12/13
Bài toán ba lô không giới hạn
Mỗi 1 bài toán con giải quyết sẽ quay trở lại hỗ trợ giải quyết bài toán gốc:
12/13
Bài toán ba lô không giới hạn
Bước lấp đầy các phương án và Truy vết:
Ta nhận thấy: sẽ có k >= 1 đồ vật được sắp xếp vào bao lô nếu T >= Wi
Định nghĩa:
M(v[], w[], T) = là giá trị lớn nhất của: v1×x1 + v2×x2 + ... + vN×xN
subject to: w1×x1 + w2×x2 + ... + wN×xN ≤ T
Tường hợp cơ sở của bài toán ba lô – không giới hạn:
Khi Ba lô đầy, không thể sắp xếp bất kỳ 1 vật nào vào túi. Bởi vì, tổng giá
trị của ba lô lúc đó = 0. Hay: M(v, w, 0) = 0; (Không thể sắp xếp bất kỳ thứ gì
vào túi ba lô không có sứ chứa).
3.2. Bảng phương án
Ta xây dựng bảng phương án dựa trên công thức truy hồi trên. Để kiểm tra kết
quả có chính xác hay không (nếu không chính xác chúng ta xây dựng lại hàm
mục tiêu). Thông qua cách xây dựng hàm mục tiêu và bảng phương án chúng ta
sẽ định hướng việc truy vết.
Ví dụ giải quyết bài toán cụ thể:
12/13
Bài toán ba lô không giới hạn
Bảng phương án:
Chúng ta có thể chọn vật 4 (3 lần) và vật 5 (3 lần).
3.3. Truy vết
Trường hợp 1: Trong bảng phương án F[n,T] chính là giá trị lớn nhất thu được
khi chọn trong cả n vật với giới hạn trọng lượng là M.
Nếu f[n,T]=f[n-1,T] thì tức là không chọn vật thứ n, ta truy về f[n-1,T]. Còn nếu
f[n,T]≠f[n-1,T] thì ta thông báo rằng phép chọn tối ưu có chọn vật thứ n và truy
về f[n-1,T-Wn].
Trường hợp 2: Trong bảng phương án F[n,T] chính là giá trị lớn nhất thu được
khi chọn trong cả n vật với giới hạn trọng lượng là M.
Nếu f[n,T]=f[n-1,T] thì tức là không chọn vật thứ n, ta truy về f[n-1,T]. Còn nếu
f[n,T] ≠ f[n-1,T] thì ta thông báo rằng phép chọn tối ưu có chọn vật thứ n và truy
về f[n,T-Wn].
12/13
Bài toán ba lô không giới hạn
3.4. Cài đặt
M( v[], w[], C )
{
int[] sol, mySol, myFinalSol;
/* ==============================================
Chia nhỏ bài toán để giải quyết
============================================== */
/* ---------------------------------------------Giải quyết những bài toán nhỏ dễ giải quyết hơn
---------------------------------------------- */
for ( i = 1; i ≤ N; i++ )
{
if ( C ≥ w[i] )
sol[i] = M( v, w, C-w[i] );
// Sức chứa ba lô giảm w[i] vì đồ vật thứ i được xếp ở trong túi
else
sol[i] = 0;
// không đủ chứa vật thứ i
}
/* ----------------------------------------------------------------Sử dụng giải pháp của các bài toản nhỏ để giải quyết bài toán gốc
-------------------------------------------------------------- */
for ( i = 1; i ≤ N; i++ )
{
if ( C ≥ w[i] )
mySol[i] = sol[i] + v[i];
// Giá trị cân nặng ba lô tăng thêm v[i]vì đồ vật thứ I được xếp trong túi
else
mySol[i] = 0;
// không đủ chứa vật thứ i
}
/* *************************
Tìm giá trị tốt nhất (maximum)
************************* */
myFinalSol = mySol[1];
for ( i = 2; i ≤ N; i++ )
if ( mySol[i] > myFinalSol )
myFinalSol = mySol[i];
}
return myFinalSol;
12/13
Bài toán ba lô không giới hạn
4. Đánh giá độ phức tạp:
Các vòng lặp chính của giải thuật là:
for ( C = 1; C <= T; C++ )
{
for ( i = 0; i < v.length; i++ )
{
....
}
}
// T = sức chứa của túi
// v.length = số lượng đồ vật = N
Vì thế:
Thời gian chạy = O(T*N)
12/13