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.. 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 g
Trang 1MÔ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
Hà Nội, 28 tháng 5 năm 2014
Trang 2GIỚ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
Trang 3Mục Lục
Giới thiệu 1
1 Quy hoạch động 3
2 Bài toán cái ba lô - không giới hạn: unbounded knapsack problem 4
3 Giải quyết bài toán 6
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 6 3.2 Bảng phương án 9
3.3 Truy vết 10
3.4 Cài đặt 11
4 Đánh giá độ phức tạp: 12
Trang 41 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
Trang 5+ 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ó 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:
Trang 6 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ụ:
Trang 7InputData: 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
Trang 8Gọ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
Trang 9Mỗ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:
Trang 10Bướ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ể:
Trang 11Bả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]
Trang 123.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;
}
Trang 134 Đá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)