Trang 1 BÁO CÁO ĐỒ ÁN MÔN HỌCLÝ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNGĐỀ TÀI : MƠ TẢ THUẬT TỐN DIJKSTRA VÀ THUẬT TOÁN KRUSKAL Trang 2 BỘ GIÁO DỤC VÀ ĐÀO TẠOTRƯỜNG ĐẠI HỌC SƯ PHẠM TP.. 4CHƯƠNG 2:
Trang 1BÁO CÁO ĐỒ ÁN MÔN HỌC
LÝ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNG
ĐỀ TÀI : MÔ TẢ THUẬT TOÁN DIJKSTRA VÀ THUẬT TOÁN KRUSKAL
Thành phố Hồ Chí Minh 16, tháng 12, năm 2023
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM TP HCM KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO ĐỒ ÁN MÔN HỌC
LÝ THUYẾT ĐỒ THỊ VÀ ỨNG DỤNG
ĐỀ TÀI : MÔ TẢ THUẬT TOÁN DIJKSTRA VÀ THUẬT TOÁN KRUSKAL
Nhóm thực hiện : Nhóm LINK
Thành viên: Trần Thanh Đạt – 48.01.103.012
Lưu Thành Đạt – 47.01.104.062
Trần Hoang Luận – 46.01.104.098
Giảng viên hướng dẫn : T.S Nguyễn Viết Hưng,Th.S Nguyễn Phương Nam
Mã học phần : COMP170106
Thành phố Hồ Chí Minh 16, tháng 12, năm 2023
Trang 3Mục lục
LỜI NÓI ĐẦU 3
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 4
1.1 Lý do chọn đề tài 4
1.2 Mục tiêu nghiên cứu 4
1.3 Đối tượng nghiên cứu 4
CHƯƠNG 2: CƠ SỞ VỀ LÝ THUYẾT VỀ THUẬT TOÁN KRUSCAL VÀ DIJKSTRA 5
2.1 Thuật toán Kruscal 5
2.2 Thuật toán Dijkstra 5
CHƯƠNG 3: GIỚI THIỆU CHƯƠNG TRÌNH 6
3.1 Giao diện chính của chương trình 6
3.2 Các file xử lý thuật toán có trong chương trình 6
3.3 Các chức năng chính 6
3.3.1 Vẽ Đồ Thị 6
3.3.2 Các thuật toán mà chương trình hỗ trợ 14
CHƯƠNG 4: HƯỚNG DẪN SỬ DỤNG 15
4.1 Source Code 15
4.2 Chạy chương trình 15
TÀI LIỆU THAM KHẢO 15
2
Trang 4LỜI NÓI ĐẦU Chúng em xin chân thành cảm ơn Khoa Công Nghệ Thông Tin, trường Đại Học
Sư Phạm TPHCM đã tạo điều kiện tốt cho chúng em thực hiện đề tài này Chúng em xin chân thành cảm ơn Thầy Nguyễn Phương Nam- người đã tận tình hướng dẫn chỉ bảo chúng em trong suốt thời gian thực hiện đề tài Chúng em cũng xin cảm ơn thầy Nguyễn Phương Nam đã có những trao đổi, những chỉ dẫn giúp chúng em giải quyết các vấn đề và hoàn thiện đề tài
Tuy nhiên trong quá trình thực hiện, do kiến thức chuyên ngành còn hạn chế nên
em vẫn còn nhiều thiếu sót khi tìm hiểu, trình bày, thực hiện đồ án Rất mong nhận được sự quan tâm, góp ý của Thầy để đồ án của em được đầy đủ và hoàn chỉnh hơn
Em xin chân thành cảm ơn!
Trang 5CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI
1.1 Lý do chọn đề tài
Lý thuyết đồ thị là một ngành khoa 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ư tưởng cơ bản của lý thuyết đồ thị được đề xuất vào những năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc người Thụy Sỹ Lenhard Eurler Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng về các cái cầu ở thành phố Konigsberg Lý thuyết đồ thị là một lĩnh vực quan trọng trong toán học và khoa học máy tính, có nhiều ứng dụng thực tế rộng rãi trong nhiều lĩnh vực khác nhau Chẳng hạn, đồ thị có thể được sử dụng để mô hình hóa và phân tích mạng lưới
xã hội, mạng máy tính, mạng giao thông, mạng điện, mạng nước, vv.Các thuật toán như Dijktra và Ford – Bellman được ứng dụng trong việc Tìm đường đi ngắn nhất giữa hai điểm trong một mạng lưới, cũng được sử dụng để tối ưu hóa vận chuyển hàng hóa
và quản lý tuyến đường Đặc biết trong thời gian gần đây, cùng với sự phát triển nhanh chóng của tin học, lý thuyết đồ thị ngày càng được quan tâm nhiều hơn Nhóm em và các bạn hân hạn được học kiến thức này ở chương trình đại học
Trong xuyên suốt quá trình học lý thuyết đồ thị, nhóm em rất tò mò về các thuật toán Dijkstra và Kruscal, nên khi được chọn đề tài thì nhóm em đã lựa chọn đề tài
“Minh họa thuật toán Kruscal và Dijkstra” để nghiên cứu tìm hiểu cách thức hoạt động
và tạo nên một giao diện trực quan để hiểu hơn về các thuật toán Dijkstra và Kruscal
1.2 Mục tiêu nghiên cứu
Việc làm đồ án này giúp chúng em hiểu biết hơn về các thuật toán tìm cây khung ngắn nhất bằng thuật toán Kruscal và tìm đường đi ngắn nhất bằng thuật toán Dijkstra Đồng thời tạo ra một giao diện trực quan để thầy và các bạn có cái nhìn trực quan hơn về thuật toán này
1.3 Đối tượng nghiên cứu
Thuật toán Dijsktra
Thuật toán Kruscal
Thiết kế giao diện trực quan
1.4 Phạm vi nghiên cứu
Các khái niệm cơ bản và các thuật toán nằm trong giới hạn của môn học
Mô tả thuật toán và giao diện trực quan bằng ngôn ngữ lập trình C# Windows
4
Trang 6CHƯƠNG 2: CƠ SỞ VỀ LÝ THUYẾT VỀ THUẬT
TOÁN KRUSCAL VÀ DIJKSTRA
2.1 Thuật toán Kruscal
Định nghĩa: Thuật toán Kuscal là một thuật toán quan trọng trong lý thuyết đồ thị, được sử dụng để tìm cây bao phủ tối thiểu (minium spanner tree) của một đồ thị liên thông có trọng số
Vd: Cho G = (V, E) là một đồ thị liên thông có trọng số gồm n đỉnh
Giải thuật:
1 Bước 1: Sắp xếp các cạnh theo thứ tự độ dài tăng dần và khởi tạo: T=0
2 Bước 2: Lần lượt lấy từng cạnh e trong danh sách đã sắp xếp Nếu T + {e} không tạo thành chu trình thì gán T = T +{e}
3 Bước 3: 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
2.2 Thuật toán Dijkstra
Định nghĩa: Thuật toán Dijkstra là một thuật toán quan trọng trong lý thuyết đồ thị, được sử dụng để tìm đường đi ngắn nhất từ một đỉnh đến tất cả các đỉnh còn lại trong một đồ thị có trọng số không âm Dijkstra thường được sử dụng trong việc tìm đường
đi ngắn nhất trong các mạng lưới, hệ thống định tuyến, tối ưu hóa đường đi trong giao thông và nhiều lĩnh vực khác
Giải thuật:
Đây là một mô tả của thuật toán Dijkstra trong ngôn ngữ mã giả
Bước 1: Khởi tạo tập hợp T với đỉnh xuất phát X Đặt khoảng cách từ X đến chính nó (`Length[x]`) bằng 0, và đối với mỗi đỉnh k không thuộc X (`kX\{x}`), đặt `Length[k]` bằng dương vô cùng, và `LastV[k]` bằng -1
Bước 2: Nếu tất cả các đỉnh trong T, kể cả y, đã được xét thì dừng thuật toán Bước 3: Chọn đỉnh v thuộc T sao cho `Length[v]` là nhỏ nhất và loại bỏ v khỏi T Bước 4: Duyệt qua tất cả các đỉnh k thuộc T và có cạnh nối từ v đến k Nếu
`Length[k]` lớn hơn `Length[v] + Lvk` (Lvk là trọng số của cạnh từ v đến k), thì cập nhật `Length[k]` thành `Length[v] + Lvk` và `LastV[k]` thành v
Bước 5: Quay lại Bước 2 để tiếp tục quá trình cho đến khi tất cả các đỉnh trong T đã được xét
Thuật toán này có mục tiêu là tìm đường đi ngắn nhất từ đỉnh xuất phát X đến tất cả các đỉnh khác trong đồ thị, cập nhật khoảng cách ngắn nhất khi tìm thấy đường đi tốt hơn
Trang 7CHƯƠNG 3: GIỚI THIỆU CHƯƠNG TRÌNH
3.1 Giao diện chính của chương trình
Hình 3.1: Giao diện chính của chương trình
Chúng em xin giới thiệu các file, hàm sự kiện còn lại của chương trình
Egde.cs: Định nghĩa các cạnh của đồ thị và các hàm bổ trợ
FS-Graph.cs: Xử lý thuật toán trong chương trình
NodeGraph.cs: Định nghĩa đỉnh và các hàm bổ trợ
3.3 Các chức năng chính
3.3.1 Vẽ Đồ Thị
Vẽ Đỉnh
6
Trang 8Nhâp chuột vào button “Thêm” phía trên, khi đó cứ mỗi lần nhấp vào màn hình ở vị trí nào thì sẽ tạo một đỉnh ngay tại vị trí đó
Code:
private void pnlVeDoThi_MouseClick(object sender, MouseEventArgs e)
{
if (Checkiconbtn == true)
{
Button btn = new Button();
btn.Width = 30;
btn.Height = 30;
btn.Location = new Point(e.X, e.Y);
btn.Name = string.Format("{0},{1}", e.X, e.Y);
btn.Text = string.Format("{0}", sodinh++);
btn.Click += new EventHandler(getToaDo);
pnlVeDoThi.Controls.Add(btn);
Nod.x = e.X;
Nod.y = e.Y;
ListarrNod.Add(Nod);
Nod = new NodeGraph();
}
}
Xóa đỉnh
Chọn vị trí chứa đỉnh muốn xóa sau đó click vào button “Xóa” Khi xóa đỉnh các cạnh nối đỉnh với các cạnh khác đều bị xóa theo.
Đỉnh khi chưa xóa:
Trang 9Đỉnh sau khi xóa:
Code:
private void btnXoaDinh_Click(object sender, EventArgs e)
{
if (ListarrNod.Count == 0)
{
MessageBox.Show("Không còn đỉnh để Xxa" "Thông Báo", , MessageBoxButtons.OK, MessageBoxIcon.Warning);
Nod = new NodeGraph();
Egdes = new Egde();
btncreate = null;
dx = dy = dx1 = dy1 = 0;
d1 = d2 = -1;
Dinh1 = Dinh2 = -1;
return;
}
if (btncreate != null)
{
int n = 0;
8
Trang 10int tmp = ListarrNod.Count();
Nod.x = btncreate.Location.X;
Nod.y = btncreate.Location.Y;
NodeGraph NodEgde = new NodeGraph();
NodEgde.x = btncreate.Location.X + 12;
NodEgde.y = btncreate.Location.Y + 12;
pnlVeDoThi.Controls.Clear();
pnlVeDoThi.Invalidate();
pnlVeDoThi.Refresh();
for (int i = 0; i < ListarrEgde.Count; i++)
{
if (!NodEgde.SoSanhNodeVH(ListarrEgde[i]))
{
VeDoThi1(ListarrEgde[i]);
}
else
{
ListarrEgde.RemoveAt(i);
i = i - 1;
}
}
for (int i = 0; i < ListarrNod.Count; i++)
{
if (!Nod.SoSanhNode(ListarrNod[i]))
{
Button btn = new Button();
btn.Width = 30;
btn.Height = 30;
btn.Location = new Point(ListarrNod[i].x, ListarrNod[i].y);
btn.Text = string.Format("{0}", n++);
btn.Click += new EventHandler(getToaDo);
pnlVeDoThi.Controls.Add(btn);
}
else
{
PtuxoaNod = i;
}
}
if (PtuxoaNod != -1 && ListarrNod.Count > 0)
{
ListarrNod.RemoveAt(PtuxoaNod);
Nod = new NodeGraph();
Trang 11Egdes = new Egde();
btncreate = null;
dx = dy = dx1 = dy1 = 0;
d1 = d2 = -1;
Dinh1 = Dinh2 = -1;
}
if (tmp > ListarrNod.Count() && cbxLoaiDoThi.Text == "Đồ Thị Có Hướng")
{
TaolaiMaTranCH();
}
if (tmp > ListarrNod.Count() && cbxLoaiDoThi.Text == "Đồ Thị Vô Hướng")
{
TaolaiMaTranVH();
}
else
{
MessageBox.Show("Bạn chưa chọn đỉnh" "Thông Báo", ,
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
Nod = new NodeGraph();
Egdes = new Egde();
btncreate = null;
dx = dy = dx1 = dy1 = 0;
d1 = d2 = -1;
Dinh1 = Dinh2 = -1;
}
Vẽ Cạnh
Muốn tạo cạnh thì ta chỉ cần nhấp vào 2 đỉnh muốn tạo cạnh, nhập hệ số của cạnh
đó, sau đó bấm vào button “Thêm” phía dưới với lựa chọn là cạnh vô hướng hay cạnh có hướng nếu không chọn chương trình mặc định là tạo cạnh vô hướng
10
Trang 12private void btnThemCanh_Click(object sender, EventArgs e)
{
if (txtTrongSo.Text == "0" && cbxChucNang.Text != "Dijkstra")
{
MessageBox.Show("Trọng số bằng 0 không thể vẽ cạnh" "Thông Báo", , MessageBoxButtons.OK, MessageBoxIcon.Warning);
Egdes = new Egde();
Nod = new NodeGraph();
btncreate = null;
dx = dy = dx1 = dy1 = 0;
d1 = d2 = -1;
Dinh1 = Dinh2 = -1;
labTrongSo.Text = "Trọng Số";
txtTrongSo.Text = string.Empty;
txtKetqua.Text = "Kết Quả";
return;
}
VeDoThi(Egdes);
Egdes = new Egde();
Nod = new NodeGraph();
btncreate = null;
dx = dy = dx1 = dy1 = 0;
d1 = d2 = -1;
Dinh1 = Dinh2 = -1;
labTrongSo.Text = "Trọng Số";
txtKetqua.Text = "Kết Quả";
txtTrongSo.Text = string.Empty;
}
Xóa Cạnh
Trang 13Nhấp vô 2 đỉnh chứa cạnh muốn xóa rồi nhấn vào button “Xóa”.
Cạnh trước khi xóa:
Cạnh sau khi xóa:
Code:
private void btnXoaCanh_Click(object sender, EventArgs e)
{
if (ListarrEgde.Count == 0)
{
MessageBox.Show("Không còn cạnh nào để xóa" "Thông Báo", ,
MessageBoxButtons.OK, MessageBoxIcon.Warning);
Nod = new NodeGraph();
Egdes = new Egde();
btncreate = null;
dx = dy = dx1 = dy1 = 0;
d1 = d2 = -1;
Dinh1 = Dinh2 = -1;
return;
}
if (btncreate == null)
{
MessageBox.Show("Bạn chưa chọn cạnh" "Thông Báo", , MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
pnlVeDoThi.Invalidate();
pnlVeDoThi.Refresh();
int n = ListarrEgde.Count;
for (int i = 0; i < ListarrEgde.Count; i++)
12
Trang 14{
if (cbxLoaiDoThi.Text == "Đồ Thị Vô Hướng")
{
if (!ListarrEgde[i].SoSanhEgdeVH(Egdes))
{
VeDoThi1(ListarrEgde[i]);
}
else
{
ListarrEgde.RemoveAt(i);
i = i - 1;
Matrix[d1, d2] = 0;
Matrix[d2, d1] = 0;
}
}
if (cbxLoaiDoThi.Text == "Đồ Thị Có Hướng")
{
if (!ListarrEgde[i].SoSanhEgdeCH(Egdes))
{
VeDoThi1(ListarrEgde[i]);
}
else
{
ListarrEgde.RemoveAt(i);
i = i - 1;
Matrix[d1, d2] = 0;
}
if (false || !CheckHuong && ListarrEgde.Count >= 1)
{
CheckHuong = ListarrEgde[i].CheckHuong(Egdes);
}
}
}
if (ListarrEgde.Count > 0)
{
if (cbxLoaiDoThi.Text == "Đồ Thị Có Hướng" && n == ListarrEgde.Count) {
MessageBox.Show("Không tồn tại đường đi" "Thông Báo", ,
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
if (cbxLoaiDoThi.Text == "Đồ Thị Vô Hướng" && n == ListarrEgde.Count)
Trang 15{
MessageBox.Show("Không tồn tại đường đi" "Thông Báo", ,
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
Egdes = new Egde();
Nod = new NodeGraph();
btncreate = null;
dx = dy = dx1 = dy1 = 0;
d1 = d2 = -1;
Dinh1 = Dinh2 = -1;
CheckHuong = false;
}
3.3.2 Các thuật toán mà chương trình hỗ trợ
Chúng ta có thể chọn một trong các thuật toán để mô phỏng sau:
Dijktra
Kruscal
14
Trang 16CHƯƠNG 4: HƯỚNG DẪN SỬ DỤNG
4.1 Source Code
4.2 Chạy chương trình
Chương trình chạy trên Visual Studio, sử dụng những ngôn ngữ như
Xem video demo để hiểu chi tiết hơn
KẾT LUẬN Qua quá trình học tập cũng như giảng giải của thầy, nhóm LINK chúng em đã hoàn thành đồ án cuối kì một cách thuận lợi trong việc mô phỏng 2 thuật toán quan trọng trong lý thuyết đồ thị là Dijkstra và Kruskal bằng giao diện đồ họa
Tuy vậy trong qua trình hoàn thành đề tài thì nhóm em gặp phải nhiều vấn đề và kién thúc tụi em truyền đạt có phần sơ sài, mong thầy cố thông cảm
TÀI LIỆU THAM KHẢO