Tải bản đầy đủ (.pdf) (14 trang)

Tìm hiểu và mô phỏng vềhai thuật toán prim và ford bellman

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.03 MB, 14 trang )

TRƯỜNG ĐẠI HỌC SƯ PHẠM THÀNH PHỐ HỒ CHÍ MINH
KHOA CƠNG NGHỆ THƠNG TIN
MƠN : LÍ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNG

BÁO CÁO
ĐỀ TÀI SỐ 03

HỌC PHẦN: COMP170101 – LÍ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNG
Tên nhóm : I_kb_4
Mã lớp học phần : COMP170101
Giảng viên hướng dẫn : ThS Lương Trần Ngọc Khiết

Thành phố Hồ Chí Minh, ngày 29 tháng 11 năm 2021


TRƯỜNG ĐẠI HỌC SƯ PHẠM THÀNH PHỐ HỒ CHÍ MINH
KHOA CƠNG NGHỆ THƠNG TIN
MƠN : LÍ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNG

BÁO CÁO
ĐỀ TÀI SỐ 03

Thành viên nhóm thực hiện :
-

Phạm Đức Quý – 46.01.104.149

-

Lê Minh Triệu – 46.01.104.198


-

Phan Ngọc Tánh – 46.01.104.163

-

Phạm Nguyễn Hoàng Kha – 46.01.104.075

Thành phố Hồ Chí Minh, ngày 29 tháng 11 năm 2021


LỜI CẢM ƠN

Lời đầu tiên, nhóm em xin gửi lời cảm ơn chân thành nhất đến Thầy Lương Trần
Ngọc Khiết. Trong q trình học tập và tìm hiểu bộ mơn Lí thuyết đồ thị và ứng dụng,
phần thực hành, chúng em đã nhận được sự quan tâm giúp đỡ, hướng dẫn rất tận tình,
tâm huyết của Thầy. Thầy đã giúp chúng em tích lũy thêm nhiều kiến thức và những
kiến thức này chắc chắn sẽ giúp chúng em hiểu ra những thuật toán, những đường đi,
sự thú vị của những thuật tốn này. Thơng qua bài báo cáo này, chúng em xin trình bày
những gì mà mình đã học và tìm hiểu được về hai thuật tốn Prim và Ford-Bellman.
Có lẽ kiến thức là vô hạn mà sự tiếp nhận kiến thức của bản thân mỗi người luôn
tồn tại những hạn chế nhất định. Do đó, trong q trình hồn thành bài báo cáo, chắc
chắn không tránh khỏi những thiếu sót. Bản thân chúng em rất mong nhận được những
lời góp ý đến từ Thầy để bài tiểu luận của chúng em được hồn thiện một cách tốt nhất.
Kính chúc Thầy sức khỏe, bình an trong cuộc sống, ln nhiệt huyết và thành
công trên bước đường sư phạm.


TÓM TẮT BÀI BÁO CÁO


Vấn đề được đặt ra khi ta muốn tạo một cây khung nhỏ nhất hay là tìm đường đi
ngắn nhất từ một đỉnh tới tất cả các đỉnh trong đồ thị có trọng số âm thì thuật toán Prim
sẽ phục vụ cho việc tạo cây khung nhỏ nhất và thuật tốn Ford-Bellman sẽ là tìm
đường đi ngắn nhất tới tất cả các đỉnh trong đồ thị có trọng số âm
Việc thực hiện bằng các thuật tốn như vậy sẽ giúp ta dễ dàng giải quyết những
vấn đề liên quan đến việc tìm cây khung nhỏ nhất hay là tìm được đường đi ngắn nhất
qua việc mơ tả và trong q trình thực hiện thuật tốn.
Hơn nữa, qua việc ta có thể tìm hiểu về code của hai thuật toán sẽ giúp ta hiểu
được và biết được q trình thực hiện của hai thuật tốn sẽ như nào.


LÍ DO BÀI BÁO CÁO
Cách đây từ rất lâu, ở nhiều nước trên thế giới, việc mơ phỏng thuật tốn đã được
sử dụng để phục vụ cho các công việc giảng dạy. Khơng những thế nó cịn cho người
học biết chi tiết từng bước hoạt động của thuật toán cùng với cấu trúc dữ liệu đi kèm
thông qua việc mô tả bằng đồ hoạ.
Lí thuyết đồ thị và ứng dụng thuật tốn là một lĩnh vực vơ cùng rộng lớn và phức
tạp. Việc hiểu và cài đặt tốt các thuật tốn địi hỏi thời gian và cơng sức rất lớn. Các
thuật tốn khó hình dung, việc tổ chức dữ liệu cũng phức tạp.
Chính vì thế, trong bài báo cáo này, chúng em sẽ đi sâu tìm hiểu và mơ phỏng về
hai thuật tốn Prim và Ford-Bellman.

MỤC ĐÍCH BÀI BÁO CÁO
Để hiểu rõ hơn về hai thuật toán Prim và Ford-Bellman cũng như quá trình thực
hiện của hai thực của hai thuật toán trên.

NỘI DUNG BÀI BÁO CÁO
Hai thuật toán Prim và Ford-Bellman.



CHƯƠNG 1 : TỔNG QUAN VỀ ĐỀ TÀI

Minh hoạ trực quan bằng giao diện đồ hoạ các thuật tốn lí thuyết đồ thị bên dưới :
a. Prim

Prim.cpp

b. Ford-Bellman

Ford.cpp

CHƯƠNG 2 : CƠ SỞ LÍ THUYẾT
2.1 : Thuật tốn Prim
2.1.1 : Bài toán cây khung
Khái niệm cây khung : Cho đồ thị G = (V,E) vô hướng, liên thông và T = (V,E’) là
một đồ thị con của G (E’  E). Khi đó, T được gọi là cây khung ( cây bao trùm ) nếu T
liên thơng và khơng có chu trình đơn.
Cho G = (V, E, w) là đồ thị vơ hướng liên thơng có trọng số, với một cây khung T
của G, ta gọi trọng số của cây T là tổng trọng số các cạnh trong T.
Yêu cầu: Trong số các cây khung của G, chỉ ra cây khung có trọng số nhỏ nhất.
Cây khung như vậy được gọi là cây khung nhỏ nhất của đồ thị, và bài tốn đó gọi
là bài tốn xây dựng cây khung nhỏ nhất. Dưới đây ta sẽ xét thuật toán Prim để giải bài
toán này.
2.1.2 : Thuật toán Prim


Trong khoa học máy tính, thuật tốn Prim được gọi là một thuật tốn tham lam để
tìm cây bao trùm nhỏ nhất của một đồ thị vơ hướng có trọng số liên thơng. Nghĩa là nó
sẽ 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 là nhỏ nhất.

Đơn đồ thị vô hướng G = (V, E,w). Xét cây T trong G và một đỉnh v, gọi khoảng
cách từ v tới T là trọng số nhỏ nhất trong số các cạnh nối v với một đỉnh nào đó trong
T:
d[v] = min{w[u, v]  uT}
Ban đầu khởi tạo cây T chỉ gồm có mỗi đỉnh {1}. Sau đó cứ chọn trong số các
đỉnh ngồi T ra một đỉnh gần T nhất, kết nạp đỉnh đó vào T đồng thời kết nạp luôn cả
cạnh tạo ra khoảng cách gần nhất đó. Cứ làm như vậy cho tới khi:
Hoặc đã kết nạp được tất cả n đỉnh thì ta có T là cây khung nhỏ nhất
Hoặc chưa kết nạp được hết n đỉnh nhưng mọi đỉnh ngoài T đều có khoảng cách
tới T là +. Khi đó đồ thị đã cho không liên thông, ta thông báo việc tìm cây khung
thất bại.
2.2 : Thuật tốn Ford-Bellman
2.2.1 : Bài tốn tìm đường đi ngắn nhất trên đồ thị có trọng số
Cho đồ thị có trọng số G = (V, E,w) là đồ thị khơng có chu trình âm.
u cầu: Hãy tìm một đường đi ngắn nhất (tổng trọng số qua các đỉnh trên đường
đi) từ đỉnh xuất phát s  V đến đỉnh đích t  V.
Dưới đây ta sẽ xét thuật toán Ford-Bellman để giải bài toán này.
2.2.2 : Thuật tốn Ford-Bellman
Thuật tốn Ford-Bellman có thể phát biểu rất đơn giản:
Với đỉnh xuất phát S. Gọi d(v) là khoảng cách từ S tới v.
Ban đầu d(S) được khởi gán bằng 0 còn các d(v) với v  S được khởi gán bằng
+.


Sau đó ta tối ưu hố dần các d(v) như sau: Xét mọi cặp đỉnh u, v của đồ thị, nếu
có một cặp đỉnh u, v mà d(v) > d(u) + c(u, v) thì ta đặt lại d(v) := d(u) + c(u, v). Tức là
nếu độ dài đường đi từ S tới v lại lớn hơn tổng độ dài đường đi từ S tới u cộng với chi
phí đi từ u tới v thì ta sẽ huỷ bỏ đường đi từ S tới v đang có và coi đường đi từ S tới v
chính là đường đi từ S tới u sau đó đi tiếp từ u tới v. Chú ý rằng ta đặt c[u, v] = +  nếu
(u, v) khơng là cung. Thuật tốn sẽ kết thúc khi không thể tối ưu thêm bất kỳ một nhãn

d[v] nào nữa.

CHƯƠNG 3 : CHƯƠNG TRÌNH CỦA HAI THUẬT TỐN
3.1 : Thuật toán Prim
Cho G = (V, E) là một đồ thị liên thơng có trọng số gồm n đỉnh.
Bước 1: Chọn tùy ý một đỉnh bất kỳ v ∈ V và khởi tạo: Y = {v} và T = ∅.
Bước 2: Trong số những cạnh e = (v, w), trong đó v ∈ Y và w ∈ V\Y, ta chọn
cạnh có độ dài nhỏ nhất.
Bước 3: Gán Y = Y ∪ {w} và T = T ∪ {e}
Bước 4: Nếu T đủ n – 1 phần tử thì dừng, ngược lại làm tiếp bước 2.
T chính là cây khung nhỏ nhất.


Hàm đọc dữ liệu lên input


Chạy thuật toán Prim


Tính tổng trọng số

Màn hình chạy kết quả
3.2 : Thuật toán Ford-Bellman
Bước 1 : Khởi tạo đồ thị
Bước 2 : Cập nhập các cạnh với n (n là node) vòng lặp sao cho đường đi từ
source node đến node bị lặp là lớn nhất.
Bước3 : Kiểm tra xem đồ thị có chu trình âm hay khơng.


Phần chạy thuật toán Ford-Bellman



Đây là phần tạo đồ thị

Màn hình chạy kết quả
Link báo cáo:

:

/>usp=sharing
Tài liệu tham khảo:


/>fbclid=IwAR11_YYPzRSqNb9l8Tnjiaf0qnMFir62Gu9j96XyVhTmjfHIEYrR_WkE0Y
/>code prim:
code ford bellman:
CHƯƠNG 4 : THÀNH VIÊN NHÓM, BẢNG PHÂN BỔ CÔNG VIỆC VÀ
ĐÁNH GIÁ
-

Phạm Đức Quý – 46.01.104.149

-

Lê Minh Triệu – 46.01.104.198

-

Phan Ngọc Tánh – 46.01.104.163


-

Phạm Nguyễn Hoàng Kha – 46.01.104.075



×