1. Trang chủ
  2. » Luận Văn - Báo Cáo

đề tài mô tả thuật toán dijkstra và thuật toán kruskal

16 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 1,21 MB

Nội dung

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 1

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

Thành phố Hồ Chí Minh 16, tháng 12, năm 2023

Trang 2

BỘ 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 3

Mụ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 4

LỜ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 5

CHƯƠ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 6

CHƯƠ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 7

CHƯƠ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 8

Nhâ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 10

int 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 11

Egdes = 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 12

private 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 13

Nhấ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 16

CHƯƠ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

Ngày đăng: 13/07/2024, 16:50

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN