Bối cảnh và vấn đề nghiên cứu

Khóa luận tốt nghiệp đại học ngành Công nghệ Thông tin của sinh viên Phongsavath Chanthavong (Trường Đại học Quảng Nam, 2017) với đề tài "Lý thuyết đồ thị và ứng dụng trong bài toán tìm đường đi ngắn nhất" tập trung vào việc hệ thống hóa cơ sở toán học rời rạc và hiện thực hóa giải thuật trên máy tính.

  • Lý do chọn đề tài và bối cảnh thực tiễn: Lý thuyết đồ thị khởi nguồn từ thế kỷ 18 bởi nhà toán học Leonhard Euler qua bài toán bảy cây cầu ở thành phố Konigsberg. Trong lĩnh vực công nghệ thông tin, đồ thị là công cụ mô hình hóa các hệ thống phức tạp (như mạng máy tính, mạng truyền thông, kênh thoại) thành các cấu trúc dữ liệu cụ thể để xử lý trên máy tính tính toán. Nhu cầu tối ưu hóa đường truyền, tìm tuyến đường có chi phí nhỏ nhất giữa các nút mạng đòi hỏi việc nắm vững và ứng dụng các thuật toán đường đi ngắn nhất.
  • Mục tiêu của đề tài: Văn bản xác định 3 mục tiêu cụ thể:
    1. Hiểu rõ các khái niệm cơ bản của lý thuyết đồ thị.
    2. Nắm vững một số thuật toán tìm đường đi ngắn nhất trên đồ thị.
    3. Xây dựng ứng dụng cài đặt thuật toán Floyd để tìm đường đi ngắn nhất trong thực tế.
  • Đối tượng và phạm vi nghiên cứu:
    • Đối tượng nghiên cứu: Cơ sở lý thuyết đồ thị; các thuật toán tìm đường đi ngắn nhất (Ford-Bellman, Dijkstra, Floyd); thuật toán đánh số thứ tự tô-pô cho đồ thị không có chu trình.
    • Phạm vi nghiên cứu: Khảo sát trên đồ thị hữu hạn có hướng/vô hướng có trọng số; xây dựng phần mềm demo minh họa thuật toán Floyd trên nền tảng desktop.

Cơ sở lý thuyết và phương pháp

  • Khung lý thuyết và mô hình toán học:
    • Cấu trúc đồ thị: Đơn đồ thị vô hướng, đa đồ thị vô hướng, giả đồ thị vô hướng (chứa khuyên), đơn đồ thị có hướng, đa đồ thị có hướng. Các định nghĩa về đường đi, chu trình, đồ thị liên thông, thành phần liên thông, đỉnh rẽ nhánh (đỉnh khớp) và cạnh cầu.
    • Khái niệm liên thông có hướng: Liên thông mạnh (tồn tại đường đi giữa mọi cặp đỉnh có hướng) và liên thông yếu (đồ thị vô hướng tương ứng là liên thông).
    • Bài toán đường đi ngắn nhất: Tìm đường đi có tổng trọng số $d(s, t) = \sum a(u, v)$ nhỏ nhất từ đỉnh $s$ đến đỉnh $t$. Điều kiện tối ưu dựa trên bất đẳng thức tam giác và thủ tục gán nhãn cận trên: $d[v] = d[u] + a[u, v]$ khi $d[u] + a[u, v] < d[v]$.
    • Thuật toán quy hoạch động và duyệt đồ thị: Thuật toán Ford-Bellman (xử lý trọng số âm, không có chu trình âm), thuật toán Dijkstra (trọng số không âm), thuật toán Floyd (tìm đường đi ngắn nhất giữa mọi cặp đỉnh), thuật toán Numbering (đánh số đồ thị không chu trình với độ phức tạp $O(n^2)$ dựa trên bán bậc vào $\text{deg}^-(v) = 0$).
  • Phương pháp nghiên cứu thực tế:
    • Phương pháp phân tích - tổng hợp tài liệu: Thu thập, trích chọn tài liệu toán rời rạc và cấu trúc dữ liệu giải thuật.
    • Phương pháp so sánh, đánh giá giải thuật: Đánh giá độ phức tạp tính toán giữa các thuật toán tìm đường đi đơn nguồn và mọi cặp đỉnh.
    • Phương pháp thực nghiệm - phát triển phần mềm: Cài đặt thuật toán Floyd, thiết kế cấu trúc dữ liệu đồ họa (Node, Edge, Matrix) và xây dựng giao diện tương tác trực quan.
  • Nguồn dữ liệu: Các ma trận trọng số mẫu, đồ thị thực nghiệm 5 đỉnh và 6 đỉnh được trích dẫn trong giáo trình và tài liệu chuyên ngành.

Thiết kế và triển khai

Khóa luận tiến hành hiện thực hóa một phần mềm mô phỏng trực quan thuật toán đồ thị:

  • Môi trường và công nghệ phát triển:
    • Ngôn ngữ lập trình: C#.
    • Môi trường phát triển tích hợp (IDE): Microsoft Visual Studio 2010.
    • Nền tảng giao diện: Windows Forms (.NET Framework).
  • Kiến trúc các lớp đối tượng chính:
    • Node.cs (Kế thừa từ Control): Quản lý việc hiển thị đỉnh đồ thị trên giao diện. Lớp hỗ trợ các thuộc tính DisplayName, Index, Selected, cùng các phương thức hiệu ứng chuyển động khi thêm đỉnh (DoCreatingAnimation) hoặc xóa đỉnh (DoRemovingAnimation), phương thức vẽ hình elip (OnPaint) và xử lý sự kiện chuột (OnMouseDown).
    • Matrix.cs (Kế thừa từ Control): Quản lý ma trận kề và ma trận khoảng cách. Lớp này chứa cấu trúc dữ liệu FloydCell (gồm 2 trường Previous và Value), mảng 2 chiều FloydData, phương thức tính toán Floyd() để cập nhật khoảng cách ngắn nhất, và các điểm điều khiển (_rectHandle1 đến _rectHandle4) hỗ trợ thay đổi kích thước ma trận trực tiếp trên giao diện bằng chuột.
    • Edge.cs và EdgeCollection: Quản lý danh sách các cạnh/cung trong đồ thị. Edge lưu trữ đỉnh bắt đầu (Start), đỉnh kết thúc (End), cờ xác định đồ thị vô hướng (IsUndirected), và phương thức kiểm tra tọa độ điểm nhấn chuột trên đoạn thẳng dựa trên công thức tính diện tích Heron:

$$S = \sqrt{p(p-v_1)(p-v_2)(p-v_3)} \implies h = \frac{2S}{v_1} < \text{EPSILON}$$

  • Thiết kế giao diện người dùng (Form):
    • Các điều khiển giao diện chính gồm: ComboBox cboFrom (chọn đỉnh xuất phát), ComboBox cboTo (chọn đỉnh đích), Button cmdDuongDi (kích hoạt tìm đường đi ngắn nhất), Button cmdXoaHet (xóa dữ liệu đồ thị trên màn hình), CheckBox chkVoHuong (chuyển đổi chế độ đồ thị có hướng/vô hướng), và các vùng chứa panel1, panel2.

Nội dung chính theo từng chương

Chương 1: Tổng quan về lý thuyết đồ thị

Chương này trình bày hệ thống định nghĩa toán học nền tảng của lý thuyết đồ thị gắn liền với bài toán mô phỏng hệ thống mạng máy tính:

  • Phân loại đồ thị qua mô hình mạng máy tính:
    • Đơn đồ thị vô hướng $G=(V,E)$: Mỗi cặp máy tính có tối đa một kênh thoại hai chiều, không có khuyên.
    • Đa đồ thị vô hướng: Giữa hai máy tính có thể có nhiều kênh thoại truyền tải thông tin (cạnh lặp).
    • Giả đồ thị vô hướng: Xuất hiện kênh thoại nối máy tính với chính nó (khuyên dạng $e=(u,u)$).
    • Đơn đồ thị và Đa đồ thị có hướng: Các kênh thoại chỉ cho phép truyền tin một chiều (cung có thứ tự).
  • Đường đi, chu trình và tính liên thông:
    • Đường đi độ dài $n$ từ $u$ đến $v$ là dãy đỉnh $x_0, x_1, \dots, x_n$ với $(x_i, x_{i+1}) \in E$. Chu trình là đường đi khép kín ($u=v$). Đường đi hoặc chu trình gọi là đơn nếu không có cạnh nào bị lặp lại.
    • Khái niệm thành phần liên thông, đỉnh rẽ nhánh (đỉnh khớp - loại bỏ làm tăng số thành phần liên thông), cạnh cầu.
    • Phân biệt liên thông mạnh (tồn tại đường đi có hướng giữa mọi cặp đỉnh) và liên thông yếu (chỉ liên thông khi xét đồ thị vô hướng tương ứng).
  • Khái niệm đường đi ngắn nhất và Đồ thị không có chu trình (DAG):
    • Độ dài đường đi là tổng trọng số các cung. Trường hợp xuất hiện chu trình âm, khoảng cách giữa các cặp đỉnh có thể tiến về $-\infty$.
    • Đối với đồ thị không có chu trình, các đỉnh có thể đánh số thứ tự tô-pô sao cho mọi cung $(v_i, v_j)$ đều có $i < j$. Tác giả trình bày thuật toán Numbering sử dụng hàng đợi QUEUE và mảng bán bậc vào Vao[v] với độ phức tạp $O(n^2)$.

Chương 2: Một số thuật toán tìm đường đi ngắn nhất trên đồ thị

Chương 2 đi sâu vào các giải thuật tìm đường đi ngắn nhất, phân chia theo bài toán xuất phát từ một đỉnh (đơn nguồn) và bài toán giữa tất cả các cặp đỉnh:

  • Kỹ thuật gán nhãn và Thuật toán Ford-Bellman:
    • Thuật toán áp dụng cho đồ thị có trọng số tùy ý, không có chu trình âm. Độ phức tạp là $O(n^3)$ khi dùng ma trận trọng số hoặc $O(n \cdot m)$ khi dùng danh sách kề Ke(v). Vòng lặp dừng khi $k = n-2$ hoặc khi không còn nhãn $d[v]$ nào bị thay đổi giá trị.
    • Bảng tính toán từng bước của thuật toán Ford-Bellman trên đồ thị 5 đỉnh:
Bước lặp ($k$) $d[1], \text{Truoc}[1]$ $d[2], \text{Truoc}[2]$ $d[3], \text{Truoc}[3]$ $d[4], \text{Truoc}[4]$ $d[5], \text{Truoc}[5]$
$k = 0$ 0, 1 1, 1 $\infty$, 1 $\infty$, 1 3, 1
$k = 1$ 0, 1 1, 1 4, 2 4, 2 -1, 3
$k = 2$ 0, 1 1, 1 4, 2 3, 5 -1, 3
$k = 3$ 0, 1 1, 1 4, 2 3, 5 -1, 3
  • Thuật toán Dijkstra:
    • Áp dụng cho đồ thị có trọng số không âm, tối ưu hơn Ford-Bellman nhờ giảm số vòng lặp lồng nhau qua việc duy trì tập đỉnh chưa cố định nhãn $T = V \setminus {a}$. Mỗi bước chọn đỉnh $i \in T$ có $L[i] = \min {L[j] \mid j \in T}$, loại $i$ khỏi $T$ và cập nhật nhãn các đỉnh lân cận.
  • Bài toán tìm đường đi ngắn nhất giữa mọi cặp đỉnh và Thuật toán Floyd:
    • Thuật toán Floyd lặp qua $k$ từ $1$ đến $n$ để cập nhật ma trận khoảng cách $D_k$: $d^k(i, j) = \min(d^{k-1}(i, j), d^{k-1}(i, k) + d^{k-1}(k, j))$.
    • Quá trình biến đổi ma trận khoảng cách qua đồ thị thực nghiệm 6 đỉnh:

Ma trận ban đầu $D_0$ (các vị trí không có cạnh nối trực tiếp mang giá trị $\infty$):

Đỉnh 1 2 3 4 5 6
1 $\infty$ 7 $\infty$ $\infty$ $\infty$ 2
2 $\infty$ $\infty$ 4 1 $\infty$ $\infty$
3 $\infty$ $\infty$ $\infty$ $\infty$ 3 $\infty$
4 $\infty$ $\infty$ $\infty$ $\infty$ 4 $\infty$
5 2 $\infty$ $\infty$ $\infty$ $\infty$ 2
6 $\infty$ 1 $\infty$ $\infty$ $\infty$ $\infty$

Ma trận kết quả cuối cùng $D_6$ (khoảng cách ngắn nhất giữa tất cả các cặp đỉnh):

Đỉnh 1 2 3 4 5 6
1 9 3 7 4 7 2
2 6 7 4 1 5 8
3 5 8 9 6 3 7
4 6 9 10 7 4 8
5 2 3 7 4 7 2
6 7 1 5 2 6 9

Chương 3: Xây dựng ứng dụng

Chương này trình bày việc thiết kế phần mềm demo giải thuật:

  • Đặc tả chi tiết mã nguồn các module đồ họa và giải thuật trong namespace FloydDemo.
  • Cài đặt cấu trúc lưu vết FloydCell để truy vết đường đi ngắn nhất giữa hai đỉnh bất kỳ sau khi hoàn tất quy hoạch động ma trận.
  • Cài đặt cơ chế bắt sự kiện chuột trên Windows Forms để người dùng có thể vẽ đỉnh, nối cạnh có trọng số, di chuyển và kéo giãn kích thước bảng ma trận trực quan.

Kết quả và đóng góp

  • Kết quả đạt được:
    • Hệ thống hóa toàn diện cơ sở toán học về lý thuyết đồ thị, phân loại rõ ràng cấu trúc đồ thị vô hướng, có hướng, đồ thị liên thông và đồ thị phi chu trình (DAG).
    • Cung cấp bảng tính chi tiết từng bước (trace matrix/table) minh chứng tính đúng đắn của 3 giải thuật: Ford-Bellman (5 đỉnh, 3 bước lặp), Dijkstra (bước 1 và bước 2), và Floyd (6 đỉnh, từ ma trận $D_0$ đến ma trận nghiệm $D_6$).
    • Xây dựng thành công ứng dụng demo bằng C# trên Visual Studio 2010 với đầy đủ các tính năng nhập liệu đồ thị trực quan, chuyển đổi vô hướng/có hướng, tự động sinh ma trận kề và giải bài toán đường đi ngắn nhất bằng thuật toán Floyd.
  • Đóng góp của đề tài:
    • Cung cấp tài liệu tổng hợp có tính hệ thống cao về lý thuyết đồ thị và các phương pháp tìm đường đi ngắn nhất.
    • Chuyển tải thuật toán lý thuyết trừu tượng thành công cụ trực quan hóa phần mềm, phục vụ mục đích học tập và nghiên cứu thuật toán.

Hạn chế và hướng nghiên cứu tiếp

  • Hạn chế:
    • Khóa luận mới chỉ dừng lại ở việc mô phỏng giải thuật trên không gian đồ thị lý thuyết và đồ thị tự vẽ trên máy tính, chưa kết nối với các nguồn dữ liệu mạng lưới thực tế (như dữ liệu bản đồ giao thông đường bộ GIS hoặc bản đồ topology mạng viễn thông thực tế).
    • Phần mềm demo chủ yếu tập trung hiện thực hóa giao diện cho thuật toán Floyd; các thuật toán khác (Ford-Bellman, Dijkstra) mới dừng lại ở việc khảo sát lý thuyết và tính toán bảng số liệu mẫu.
  • Hướng nghiên cứu tiếp:
    • Mở rộng ứng dụng để cài đặt đồng thời cả thuật toán Ford-Bellman và Dijkstra trên cùng một giao diện tương tác so sánh hiệu năng.
    • Ứng dụng giải thuật tìm đường đi ngắn nhất vào các bài toán thực tế quy mô lớn như định tuyến mạng máy tính tự động hoặc bài toán logistics giao hàng.

Giá trị tham khảo

  • Đối tượng hưởng lợi:
    • Sinh viên ngành Công nghệ thông tin, Khoa học máy tính, Sư phạm Tin học và Toán tin đang học các học phần Toán rời rạc, Cấu trúc dữ liệu và giải thuật, Lý thuyết đồ thị.
    • Lập trình viên muốn tham khảo cách xây dựng các công cụ đồ họa tương tác cơ bản (vẽ đỉnh, vẽ cạnh, xử lý sự kiện GDI+) bằng C# Windows Forms.
  • Nội dung giá trị nhất:
    • Các bảng truy vết ma trận từng bước ($D_0 \to D_6$) của thuật toán Floyd và bảng lặp của Ford-Bellman, hỗ trợ kiểm tra đối chiếu khi giải bài tập thuật toán.
    • Mã nguồn xây dựng cấu trúc Matrix và FloydCell để cài đặt thuật toán Floyd trong môi trường lập trình hướng đối tượng.

Câu hỏi thường gặp

1. Khóa luận sử dụng ví dụ thực tiễn nào để giải thích sự cần thiết của các loại đồ thị khác nhau?
Tác giả sử dụng mô hình hệ thống mạng máy tính và các kênh thoại kết nối giữa các máy tính. Ví dụ: kênh thoại truyền thông tin hai chiều tương ứng với đơn đồ thị vô hướng; nhiều kênh thoại giữa hai máy tương ứng với đa đồ thị; kênh thoại nối máy tính với chính nó (để thông báo) tương ứng với giả đồ thị (có khuyên); và các kênh truyền dữ liệu một chiều (như máy chủ tại Hà Nội chỉ nhận tin từ địa phương) tương ứng với đồ thị có hướng.

2. Điểm khác biệt căn bản về phạm vi áp dụng giữa thuật toán Ford-Bellman và Dijkstra là gì?
Theo trình bày trong văn bản, thuật toán Dijkstra chỉ áp dụng được cho đồ thị có trọng số không âm với độ phức tạp tối ưu hơn nhờ giảm số vòng lặp lồng nhau. Ngược lại, thuật toán Ford-Bellman (độ phức tạp $O(n^3)$ hoặc $O(n \cdot m)$) có thể làm việc trên đồ thị có trọng số âm tùy ý, miễn là đồ thị không chứa chu trình âm.

3. Nguyên lý đánh số đỉnh trong đồ thị không có chu trình (DAG) được xây dựng như thế nào?
Thuật toán Numbering (độ phức tạp $O(n^2)$) dựa trên nguyên lý: một đồ thị không có chu trình luôn tồn tại ít nhất một đỉnh có bán bậc vào bằng 0 ($\text{deg}^-(v) = 0$). Thuật toán đưa các đỉnh này vào hàng đợi QUEUE, gán số thứ tự tăng dần từ 1, sau đó loại bỏ đỉnh đã đánh số cùng các cung đi ra khỏi nó để thu được đồ thị con mới không chu trình và lặp lại quá trình cho đến hết.

4. Ứng dụng demo trong Chương 3 cài đặt thuật toán nào và sử dụng cấu trúc dữ liệu gì để lưu trữ vết đường đi?
Ứng dụng demo cài đặt thuật toán Floyd bằng ngôn ngữ C# trong Visual Studio 2010. Để lưu trữ vết đường đi ngắn nhất giữa mọi cặp đỉnh, ứng dụng sử dụng cấu trúc struct FloydCell gồm hai trường dữ liệu: Value (lưu độ dài đường đi ngắn nhất) và Previous (lưu đỉnh nằm ngay trước đỉnh đích trên lộ trình tối ưu).

Kết luận

Khóa luận của tác giả Phongsavath Chanthavong đã tổng hợp một cách có hệ thống các khái niệm cốt lõi của lý thuyết đồ thị và cơ chế hoạt động của các thuật toán tìm đường đi ngắn nhất kinh điển (Ford-Bellman, Dijkstra, Floyd). Nghiên cứu không chỉ dừng lại ở phân tích toán học và biểu diễn bảng truy vết ma trận chi tiết mà còn hiện thực hóa thành công thuật toán Floyd thành phần mềm đồ họa tương tác trực quan trên ngôn ngữ C#. Đây là tài liệu học thuật và tham khảo kỹ thuật hữu ích cho sinh viên công nghệ thông tin trong việc nghiên cứu và ứng dụng thuật toán đồ thị.