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 toán Prim và Ford-Bellman.. TÓM TẮT BÀI BÁO CÁOVấn đề được đặt ra khi ta muốn tạo
Trang 1TRƯỜ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
Thành phố Hồ Chí Minh, ngày 29 tháng 11 năm 2021
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
Trang 2TRƯỜ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 phố Hồ Chí Minh, ngày 29 tháng 11 năm 2021
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
Trang 3LỜ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 quá 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 toá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 toá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 quá trình hoà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 hoà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, luôn nhiệt huyết và thành công trên bước đường sư phạm
Trang 4TÓ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 toá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 toá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 quá trình thực hiện thuật toá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 quá trình thực hiện của hai thuật toán sẽ như nào
Trang 5LÍ 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 toá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 toá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 toán đòi hỏi thời gian và công sức rất lớn Các thuật toá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 toá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
Trang 6CHƯƠNG 1 : TỔNG QUAN VỀ ĐỀ TÀI
Minh hoạ trực quan bằng giao diện đồ hoạ các thuật toá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 toá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 toán đó gọi
là bài toá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
Trang 7Trong khoa học máy tính, thuật toán Prim được gọi là một thuật toá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 ngoà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 toán Ford-Bellman
2.2.1 : Bài toá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
Yê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 toán Ford-Bellman
Thuật toá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 +
Trang 8Sau đó ta tối ưu hoá 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 toá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 TOÁ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
Trang 9Hàm đọc dữ liệu lên input
Trang 10Chạy thuật toán Prim
Trang 11Tí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
Trang 12Phần chạy thuật toán Ford-Bellman
Trang 13Đây là phần tạo đồ thị
Màn hình chạy kết quả
Link báo cáo: :
https://drive.google.com/drive/folders/1PLKPmyT7X1m4D1UBvqasbdK3n0qwyHL7? usp=sharing
Tài liệu tham khảo:
Trang 14
fbclid=IwAR11_YYPzRSqNb9l8Tnjiaf0qnMFi-r62Gu9j96XyVhTmjfHIEYrR_WkE0Y
https://codereview.stackexchange.com/questions/188949/bellman-ford-algorithm-implementation
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