1. Trang chủ
  2. » Công Nghệ Thông Tin

Tiểu Luận Thuật Toán Prim

21 1,9K 53

Đ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 21
Dung lượng 215 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài tìm hiểu chi tiết kỹ càng về thuật toán Prim gôm có lịch sử thuật toán, mô tả thuật toán,chứng minh tính đúng đắn của thuậ toán, lưu đồ thuật toán, cài đặt thuật toán (code), Phần code rõ ràng có chú thích.

Trang 1

Bài toán tối ưu là một bài toán muôn thưở của ngành tin học bởi nó có ứng dụng hếtsức rộng rãi và đa dạng Các bài toán tối ưu thường xuất hiện trong các ngành kinh tế

và kĩ thuật cũng vì lý do này mà trên thế giới có rất nhiều thuật toán để giải các bàitoán tối ưu Một trong số đó có thể kể đến là thuật toán Prim

I GIỚI THIỆU THUẬT TOÁN PRIM

1. Bài toán cây khung nhỏ nhất

Bài toán cây khung (cây bao trùm) nhỏ nhất của đồ thị là một trong số nhữngbài toán tối ưu trên đồ thị tìm được ứng dụng trong nhiều lĩnh vực khác nhau của đờisống Để minh họa cho những ứng dụng đó, chúng ta cùng tham khảo ba mô hình thực

tế tiêu biểu của bài toán:

Bài toán xây dựng hệ thống cable: Giả sử muốn xây dựng một hệ thống cable

điện thoại nối n điểm của một mạng viễn thông sao cho điểm bất kì nào trênmạng đều có đường truyền tin tới các điểm khác Biết chi phí xây dựng hệthống cable từ điểm i đến điểm j là c[i,j] Hãy tìm cách xây dựng hệ thống mạngcable sao cho chi phí là nhỏ nhất

Bài toán xây dựng hệ thống đường sắt: Giả sử ta muốn xây dựng một hệ

thống đường sắt nối n thành phố sao cho hành khách có thể đi từ bất kỳ mộtthành phố nào đến bất kỳ một trong các thành phố còn lại Mặt khác trênquan điểm kinh tế đòi hỏi là chi phí xây dựng hệ thống đường phải nhỏ nhất

Rõ ràng đồ thị mà đỉnh là các thành phố còn các cạnh là các tuyến đường sắtnối các thành phố tương ứng với phương án xây dựng tối ưu phải là cây Vìvây, bài toán đặt ra dẫn về bài toán tìm cây khung nhỏ nhất trên đồ thị đầy đủ

n đỉnh, mỗi đỉnh tương ứng với một thành phố, với độ dài trên các các cạnhchính là chi phí xây dựngđường ray nối hai thành phố tương ứng (chú ý là trong

Trang 2

bài toán này ta giả thiết là không xây dựng tuyến đường sắt có các nhà ga phântuyến nằm ngoài các thành phố)

Bài toán nối mạng máy tính: Cần nối mạng một hệ thống gồm n máy tính đánh

số từ 1 đến n Biết chi phí nối máy i với máy j là c[i,j], i,j = 1, 2, ,n ( thôngthường chi phí này phụ thuộc vào độ dài cáp nối cần sử dụng) Hãy tìm cáchnối mạng sao cho tổng chi phí nối mạng là nhỏ nhất

Và bài toán cây khung nhỏ nhất được phát biểu như sau:

Cho đồ thị G=<V,E> là đồ thị vô hướng liên thông với tập đỉnh V={1,2,3…,n}

và tập cạnh E gồm m cạnh Mỗi cạnh e của đồ thị được gán với một sốc(e) được gọi làtrọng số của cạnh Giả sử H=<V,T> là một cây khung của đồ thị G Ta gọi độ dài c(H)của cây khung H là tổng độ dài các cạnh :

c(H)= ∑ c(e)

e ∈ T

Bài toán đặt ra là, trong số các cây khung của đồ thị hãy tìm cây khung có độ dàinhỏ nhất của đồ thị

Để giải bài toán tìm cây khung nhỏ nhất, chúng ta có thể liệt kê toàn bộ cây khung

và chọn trong số những cây khung đã liệt kê một cây khung có độ dài nhỏ nhất Tuynhiên số cây khung của mỗi đồ thị lại rất lớn cỡ nn-2 do vậy phương án này hoàn toànkhông khả thi và chỉ cần với đồ thị với số đỉnh cỡ chục thì phương án này trở nên vôdụng

Rất may là chúng ta đã có hai thuật toán vô cùng hiệu quả để giải quyết bài toàntrên đó chính là thuật toán Prim và thuật toán Kruskal

Chúng ta sẽ cùng tìm hiểu về thuật toán Prim

2 Sự ra đời của thuật toán Prim

Thuật toán Prim còn được mang tên là người láng giềng gần nhất, hay phương

pháp lân cận gần nhất,là một thuật toán tham lam để tìm cây khung nhỏ nhất củamột đồ thị vô hướngcó trọng sốliên thông Nghĩa là nó tìm một tập hợp các cạnh của

đồ thị tạo thành một cây chứa tất cả các đỉnh, sao cho tổng trọng số các cạnh của cây

Trang 3

Thuật toán được tìm ra năm 1930 bởi nhà toán họcngười SécVojtěch Jarník vàsau đó bởi nhà nghiên cứu khoa học máy tính Robert C Prim năm 1957 và một lầnnữa độc lập bởi Edsger Dijkstra năm 1959 Do đó nó còn có tên gọi là thuật toánDJP, thuật toán Jarník, hay thuật toán Prim–Jarník.

II MÔ TẢ THUẬT TOÁN

1 Ý tưởng

Nạp dần các đỉnh vào cây khung Mỗi lần chọn một đỉnh chưa nạp là đỉnh kề vàgần với các đỉnh đã nạp nhất

Cụ thể như sau:

Bắt đầu từ một đỉnh tùy ý của đồ thị, nối đỉnh đó với một đỉnh thứ hai sao cho

trọng số của cạnh nối hai đỉnh trên là nhỏ nhất Tiếp theo, từ một trong hai đỉnh đó,

tìm cạnh có độ dài nhỏ nhất, điều này dẫn tới một đỉnh thứ ba và như vậy chúng ta đã

thu được một cây bộ phận gồm 3 đỉnh và 2 cạnh Quá trình này được tiếp tục cho tới

khi ta nhận được cây gồm n-1 cạnh, đó chính là cây khung nhỏ nhất cần tìm

Ta có thể thấy rõ hơn qua ví dụ bằng hình vẽ sau:

Trang 7

2 Mô tả

Begin

Bước 1 (Khởi tạo):

VH = {s}; //Tập đỉnh cây khung thiết lập ban đầu là s

V=V\{s}; //Tập đỉnh V được bớt đi s

T=∅; //Tập cạnh cây khung thiết lập ban đầu là ∅

D(H)=0;//Độ dài cây khung được thiết lập là 0

Bước 2 (Lặp):

while(V≠ ) do{∅

e=<u,v>; //cạnh có độ dài nhỏ nhất thỏa mãn u∈V, v∈VH

d(H)=d(H)+d(e);//thiết lập độ dài cây khung nhỏ nhất

T=T∪ {e};//Kết nạp e vào cây khungV=V\{u};//Tập đỉnh V bớt đi đỉnh u

VH=VH∪{u};//Tập đỉnh VH thêm vào đỉnh u}

Endwhile;

Trang 8

Bước 3 (Trả lại kết quả):

if(|T|<n-1) then <Đồ thị không liên thông>;

else Return(T,d(H));

End

3 Kiểm nghiệm thuật toán

Cho đồ thị G gồm 13 đỉnh được biểu diễn dưới dang ma trận kề như dưới đây.Trong đó các cạnh có trọng số bằng 35000 tức không đường đi giữa hai đỉnh của cạnhđó

Khi đó các bước của thuật toán Prim được thực hiện như dưới đây:

Bước khởi tạo: T= ; D(T)=0; V=2,3,4,5,6,7,8,9,10,11,12,13; V∅ H=2

Trang 9

Xét về độ phức tạp thuật toán sử dụng ma trận kề, thuật toán Prim có độ phức tạp

là O(n2) Nếu kết hợp thuật toán Prim với cấu trúc Heap sẽ được một thuật toán có độphức tạp O((m+n)lgn)

Trang 10

Do thời gian nghiên cứu hạn hẹp nên chúng tôi xin phép chỉ trình bày cách lậptrình sử dụng ma trận kề.

2 Tính đúng đắn của thuật toán.

Chứng minh tính đúng đắn của thuật toán:

Vì e’ không được chọn nên: d[e’]>d[e]

Đặt T2 là đồ thị thu được bằng cách xóa e’ và thêm e vào T1 Do T2 liên thông, cócùng số cạnh như T1, và tổng trọng số các cạnh không quá trọng số của T1, nên nócũng là một cây bao trùm nhỏ nhất của G và nó chứa e cũng như tất cả các cạnh đượcthuật toán chọn trước nó

Cứ lặp lại lập luận trên nhiều lần, cuối cùng ta thu được một cây bao trùm nhỏnhất của G giống hệt như T

Vì vậy T là một cây bao trùm nhỏ nhất

3 Ưu điểm so với Kruskal

Trang 11

Thuật toán Kruskal làm việc kém hiệu quả với những đồ thị dày (số cạnh cỡ

m≈n(n-1)/2) Trong trường hợp đó thuật toán Prim tỏ ra hiệu quả hơn Tuy nhiên khilàm việc với đồ thị thưa người ta thường lựa chọn thuật toán Kruskal thay vì thuật toánPrim

IV CÀI ĐẶT THUẬT TOÁN

1 Lưu đồ thuật toán

//lệnh if cần bổ sung i chạy i++ vào lưu đồ

int i=1 d[v]=35000

vt[u]=1

N[i]=14

i=1 i<n

d[v]>=g[u][v]

d

Nmin=14 dmin=35000

Trang 12

Chương trình tìm cây khung nhỏ nhất theo thuật toán PRIM cho đồ thị biểu diễndưới dạng ma trận kề được thể hiện dưới đây với các hàm:

• read(): kiểm tra đã tồn tại file Input

• readFile(): đọc File Input

• Prim(): thuật toán Prim xây dựng cây khung nhỏ nhất

• Result: đưa tập cạnh và độ dài nhỏ nhất của cây khung

Chương trình được thực hiện như sau:

#include<iostream>

#include<fstream>

#define fin "PRIM.INP"

#define fon "PRIM.OUT"

using namespace std;

ifstream ifs;

ofstream ofs;

bool read();//Kiem tra da ton tai file Input chua

void readFile(int G[][100],int &n);//Tien hanh doc file

bool Prim(int G[][100],int n,int N[]);//Thuc hien thuat toan Prim

void result(int G[][100],int N[100],int n);//In ket qua

Trang 13

cout<<"Do Thi Khong Lien Thong!";}

Trang 14

}

Trang 15

if(u==0){

return 0;

}}

ofs<<endl;

D+= G[v][N[v]];

}}}

ofs<<endl;

ofs<<"Tong trong so la: "<<D<<endl;}

3 Chạy thử

Trang 16

Input: (PRIM.INP)//G[i][j]=35000 tức không có đường đi từ i đến j (G[i][j]=∞)

Trang 19

KẾT LUẬN

Thông qua bài tiểu luận, chúng tôi đã hiểu về thuật toán Prim cũng như nâng cao khả năng làm làm việc nhóm của bản thân Bài tiểu luận còn nhiều thiếu xót, rất mong nhận được những đánh giá và góp ý từ phía thầy giáo và các bạn

Chúng tôi xin chân thành cảm ơn

Nhận xét của thầy giáo:

………

………

………

………

………

………

Trang 20

TÀI LIỆU THAM KHẢO

1. Giải Thuật Và Lập Trình_LÊ MINH HOÀNG

2. Giáo Trình Toán Rời Rạc_Học Viện Công Nghệ Bưu Chính Viễn Thông

3. Từ Internet

Trang 21

MỤC LỤC

I. GIỚI THIỆU THUẬT TOÁN PRIM………

1. Bài toán cây khung nhỏ nhất ………

2. Sự ra đời của thuật toán Prim………

II. MÔ TẢ THUẬT TOÁN 1. Ý tưởng ……….

2. Mô tả……….……

3. Kiểm nghiệm thuật toán………

III. ĐÁNH GIÁ THUẬT TOÁN 1. Độ phức tạp……… ………

2. Tính đúng đắn của thuật toán……….

3. Ưu điểm so với thuật toán Kruskal……… ………

IV. CÀI ĐẶT CHƯƠNG TRÌNH 1. Lưu đồ thuật toán……….……….

2. Chương trình………

3. Chạy thử……….……

Một số các test khác……….…………

1 2 3

3 4 5

6 7 7

8 9 12 14

Ngày đăng: 22/03/2017, 14:40

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w