Bài toán tìm đường đi ngắn nhất là bài toán quan trọng trong Lý thuyết đồ thị, nó được áp dụng để giải quyết rất nhiều bài toán trong thực tế như điều khiển tối ưu, giao thông vận tải, m
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM TP HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO ĐỀ TÀI ỨNG DỤNG CÁC THUẬT TOÁN LÝ THUYẾT ĐỒ THỊ
VÀO BÀI TOÁN GIAO HÀNG
Học phần: <2311COMP170102 – LÝ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNG>
Thành phố Hồ Chí Minh, ngày 27 tháng 10 năm 2023
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM TP HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO ĐỀ TÀI ỨNG DỤNG CÁC THUẬT TOÁN LÝ THUYẾT ĐỒ THỊ
VÀO BÀI TOÁN GIAO HÀNG
Học phần: <2311COMP170102 – LÝ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNG>
Nhóm sinh viên thực hiện:
Nguyễn Dương Quốc Bảo 48.01.103.008
Thành phố Hồ Chí Minh, ngày 27 tháng 10 năm 2022
Trang 3BẢNG PHÂN CÔNG NHIỆM VỤ
48.01.103.04
Tạo và chỉnh winform, chuyển C+
+ sang C#, demo cách giải tay Kruskal, giới thiệu Word, demo chương trình,
Hoàn thành 100%
48.01.103.06
Tạo và chỉnh winform, viết thuật toán Kruskal C++, kiếm ma trận và đồ thị
Hoàn thành 100%
48.01.103.08
Tạo và chỉnh winform, viết thuật toán Floyd C++, làm Word, kiếm ma trận
và đồ thị
Hoàn thành 100%
48.01.103.09
Trang trí winform, demo cách giải tay Floyd, tìm hiểu 2 thuật toán và làm Word
Hoàn thành 100%
46.01.103.04
Trang trí winform, tìm hiểu 2 thuật toán, kiếm ma trận và đồ thị
Hoàn thành 100%
Trang 4MỤC LỤC
MỞ ĐẦU 6
1 Lý do chọn đề tài 6
2 Mục tiêu và nhiệm vụ nghiên cứu 6
3 Đối tượng và phạm vi nghiên cứu 7
4 Phương pháp nghiên cứu 7
5 Kết cấu của đề tài 7
GIỚI THIỆU BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 7
CHƯƠNG 1 THUẬT TOÁN KRUSKAL 9
1.1 Khái niệm 9
1.2 Ý tưởng thuật toán 9
1.3 Ứng dụng thuật toán 9
1.4 Các bước thực hiện 10
CHƯƠNG 2: THUẬT TOÁN FLOYD 15
2.1 Khái niệm 15
2.2 Quá trình thực hiện thuật toán Floyd-Warshall sẽ diễn ra như sau: 15
2.3 Một số ứng dụng của thuật toán 17
2.4 Đánh giá giải thuật 18
CHƯƠNG 4 : KẾT LUẬN 20
LINK THÔNG TIN CHƯƠNG TRÌNH 21
TÀI LIỆU THAM KHẢO 21
Trang 5MỞ ĐẦU
1 Lý do chọn đề tài
Lý thuyết đồ thị là ngành học được phát triển từ lâu nhưng lại có nhiều ứng dụng hiện đại Những ý tưởng cơ bản của nó đã được nhà toán học Thụy sĩ
vĩ đại Leonhard Euler đưa ra từ thế kỷ 18 Đồ thị là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó Đây là công cụ hữu hiệu để mô hình hóa
và giải quyết các bài toán trong nhiều lĩnh vực khoa học, kỹ thuật, kinh tế, xã hội.
Lý thuyết đồ thị không những có nhiều ứng dụng trong thực tế mà còn là công cụ đắc lực cho ngành công nghệ thông tin Nó giúp cho chúng ta mô tả một cách dễ dàng các bài toán phức tạp cụ thể, để từ đó ta có thể mã hoá các bài toán đó vào máy tính Ngoài ra lý thuyết đồ thị được sử dụng để giải quyết các bài toán trong nhiều lĩnh vực khác nhau.
Môn lý thuyết đồ thị là môn học hấp dẫn, mang tính thực tế cao Những vấn đề trong môn học như: các bài toán về đường đi, cây, mạng và các bài toán
tô màu đã và đang được nhiều người quan tâm, nghiên cứu Bài toán tìm đường
đi ngắn nhất là bài toán quan trọng trong Lý thuyết đồ thị, nó được áp dụng để giải quyết rất nhiều bài toán trong thực tế như điều khiển tối ưu, giao thông vận tải, mạng viễn thông Vì vậy, việc nghiên cứu nó là hết sức cần thiết vì nó có thể giải quyết được nhiều vấn đề khó khăn, phức tạp nảy sinh từ thực tế cuộc sống
Vì lí do đó, nhóm chúng em (nhóm 8) chọn đề tài nghiên cứu thuật toán Kruskal và Floyd để nghiên cứu, tìm hiểu tiểu luận môn học lý thuyết đồ thị và ứng dụng.
2 Mục tiêu và nhiệm vụ nghiên cứu
Mục đích chính của đề tài là: Nghiên cứu về lý thuyết đồ thị và một số thuật toán ứng dụng đồ thị bằng winform
Trang 6 Nắm được những khái niệm cơ bản hai thuật toán Kruskal và Floyd
Xây dụng một số thuật toán trên đồ thị
Ứng dụng một số thuật toán
3 Đối tượng và phạm vi nghiên cứu
a Đối tượng nghiên cứu
Thuật toán Kruskal
Thuật toán Floyd
b Phạm vi nghiên cứu
Trong khuôn khổ thuộc loại nghiên cứu và ứng dụng
Thuật toán Kruskal trên winform
Thuật toán Floyd trên winform
4 Phương pháp nghiên cứu
Nghiên cứu lý thuyết về đồ thị hai thuật toán Kruskal và Floyd
Thiết kế các thuật toán ứng dụng
Viết các chương trình cho các bài toán
5 Kết cấu của đề tài
Nội dung bài tiểu luận được xây dựng gồm các phần sau:
Ngoài phần mở đầu và kết luận Toàn bộ nội dung báo cáo được chia thành chương như sau
Chương 1: Thuật toán Kruskal
Chương 2: Thuật toán Floyd
Trang 7GIỚI THIỆU BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
Xét đồ thị G =<V, E>: trong đó |V| = n, |E| = m Với mỗi cạnh (u, v) E, ∈
ta đặt tương ứng với nó một số thực A<u,v> được gọi là trọng số của cạnh Ta
sẽ đặt A[u,v]=∞ nếu (u, v) E Nếu dãy v0, v1, , vk là một đường đi trên G thì ∉ tổng của tất cả các cạnh (A[vi-1,vi]) được gọi là độ dài của đường đi.
Bài toán tìm đường đi ngắn nhất trên đồ thị dưới dạng tổng quát có thể được phát biểu dưới dạng sau: Tìm đường đi ngắn nhất từ một đỉnh xuất phát s∈V(đỉnh nguồn) đến đỉnh cuối t V(đỉnh đích) Đường đi như vậy được gọi là ∈ đường đi ngắn nhất từ s đến t, độ dài của đường đi d(s,t) được gọi là khoảng cách ngắn nhất từ s đến t (trong trường hợp tổng quát d(s,t) có thể âm) Nếu như không tồn tại đường đi từ s đến t thì độ dài đường đi d(s,t)=∞ Nếu như mỗi chu trình trong đồ thị đều có độ dài dương thì trong đường đi ngắn nhất sẽ không có đỉnh nào bị lặp lại, đường đi như vậy được gọi là đường đi cơ bản Nếu như đồ thị tồn tại một chu trình nào đó có độ dài âm, thì đường đi ngắn nhất có thể không xác định, vì ta có thể đi qua chu trình âm đó một số lần đủ lớn để độ dài của nó nhỏ hơn bất kỳ một số thực cho trước nào.
Trang 8CHƯƠNG 1 THUẬT TOÁN KRUSKAL
1.1 Khái niệm
Thuật toán Kruskal là một thuật toán trong lý thuyết đồ thị để tìm cây khung nhỏ nhất của một đồ thị liên thông có trọng số.
Bài toán cây khung nhỏ nhất của đồ thị là một trong số những bài toán tối ưu trên đồ thị thường được ứng dụng trong nhiều lĩnh vực khác nhau của đời sống Bài toán đặt ra là trong tất cả cây khung của đồ thị G hãy tìm cây khung với độ dài nhỏ nhất.
1.2 Ý tưởng thuật toán
Cây khung (spanning tree) của một đồ thị là một đồ thị con liên thông không có chu trình đi qua tất cả các đỉnh Một đồ thị sẽ có nhiều cây khung và bài toán của chúng ta là phải tìm ra cây khung nhỏ nhất Ý tưởng của Thuật toán Kruskal khá đơn giản: Sắp xếp các cạnh từ bé đến lớn theo trọng số Lần lượt chọn các cạnh theo thứ tự
từ bé đến lớn trong danh sách sao cho không tạo thành chu trình Thuật toán sẽ dừng lại khi đã có đủ N-1 cạnh trong cây khung (với N là số lượng đỉnh của đồ thị).
1.3 Ứng dụng thuật toán
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ột thà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ên quan đ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ắt nố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ạnh chính
là chi phí xây dựng đường ray nối hai thành phố tương ứng (chú ý là trong 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ân tuyế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ông
Trang 9thườ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ách nối mạng sao cho tổng chi phí nối mạng là nhỏ nhất.
1.4 Các bước thực hiện
Cho G=(X,E) là một đồ thị có trọng số gồm n đỉnh Thuật toán Kruskal được dùng
để tìm ra cây khung/cây bao trùm ngắn nhất của G như sau:
Bước 1: Duyệt các cạnh của đồ thị G và tạo danh sách các cạnh listEdge.
Bước 2: Sắp xếp lại danh sách các cạnh listEdge của đồ thị G theo trọng số tăng dần, khởi tạo T := Ø.(T là tập cạnh của cây khung hay cây bao trùm của
đồ thị G).
Bước 3: Lấy cạnh e chưa xét có trọng số bé nhất trong danh sách listEdge đã sắp xếp, nếu T E{e} không chứa chu trình thì gán T: = T E{e} Đánh dấu ∪ ∪ cạnh e đã xét.
Bước 4: Nếu hết cạnh chưa xét (tức các cạnh đã xét hết) hoặc T có đủ n-1 cạnh thì dừng, ngược lại làm tiếp tục
Bước 3 Thuật toán dừng, nếu T không có đủ n-1 cạnh thì đồ thị không liên thông và không có cây khung/bao trùm nhỏ nhất Ngược lại thì có cây khung/bao trùm.
Ví dụ:
Trang 10 Bước 1: Liệt kê tất cả cạnh với trọng số của cạnh đó: Dựa vào đồ thị ta liệt kê ra các cạnh gồm đỉnh đầu, đỉnh cuối và trọng số:
Bước 2: Sắp xếp các cạnh theo trọng số tăng dần:
Trang 113 4 3
Bước 3: Dựa vào kết quả ở bước 2 Ta tiến hành tìm cây khung bằng thuật toán Kruskal
Đồ thị G
1-4-1: Ta nhận thấy cạnh 1-4 không tạo ra một chu trình nào Vì vậy, thêm 1-4 vào tập hợp
Đồ thị G
6-7-1: Ta nhận thấy cạnh 6-7 không tạo ra một chu trình nào Vì vậy, thêm 6-7 vào tập hợp
Trang 12Đồ thị G
4-6-2: Ta nhận thấy cạnh 4-6 không tạo ra một chu trình nào Vì vậy, thêm 4-6 vào tập hợp
Đồ thị G
1-2-3: Ta nhận thấy cạnh 1-2 không tạo ra một chu trình nào Vì vậy, thêm 1-2 vào tập hợp
Đồ thị G
1-6-3: Ta nhận thấy cạnh 1-6 tạo ra một chu trình.
Không thêm vào tập hợp.
3-4-3: Ta nhận thấy cạnh 3-4 không tạo ra một chu trình Vì vậy, thêm 3-4 vào tập hợp
Đồ thị G
2-3-4: Ta nhận thấy cạnh 2-3 tạo ra một chu trình.
Không thêm vào tập hợp.
Trang 13Đồ thị G
3-7-5: Ta nhận thấy cạnh 3-7 tạo ra một chu trình.
Không thêm vào tập hợp.
Đồ thị G
5-6-5: Ta nhận thấy cạnh 5-6 không tạo ra một chu trình nào Vì vậy, thêm 5-6 vào tập hợp
Đến đây, ta đã tìm được 6 cạnh Vậy kết thúc thuật toán (Thỏa (*))
Kết quả: Ta được đồ thị sau
Đồ thị G
Với tổng chi phí là: Ta cộng tất cả các trọng số giữa các đỉnh lại với nhau Vậy tổng chi phí: 3 + 1 + 3 + 2 + 5 + 1 = 15
Trang 14CHƯƠNG 2: THUẬT TOÁN FLOYD
2.1 Khái niệm
Thuật toán Floyd-Warshall còn được gọi là thuật toán Floyd được Robert Floyd tìm ra năm 1962 là thuật toán để tìm đường đi ngắn nhất giữa mọi cặp đỉnh Floyd hoạt động được trên đồ thị có hướng, có thể có trọng số âm, tuy nhiên không có chu trình âm Ngoài ra, Floyd còn có thể được dùng để phát hiện chu trình âm.
Thuật toán Floyd-Warshall là một thuật toán tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh trong một đồ thị có trọng số Thuật toán này hoạt động cho cả đồ thị có trọng số có hướng và vô hướng
2.2 Quá trình thực hiện thuật toán Floyd-Warshall sẽ diễn ra như sau:
Chọn lần lượt từng đỉnh của đồ thị làm đỉnh trung gian (ta quy ước là C).
Chọn một cặp 2 đỉnh phân biệt và không trùng với đỉnh trung gian (ta quy ước lần lượt là A và B).
Thực hiện so sánh như ở trên: đường đi ngắn nhất giữa A và B sẽ bằng giá trị nhỏ nhất của:
Giá trị đường đi ngắn nhất hiện thời giữa A và B.
Tổng của giá trị đường đi ngắn nhất hiện thời giữa A và C, và đường đi ngắn nhất hiện thời giữa B và C.
Ví dụ:
Trang 151 2 3 4 5
Đầu tiên, C = 1 Nhờ đỉnh 1 làm trung gian, ta thấy xuất hiện đường đi từ đỉnh
2 tới đỉnh 4 (độ dài 14), và từ đỉnh 2 tới đỉnh 5 (độ dài 6).
Đường đi trung gian qua đỉnh 1 để đi từ đỉnh 4 tới đỉnh 5 không tối ưu về chiều dài (9 + 1 > 2) nên ta không cập nhật lại đường đi ngắn nhất giữa 2 đỉnh 4 và 5.
Tiếp theo, ta duyệt tới C = 2.
Đường đi từ 3 tới 1 (độ dài 7), từ 3 tới 5 (độ dài 8) được hình thành.
Đường đi từ 3 tới 4 không cập nhật độ dài (7 < 2 + 5 + 9).
Trang 165 1 6 8 2 0
Cứ tiếp tục lựa chọn C như vậy cho tới hết, ta sẽ thu được mảng hoàn chỉnh:
Giả sử, qua mảng này, ta thấy đường đi ngắn nhất từ đỉnh 2 tới đỉnh 4 có
độ dài 8 Dựa theo đồ
2.3 Một số ứng dụng của thuật toán
Bên cạnh mục đích chính của thuật toán là tìm đường đi ngắn nhất của các cặp đỉnh Floyd Warshall có thể ứng dụng trong một số bài toán khác được để cập sau đây.
- Giải bài toán tìm đường đi ngắn nhất từ nguồn đơn với đồ thị kích thước nhỏ có trọng số.
- In ra đường đi ngắn nhất
- Xác định tính chất bắc cầu
- Tìm chu trình nhỏ nhất hoặc chu trình âm
- Tìm đường đi ngắn nhất giữa các cặp đỉnh của đồ thị có giá trị lớn nhất
- Được sử dụng để tìm đường đi ngắn nhất trong đồ thị có hướng.
- Để tìm ra ma trận Transitive Closure của đồ thị có hướng.
- Để tìm nghịch đảo của ma trận thực.
Trang 17- Để kiểm tra xem một biểu đồ vô hướng có phải là đồ thị hai phía hay không.
2.4 Đánh giá giải thuật
Độ phức tạp về không gian là O(n^3) với n là số đỉnh trong đồ thị đã cho (do chạy 3 vòng lặp)
Về không gian phức tạp: O (n*n) trong đó n là số đỉnh trong đồ thị đã cho để
xử lí một ma trận n*n để có được thông tin về đường đi tối ưu bằng thuật toán Floyd
CHƯƠNG 3 : CHƯƠNG TRÌNH DEMO
3.1 Giao diện chính
Trang 183.2 Giao diện thuật toán Floyd
3.3 Giao diện thuật toán Krusal
Trang 193.3 Một số chức năng khác
CHƯƠNG 4 : KẾT LUẬN
Lý thuyết đồ thị là một mảng rất rộng Nếu đi hết tất cả các vấn đề của Lý thuyết đồ thị thì đó là một khối lượng kiến thức rất khổng lồ, các vấn đề ứng dụng của
đồ thị cũng rất nhiều, rất phong phú và đa dạng Trong luận văn đã nghiên cứu và
Trang 20trình bày những kiến thức cơ bản về lý thuyết đồ thị và những thuật toán ứng dụng của
đồ thị.
LINK THÔNG TIN CHƯƠNG TRÌNH
Mã nguồn: NghiaCao0809/KrusalvsFloyd (github.com)
Video demo: https://drive.google.com/file/d/1l2J0A2RcQJ_YZm_1tiL4-3VNd0TmshTN/view?usp=sharing
TÀI LIỆU THAM KHẢO
1 Thuật toán Kruskal – Wikipedia tiếng Việt (2022) Retrieved 29 June 2022, from https://vi.wikipedia.org/wiki/Thu%E1%BA%ADt_to%C3%A1n_Kruskal
2 Hoang, C (2014) Thuật toán Kruskal – Tìm cây bao trùm nhỏ nhất Retrieved 29 June 2022, from https://lhchuong.wordpress.com/2014/10/03/thuat-toan-kruskal-tim-cay-bao-trum-nho-nhat/
3 (2022) Retrieved 29 June 2022, from
https://vi.tutorialcup.com/interview/graph/floyd-warshall-algorithm.htm
4 Thuật toán Floyd-Warshall Viblo(2021), from
https://viblo.asia/p/thuat-toan-floyd- warshall-GrLZDBng5k0