1. Trang chủ
  2. » Giáo án - Bài giảng

Tiểu luận môn phân tích và đánh giá thuật toán phương pháp quy hoạch động

16 323 6

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 223 KB

Nội dung

MỞ ĐẦU Thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ thị hay phương cách được định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng thái ban

Trang 1

MỤC LỤC

MỞ ĐẦU 2

PHẦN 1: PHÂN TÍCH BÀI TOÁN 3

1 Đề bài 3

2 Phân tích 3

a Dữ liệu đầu vào và đầu ra (input, output) 3

b Vị trí tương đối của 2 đoạn thẳng 3

PHẦN 2: GIẢI QUYẾT BÀI TOÁN 5

1 PHƯƠNG PHÁP VÉT CẠN 5

1.1 Ý tưởng: 5

1.2 Thuật toán 5

1.3.Đánh giá: 6

2 PHƯƠNG PHÁP QUY HOẠCH ĐỘNG 7

2.1 Tư tưởng quy hoạch động 7

2.2 Phân tích bài toán 7

2.3 Thuật toán: 8

2.4 Xét ví dụ cụ thể: 9

2.5 Cụ thể giải thuật: 10

2.6 Đánh giá độ phức tạp theo phương pháp quy hoạch động: 12

2.7 Test thử các bộ dữ liệu khác nhau: 13

a.Dữ liệu chỉ có 1 đoạn thẳng 13

b.Dữ liệu có nhiều đoạn thẳng có điểm chung 13

c.Dữ liệu gồm các đoạn thẳng rời nhau 14

d.Dữ liệu gồm các đoạn thẳng bao nhau nhiều 14

KẾT LUẬN 15

TÀI LIỆU THAM KHẢO 16

Trang 2

MỞ ĐẦU

Thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ thị hay phương cách được định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng thái ban đầu cho trước; khi các chỉ thị này được áp dụng triệt để thì sẽ dẫn đến kết quả sau cùng như đã dự đoán Nói cách khác, thuật toán là một bộ các quy tắc hay quy trình cụ thể nhằm giải quyết một vấn đề trong một số bước hữu hạn, hoặc nhằm cung cấp một kết quả từ một tập hợp của các dữ kiện đưa vào

Phân tích và thiết kế thuật toán là một lĩnh vực quan trọng của khoa học máy tính Quá trình phân tích thuật toán sẽ giúp ta hiểu sâu sắc được mục đích, yêu cầu mà thuật toán cần xây dựng, qua đó có thể tiên liệu được các tài nguyên

mà thuật toán yêu cầu như: tài nguyên bộ nhớ, băng thông, hoặc các tài nguyên ngoại vi… Song phần chính thời gian tính toán mới là yếu tố quan trọng mà ta cần quan tâm và đánh giá khi thuật toán thực hiện

Trong bài viết tiểu luận này trình bày về phương pháp vét cạn, và quy hoạch động, áp dụng cho bài toán tính tổng độ dài của các đoạn thẳng là lớn nhất sao cho đôi một không có điểm chung

Trong quá trình trình bày không tránh khỏi những thiếu sót, rất mong nhận được sự đóng góp ý kiến quý báu của Thầy giáo và các bạn

Em xin trân thành cảm ơn Thầy giáo Đào Thanh Tĩnh, đã tạo điều kiện thuận lợi để em hoàn thành bài tập này

Trang 3

PHẦN 1: PHÂN TÍCH BÀI TOÁN

1 Đề bài

Mỗi đoạn thẳng trên trục Ox được mô tả bới hai giá trị [a, b] Kí

chung mà có tổng độ dài các đoạn thẳng là lớn nhất.

2 Phân tích

a Dữ liệu đầu vào và đầu ra (input, output)

- Dữ liệu đầu vào (Input): Đầu vào là tập S gồm n đoạn thẳng trên trục Ox được mô tả bởi 2 giá trị a,b; a là điểm đầu, b là điểm cuối của đoạn thẳng

- Dữ liệu đầu ra (Output): Tập kết quả S* chứa các đoạn thẳng trong đó với hai đoạn thẳng Si, Sj bất kỳ trong tập S* không có điểm chung và có tổng độ dài các đoạn thẳng là lớn nhất

* Nhận xét:

- Mỗi đoạn thẳng nếu có xuất hiện, chỉ xuất hiện một lần trong S*

- Trong tập S*, các đoạn thẳng phải đôi một không có điểm chung

- Số lượng các đoạn thẳng trong kết quả trả về không quan trọng mà quan trọng là tổng độ dài là lớn nhất

Như vậy chúng ta quan tâm đến hai yếu tố: Là các đoạn thẳng có điểm chung hay không, và tổng độ dài các đoạn thẳng không có điểm chung đó

b Vị trí tương đối của 2 đoạn thẳng

Với 2 đoạn thẳng bất kỳ trên trục Ox, để đơn giản ta sắp xếp chúng theo chiều tăng của bi, giả sử có 2 đoạn thẳng [a i ,b i ] và [a j ,b j ] với b i <=b j ta có các vị trí tương đối như sau:

TH1 : Hai đoạn thẳng có điểm chung khi

Trang 4

Như vậy ta quy ước: nếu a j =b i thì coi như 2 đoạn thẳng đó có 1

điểm chung, tức là trong trường hợp này không thoã mãn yêu cầu bài toán

TH2: Hai đoạn thẳng không có điểm chung khi

- a j >b i

Trang 5

PHẦN 2: GIẢI QUYẾT BÀI TOÁN

Với dữ liệu bài toán đã cho, số luợng các đoạn thẳng là hữu hạn, ta hoàn toàn tính được tất cả các tập S* (các tập chứa các đoạn thẳng trong S không có điểm chung) có thể có và tìm ra được tập tập S* có tổng độ dài các đoạn thẳng là lớn nhất

1 PHƯƠNG PHÁP VÉT CẠN

1.1 Ý tưởng

Quy ước xâu ký tự chứa n bít 0,1 tương ứng với n đoạn thẳng Bít thứ

i ứng với đoạn thẳng thứ i, là bít 0 nếu đoạn thẳng i không được chọn vào tập S*, là bít 1 nếu đoạn thẳng i được chọn vào tập S*

Xét với từng xâu ký tự:

- Nếu tồn tại một cặp bít i, j làm cho đoạn thẳng thứ i và thứ j có điểm chung thì phương án này không được chọn

- Ngược lại với mọi đoạn thẳng thứ i và thứ j bất kỳ không có điểm chung ta sẽ đưa vào tập phương án được chọn

Trong các tập phương án được chọn phương án nào có tổng độ dài của các đoạn thẳng lớn nhất là kết quả ta cần tìm

1.2 Thuật toán

Ta ký hiệu di là độ dài đoạn thẳng [ai, bi],

Ta gọi các xâu Ui (nhị phân có độ dài n) là phương án thứ i chọn các đoạn thẳng trong tập n đoạn thẳng

- Bước 1 Sắp xếp các đoạn thẳng Si theo chiều tăng dần của ai

- Bước 2: Tìm các phương án Ui thoã mãn đièu kiện thứ nhất đôi một các đoạn thẳng không có điểm chung

- Bước 3 Tính độ dài tổng Ti các đoạn thẳng được chọn với mỗi phương án Ui được chọn ở bước 2 Nếu xâu Ui không được chọn ở bước 2 thì Ti = 0

- Bước 4 Tìm giá trị lớn nhất trong tập Ti, Tk = max {Ti, i=0, 1, 2n-1}

- Bước 5 Khi đó ứng với các đoạn thẳng được chọn trong phương án thứ k tương ứng với giá trị max chính là kết quả cần tìm kiếm (Các đoạn thẳng được chọn là những đoạn thẳng mà các bít tương ứng trong Tk bằng 1, tổng độ dài lớn nhất có được là Tk)

Trang 6

1.3.Đánh giá

- Ưu điểm:

o Phương án này dễ thực hiện

o Bài toán chuyển thành 2 bài toán con:

 bài toán tìm xâu Ui thoã mãn yêu cầu bài toán Với bài toán này cần xét đôi một các đoạn thẳng có điểm chung hay không

 bài toán tìm max của n phần tử, đây là bài toán đơn giản

- Nhược điểm:

o Tổng số các trường hợp phải xét là rất lớn Với xâu nhị phân có

độ dài n ta phải xét 2n-1 trường hợp (Trừ trường hợp tất cả các bít bằng 0) Thuật toán có độ phức tạp tính toán lớn cỡ hàm mũ O(2n)

Trang 7

2 PHƯƠNG PHÁP QUY HOẠCH ĐỘNG

2.1 Tư tưởng

Quy hoạch động là kỹ thuật thiết kế bottom-up (từ dưới lên) Kỹ thuật này được bắt đầu với những trường hợp con nhỏ nhất (thường là đơn giải nhất và giải được ngay) Bằng cách tổ hợp các kết quả đã có (không phải tính lại) của các trường hợp con, sẽ đạt đạt tới kết quả của trường hợp có kích thước lớn dần lên và tổng quát hơn, cho đến khi cuối cùng đạt tới lời giải của trường hợp tổng quát nhất Với bài toán này ta hoàn toàn có thể giải được bằng phương pháp quy hoạch động

2.2 Phân tích bài toán

- Để đơn giản thuật toán ta tiến hành sắp xếp các đoạn thẳng trong S theo chiều không giảm của các bi (tức là {b1≤b2≤b3≤…≤bn-1≤bn}, nếu

bi=bj, thì ai≤aj với i<j)

- Xét ví dụ sau:

Trang 8

Giả sử ta có 10 đoạn thẳng sau khi đã sắp xếp.

Ta thấy rằng giả sử đang xét đến đoạn thẳng 5: Nếu ta lấy đoạn 5 vào tập kết quả thì các đoạn 4,3,2 sẽ không thể tồn tại trong tập kết quả,… cứ như vậy ta sẽ phải xét xem những đoạn nào gần nhất trong tập những đoạn thẳng đã xét trước đó phải có điểm kết thúc nhỏ hơn điểm bắt đầu của đoạn thẳng đang xét thì khi đó đoạn thẳng đang xét mới được đưa vào tập kết quả được

Để giải quyết vấn đề này ta xây dựng một mảng index, trong đó

index(j) lưu chỉ số lớn nhất của các đoạn thẳng từ 1 j-1 mà có thể kết hợp

với đoạn j

Với ví dụ hình trên thì ta có các index(j) như sau:

index(1):=0 {trước đó không có đoạn thẳng nào có điểm kết thúc nhỏ hơn

hoặc bằng điểm bắt đầu của đoạn 1};

Tương tự như vậy ta tính được: index(2):=0; index(3):=0; index(4):=3;

index(10):=8;

Gọi L(j) là tổng độ dài lớn nhất của các đoạn thẳng khi xét đến đoạn thẳng thứ j (1,2,…,j) Khi đó có các 2 trường hợp sau:

Trường hợp 1: Đoạn thẳng j được chọn vào tập S*.

Khi đó, ta có:

- S* không chứa các đoạn thẳng {index(j)+1,index(j)+2,…, j-1}: vì index(j) là chỉ số lớn nhất của các đoạn thẳng từ 1 j-1 mà có thể kết hợp với đoạn j Do đó các đoạn thẳng {index(j)+1,index(j)+2,…, j-1} không thể kết hợp với đoạn j

- S* có thể chứa các đoạn thẳng 1,2 index(j)

Khi đó: L(j)=(bj-aj) + L(index(j)) với aj ,bj là toạ độ điểm đầu và điểm cuối của đoạn thẳng thứ j

Trường hợp 2: Đoạn thẳng j không được chọn vào tập S*.

Kết quả sẽ quay về trường hợp xét tới đoạn j-1, hay L(j)=L(j-1)

2.3 Thuật toán

- Sắp xếp các đoạn thẳng trong S theo chiều không giảm của các bi

(tức là {b1≤b2≤b3≤…≤bn-1≤bn}, nếu bi=bj, thì ai≤aj với i<j)

- Đặt d[1 n] là mảng lưu độ dài n đoạn thẳng (sau khi các đoạn thẳng được sắp xếp)

Trang 9

- Gọi L(j) là tổng độ dài lớn nhất khi xét đến j đoạn thẳng đầu tiên thoã mãn yêu cầu bài toán

- Công thức quy hoạch động để tính L(j):

o L(0)=0

o L(1) = d(1) = 0+d(1)

o Công thức tổng quát khi xét đến đoạn thẳng thứ j là:

0 , ) 1 ( )), ( ( ) ( max

0 , 0 )

(

j j

L j index L j d

j j

L

- Đáp án của bài toán là L(n)

- Công việc tiếp theo là truy hồi để tìm tập các đoạn thẳng thoả mãn đầu bài là S* :

Nếu d(j)+L(index[j])>L[j-1] thì đoạn thẳng j được chọn

Ngược lại đoạn j không được chọn

2.4 Xét ví dụ cụ thể

Bảng index(j)

Bảng d(j)

Trang 10

j 1 2 3 4 5 6 7 8 9 10

Bảng L(j)

Truy hồi:

1 d(10)+L(index[10])=3+6=9>L[9]=7 vậy đoạn 10 được chọn , Index[10]=8, xét đoạn 8

2 d(8)+L(index[8])=1+5=6< L[7]=8 vậy đoạn 8 không được chọn, xét tiếp đoạn 7

3 d(7)+L(index[7])=2+6=8>L[6]=5 vậy đoạn 7 được chọn, L(index[7])=5, xét tiếp đoạn 5

4 d(5)+L(index[5])=4+2=6>L[4]=5 vậy đoạn 5 được chọn, L(index[5])=2, xét tiếp đoạn 2

5 d(2)+L(index[2])=2+0=2=L[1]=2 vậy đoạn 2 không được chọn, xét tiếp đoạn 1

6 d(1)+L(index[1])=2+0=2>L[0]=0 vậy đoạn 1 được chọn

Như vậy L(10) = 11 và S* ={đoạn 10, đoạn 7, đoạn 5, đoạn 1} Đây

là 1 phương án tối ưu của bài toán

2.5 Cụ thể giải thuật

Khai báo:

const static char fileoutput[] = "output.txt"; //{File ket qua dau ra }

const static char fileinput[] = "input.txt";//{File du lieu vao }

const static int MAX = 5000;

- Định nghĩa cấu trúc đoạn thẳng

struct doanthang

Trang 11

long a; // Toa do diem dau

long b; // Toa do diem cuoi

};

- Khai báo mảng chứa các đoạn thẳng

typedef struct doanthang Listdoanthang[MAX];

Listdoanthang S, S_output; danh sách các đoạn thẳng đầu vào và đầu ra index[0 n]: lưu chỉ số lớn nhất của các đoạn thẳng từ 1 j-1 mà có thể kết hợp với đoạn j

long d[1 n]; lưu độ dài của các đoạn thẳng

a Giải thuật tính các giá trị index(i):

for (i=0;i<= sodoanthang;i++)

index[i]=0;

for (i=1;i<=sodoanthang;i++) {

j=i-1;

while ((j>0)&&(S[j].b>=S[i].a))

j ;

index[i]=j;

} Số phép so sánh nhiều nhất: 2(1+2+…+n)=n(n+1)

Độ phức tạp: O(n 2 )

b Giải thuật tính L(j)

void Quyhoachdong()

{

L[0]=0;

for(int j=1;j<=sodoanthang;j++)

L[j]=max(d[j]+L[index[j]],L[j-1]);

}

Độ phức tạp: O(n)

c Giải thuật truy hồi tìm phương án tối ưu cho bài toán

void Truyhoi(int j)

{

if (j>0) {

if ((d[j]+L[index[j]])>L[j-1]) // neu doan j duoc chon

Trang 12

k++; // luu so doan thang duoc chon S_output[k].a= S[j].a;

S_output[k].b= S[j].b;

file_out << S[j].a << " " << S[j].b << "\n";

cout << S[j].a << " " << S[j].b << "\n";

Truyhoi(index[j]);

} else // neu doan thang j khong duoc chon

Truyhoi(j-1);

} }

Độ phức tạp: O(n)

d Giải thuật tổng thể giải quyết bài toán

A Đọc thông tin các đoạn thẳng từ file dữ liệu đầu vào (input.txt) và sắp xếp theo chiều không giảm của b (bi) và a (ai) bằng hàm ReadData(int& n, Listdoanthang& arr)

C Tính độ dài của các đoạn thẳng

For j:=1 to N do

d[j]:=S[j].b-S[j].a;

D Tính index(j);

E Quyhoachdong();

F Truyhoi();

2.6 Đánh giá độ phức tạp theo phương pháp quy hoạch động

1 Sắp xếp tập các đoạn thẳng theo chiều không giảm của b và a Độ phức tạp: tồi nhất là O(n2), tốt nhất là O(nlogn)

2 Tính các giá trị index(j), j=1 n: Độ phức tạp O(n2) {Sau khi đã sắp

xếp}

3 Tính các L(j), j=1 n: với mỗi lần gọi mất O(1) => tổng cộng tối đa trong thuật toán này là: O(n)

4 Tìm truy vấn lại các đoạn thẳng đã chọn vào S_output: tối đa là O(n) Như vậy độ phức tạp toàn bộ thuật toán là O(n)

2.7 Test thử các bộ dữ liệu khác nhau

Trang 13

b Dữ liệu có nhiều đoạn thẳng có điểm chung

Trang 14

c Dữ liệu gồm các đoạn thẳng rời nhau

d Dữ liệu gồm các đoạn thẳng bao nhau nhiều

Nhận thấy, các ví dụ test trên chương trình đều cho kết quả đúng

Trang 15

KẾT LUẬN

- Với thuật toán vét cạn thì ta thấy độ phức tạp của bài toán là O(2n) Tổng tất cả các khả năng của bài toán là 2n-1 trường hợp ứng với mỗi dãy nhị phân có độ dài n

- Với phương pháp quy hoạch động thì bài toán trở nên rõ ràng và khắc phục được các nhược điểm của thuật toán vét cạn với độ phức tạp là O(n2)

Trang 16

TÀI LIỆU THAM KHẢO

 Bài giảng phân tích đánh giá thuật toán - Đào Thanh Tĩnh

 INTRODUCTION TO ALGORITHMS by Thomas H Cormen, Charles E Leiserson, and Ronald L Rivest

CROCHEMORE, M., RYTTER, W., 1994, Text Algorithms, Oxford

University Press

Ngày đăng: 03/10/2017, 00:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w