Trong phương pháp quy hoạch động, nguyên lý này càng được thể hiện rõ: Khi không biết cần phải giải quyết những bài toán con nào, ta sẽ đi giải quyết tất cả các bài toán con và lưu trữ n[r]
Trang 1TRƯỜNG ĐẠI HỌC KHOA HỌC HUẾ
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP MÔN: PHÂN TÍCH THIẾT KẾ THUẬT TOÁN
LỚP: KHMT_PY 2016-2018
Nhóm 3:
1 Phan Phú Bình
2 Đào Hà An Duyên
3 Lê Trọng Đãi (nhóm trưởng)
4 Nguyễn Ngọc Thiện
Trang 2PHẦN I: Tìm hiểu về quy hoạch động
Trong thực tế, ta thường bắt gặp những bài toán yêu cầu kết quả tốt nhất (bài toán tối ưu) Phương pháp quy hoạch động dùng để giải bài toán tối ưu có bản chất đệ quy, tức là việc tìm phương án tối ưu cho bài toán đó có thể đưa về tìm phương án tối ưu của một số hữu hạn các bài toán con Đối với nhiều thuật toán đệ quy, nguyên lý chia để trị (divide and conquer) thường đóng vai trò chủ đạo trong việc thiết kế thuật toán: Để giải quyết một bài toán lớn, ta chia nó làm nhiều bài toán con cùng dạng với nó để có thể giải quyết độc lập Trong phương pháp quy hoạch động, nguyên lý này càng được thể hiện rõ: Khi không biết cần phải giải quyết những bài toán con nào, ta sẽ đi giải quyết tất cả các bài toán con
và lưu trữ những lời giải hay đáp số của chúng với mục đích sử dụng lại theo một sự phối hợp nào đó để giải quyết những bài toán tổng quát hơn
1 Nội dung phương pháp quy hoạch động:
Quy hoạch động bắt đầu từ việc giải tất cả các bài toán nhỏ nhất (bài toán cơ sở)
để từ đó từng bước giải quyết những bài toán lớn hơn, cho tới khi giải được bài toán lớn nhất (bài toán ban đầu)
2 Các khái niệm:
* Bài toán giải theo phương pháp quy hoạch động gọi là bài toán quy hoạch động;
* Công thức phối hợp nghiệm của các bài toán con để có nghiệm của bài toán lớn gọi là công thức truy hồi của quy hoạch động;
* Tập các bài toán nhỏ nhất có ngay lời giải để từ đó giải quyết các bài toán lớn hơn gọi là cơ sở quy hoạch động;
* Không gian lưu trữ lời giải các bài toán con để tìm cách phối hợp chúng gọi là bảng phương án của quy hoạch động;
Để hiểu rõ hơn về các khái niệm, ta đi tìm hiểu 1 ví dụ rất đơn giản sau:
Ví dụ: Dãy Fibonacci là dãy số nguyên dương được định nghĩa như sau:
F[1] = F[2] = 1;
∀ i: 3 ≤ i: F = F[i-1] + F[i-2]
Hãy tính F[6]
Lời giải bằng phương pháp QHĐ:
program Fibonacci;
var
F: array[1 6] of Integer;
i: Integer;
begin
F[1] := 1; F[2] := 1;
for i := 3 to 6 do
F[i] := F[i - 1] + F[i - 2];
Trang 3end
Trong ví dụ trên: tính F[6] là bài toán lớn, các bài toán con là tính F[1] đến F[5]; F[1] và F[2] là cơ sở quy hoạch động, chúng đã có sẵn kết quả nên ta không cần đi tính; mảng F lưu trữ các kết quả là bản phương án; công thức F := F[i - 1] + F[i - 2] là công thức truy hồi;
3 Các bước cài đặt một chương trình sử dụng quy hoạch động:
* Giải tất cả các bài toán cơ sở (thông thường rất dễ), lưu các lời giải vào bảng phương án;
* Dùng công thức truy hồi phối hợp những lời giải của những bài toán nhỏ đã lưu trong bảng phương án để tìm lời giải của những bài toán lớn hơn và lưu chúng vào bảng phương án Cho tới khi bài toán ban đầu tìm được lời giải
* Dựa vào bảng phương án, truy vết tìm ra nghiệm tối ưu;
Chú ý: Cho đến nay, vẫn chưa có một định lý nào cho biết một cách chính xác những bài toán nào có thể giải quyết hiệu quả bằng quy hoạch động Tuy nhiên để biết được bài toán có thể giải bằng quy hoạch động hay không, ta có thể tự đặt câu hỏi: "Một nghiệm tối ưu của bài toán lớn có phải là sự phối hợp các nghiệm tối ưu của các bài toán con hay không ?" và ”liệu có thể nào lưu trữ được nghiệm các bài toán con dưới một hình thức nào đó để phối hợp tìm được nghiệm bài toán lớn"
PHẦN II: Xây dựng và cài đặt bài toán bằng quy hoạch động
BÀI TẬP: Bài toán tìm độ dài xâu trong chung cực đại của 2 xâu cho trước.
1 Nêu bài ý nghĩa bài toán:
a Bài toán xâu trong cực đại, gọi S là xâu trong của X nếu S nhận được bằng cách xóa đi một số ký từ nào đó Ví dụ: xâu 'ABC' là xâu trong của 'GAHEBOOC' bằng cách xóa đi các ký tự GHEOO của xâu 'GAHEBOOC'
b Bài toán thực hiện: Cho 2 xâu X và Y Tìm một xâu U là xâu trong chung của X và Y có độ dài cực đại
Ví dụ: X='ABCDAE' và Y='XYACADK' có xâu 'ACD' là xâu trong với
đội dài cực đại.
Ví dụ: X='ABC' và Y='ACB' có xâu 'AB' là xâu trong với đội dài cực đại.
Ta có thông tin vào và thông tin ra của bài toán:
+Input: Hai xâu X, Y
+Output: U là xâu trong chung cực đại của (X,Y)
Trang 42 Phương pháp thực hiện giải bài toán:
Sử dụng phương pháp quy hoạch động với 4 bước cụ thể như sau:
Bước 1: Phân tích bài toán
-Gọi P(r, s) là bài toán xâu trong chung cực đại, với:
Xâu X= ' X1, X2, , Xm' (với m = Length(X));
Xâu Y= ' Y1, Y2, , Yn' (với n = Length(X));
(Bài toán ban đầu là P(m, n)
-Gọi F(r, s) độ dài xâu trong chung cực đại với:
r: Độ dài xâu X tính từ ký tự đầu tiên (r m)
s: Độ dài xâu Y tính từ ký tự đầu tiên (s n)
- Các gía trị cần tìm :
F(r, s) độ dài xâu trong chung cực đại của bài toán P(r,s)
U là xâu con chung cực đại của bài toán P(r,s)
Bước 2: Giải pháp đệ quy.
+trường hợp chung:
X= ' X1, X2, Xr , Xm' (với m = Length(X));
r
Y= ' Y1, Y2, Ys , Yn' (với n = Length(X));
s
- Khi (r>0) và (s>0) và (Xr <> Ys)
Thì F(r,s) = Max (F(r-1, s), F(r, s-1)) -Khi (r>0) và (s>0) và (Xr = Ys)
Thì F(r,s) = 1+ F(r-1, s-1) +Trường hợp suy biến
-Khi (r=0) hoặc (s=0)
Thì F(r,s) = 0 {một trong 2 xâu cho là rỗng thì độ dài xâu trong chung cực đại bằng 0, U=''}
Bước 3: Lập bảng
Nhận xét:
- Ta nhận thấy nếu Xr = Ys lúc xâu con chung cực đại U của X và y có thể tính bằng xâu con chung cực đại U của Xr-1 và Ys-1 đồng thời nối Xr vào cuối, tức là U=U + Xr
- Nếu X<>Y, lúc này chi U1 là độ dài xâu chung cực đại của Xr-1 và Ys , và U2 là độ dài xâu chung cực đại của Xr và Ys-1 vậy U sẽ là giá trị lớn nhất trong 2 giá trị U1 và U2
F[r,s]
Max(F[r-1,s], F[r,s-1] Nếu Xr <> Ys
Trang 5-Độ phức tạp thuật toán là O(m*n)
Ví dụ: Xâu 'ABC' và 'ACB' có xâu con dài nhất là AB và AC
PROCEDURE LapBang;
Begin
For s:=0 To n Do
if (r=0) or (s=0) then
begin
F[r,s]:=0; u:='';
end
Else
If X[r] = Y[s] Then
Begin
F[r,s]:=F[r-1,s-1]+1; u:=X[r];
end
Else
F[r,s]:=Max(F[r-1,s], F[r,s-1]
End;
Bước 4: Tổng hợp kết quả
Để tìm xâu kết quả U: ta đi ngực từ ô F[m,n] hướng về ô F[0,0]
-Nếu Xr = Ys thì đặt Xr hoặc Ys vào bên trái dãy U (ở đầu xâu) và về ô F[r-1, s-1]
-Nếu Xr <> Ys thì
+ lùi về F[r-1,s] trong trường hợp F[r-1,s] > F[r,s-1], ngược lại + lùi về F[r,s-1] trong trường hợp F[r-1,s] < F[r,s-1],
PROCEDURE Tonghop;
var r,s:integer;
Begin
u:=''; r:= m; s:= n;
While (r>0) And (s>0) Do
Begin
If X[r] = Y[s] Then
Begin
u:= X[r]+u;
r:=r-1;
s:=s-1;
End
Else
If F[r-1,s] < F[r,s-1] then
s:=s-1
Else
A B C
A 0 A 0 0
C 0 0 0 C
B 0 0 B 0
Trang 6End;
Writeln(f,'do dai xau trong chung cuc dai la:', length(U));
Writeln(f,'xau trong chung cuc dai la:', U);
Close(f);
End;
Độ phức tạp O(max(m,n))
3 Cài đặt thuật toán
Bài toán này nhóm thống nhất cài đặt thuật toán gồm 5 phần được mô tả như sau:
Khai báo tên chương trình: Program XauconCD;
Khai báo:
2 xâu dữ liệu vào X, Y và xâu U là xâu trong chung cực đại Khai báo mảng 2 chiều F: là độ dài xâu trong chung cực đại 2 biến m, n là độ dài của xâu X, Y
a Dùng thủ tục nhập dữ liệu:
.Khai báo biến tệp f nhận từ tập tin đầu vào xaucon.inp;
.Đọc xâu X, Y từ tệp dữ liệu vào f;
.gán 2 biến m, n cho độ dài xâu X, Y;
b Dùng thủ tục Lập bảng
c Dùng thủ tục Tổng hợp
d Dùng thủ tục xuất tệp kết quả
.Khai báo biến tệp f cần gán cho tệp xaucon.out Đọc tệp f và xuất kết quả: dòng đầu tiên độ dài xâu trong chung cực đại; dòng thứ hai là xâu trong chung cực đại
e Chương trình chính gọi các thủ tục
Cài đặt
Program XauconCD;
Var X,Y,U: String;
F:Array [0 100,0 100] of Integer;
Trang 7m, n: integer;
PROCEDURE NhapDL;
Var f:Text;
Begin
assign(f,'xaucon.inp');
reset(f);
readln(f,X);
readln(f,Y);
close(f);
m:=length(X);
n:=length(Y);
End;
PROCEDURE LapBang;
Var r,s:Integer;
Begin
For r:=0 To m Do
For s:=0 To n Do
if (r=0) or (s=0) then
begin
F[r,s]:=0; u:='';
end
Else
If X[r] = Y[s] Then
Begin
F[r,s]:=F[r-1,s-1]+1; u:=X[r]; end
Else
If F[r-1,s] > F[r,s-1] then begin
F[r,s]:=F[r-1, s];
end
else
begin
F[r,s]:=F[r, s-1];
end;
End;
PROCEDURE Tonghop;
var r,s:integer;
Begin
u:=''; r:= m; s:= n;
While (r>0) And (s>0) Do Begin
Trang 8If X[r] = Y[s] Then
Begin
u:= X[r]+u;
r:=r-1;
s:=s-1;
End
Else
If F[r-1,s] < F[r,s-1] then
Else
r:=r-1;
End;
End;
PROCEDURE XuatFile;
Var f:Text;
Begin
assign(f,'xaucon.out');
rewrite(f);
writeln(f,length(u));
write(f,u);
close(f);
End;
BEGIN
NhapDL;
LapBang;
Tonghop;
XuatFile;
END
-Các bộ Test
Test 1
Xaucon.inp Xaucon.out
ABCDAE
XYACADK
3 ACD
Trang 9Test 2
Xaucon.inp Xaucon.out
ABC
ACB
2 AB
Test 3
Xaucon.inp Xaucon.out
MONZPLQCW
AMOPHQBOOBWH
5 MOPQW