1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Mô phỏng thuật toán của lý thuyết đồ thị

28 32 0

Đ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 28
Dung lượng 2,27 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đồ thị có trọng số trên các cạnh có thể sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạnh giao thông.. Các thuật toán trên đồ thị đã có nhiều ứng dụn

Trang 1

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

TIỂU LUẬN

<MÔ PHỎNG THUẬT TOÁN CỦA LÝ THUYẾT ĐỒ THỊ>

Học phần: <COMP101904 – Lập Trình trên Window>

Thành phố Hồ Chí Minh, ngày 15 tháng 12 năm 2021

Trang 2

LỜI CAM ĐOAN

Nhóm Windows Progamming chúng em xin giới thiệu với thầy và mọi người đề tài ”Mô phỏng thuật toán của Lý Thuyết Đồ Thị” Chúng em chọn đề tài này vì nó thiết thực và bổ ích cho các bạn sinh viên trong học tập cũng như tron

Trong quá trình thực hiện đề tài này còn có nhiều thiếu sót do kiến thức còn sơ sài nhưng những nội dung trình bày trong quyển báo cáo này là những biểu hiện kết quả của chúng em đạt được dưới sự hướng dẫn của Thạc sĩ Võ Tiến An

Chúng em xin cam đoan rằng: Những nội dung trình bày trong quyển báo cáo đồ án môn Lập Trình trên Window là do chúng em viết dựa trên tài liệu và hướng dẫn của thầy Nếu không đúng sự thật, chúng em xin chịu mọi trách nhiệm trước thầy.

Trang 3

MỤC LỤC

NHIỆM VỤ THÀNH VIÊN NHÓM 4

MỞ ĐẦU 6

NỘI DUNG 1

1 GIỚI THIỆU THUẬT TOÁN 1

1.1 THUẬT TOÁN XÉT LIÊN THÔNG 1

1.2 THUẬT TOÁN BFS – DFS 1

1.2.1 Thuật toán BFS 1

1.2.2 Thuật toán DFS 2

1.3 THUẬT TOÁN RIM P 2

1.4 THUẬT TOÁN KRUSKAL 3

1.5 THUẬT TOÁN DIJKSTRA 3

2 GIỚI THIỆU VỀ CHƯƠNG TRÌNH 5

2.1 TỔNG QUAN VỀ GIAO DIỆN 5

CODE Giao Diện Chính 5

2.2 CÁC FILE XỬ LÍ THUẬT TOÁN TRONG CHƯƠNG TRÌNH 8

2.3 FORMGRAPH .9CS 2.3.1 Vẽ Đồ Thị 9

2.3.2 Các thuật toán chương trình hỗ trợ: 15

3 HƯỚNG DẪN SỬ DỤNG 19

3.1 DOWNLOAD SOURCE CODE 19

3.2 CHẠY CHƯƠNG TRÌNH 19

KẾT LUẬN 20

TÀI LIỆU THAM KHẢO 21

Trang 5

NHIỆM VỤ THÀNH VIÊN NHÓM

- Thành viên 1: 46.01.104.176 – Nguyễn Phước Thịnh – COMP101904

(CODE BFS-DFS,GIAO DIỆN,EVENT XỬ LÝ HIỂN THỊ ,CLICK)

- Thành viên 2: 46.01.104.069 – Lâm Chấn Huy – COMP101904

(CODE PRIM,WORD,GIAO DIỆN)

- Thành viên 3: 46.01.104.100 – Nguyễn Đạt Minh – COMP101904

(CODE KRUSKAL,WORD,GIAO DIỆN)

- Thành viên 4: 46.01.104.209 – Lê Đình Anh Tuấn – COMP101904

(CODE DIJKSTRA,VIDEO DEMO)

Trang 6

DANH MỤC CÁC HÌNH VẼ

Hình 2.3.2.a Các chức năng trong chương trình 15

Hình 2.3.2.b Mô phỏng thuật toán Xét liên thông 15

Hình 2.3.2.c Mô phỏng thuật toán DFS 16

Hình 2.3.2.d Mô Phỏng thuật toán BFS 16

Hình 2.3.2.e Mô phỏng thuật toán Kruskal 17

Hình 2.3.2.f Mô Phỏng thuật toán Prim 17

Hình 2.3.2.g Mô phỏng thuật toán Dịkstra 18

Trang 7

MỞ ĐẦU

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 Euler Đồ thị được sử dụng để giải các bài toán trong nhiều lĩnh lực khác nhau Chẳng hạn , đồ thị có thể sử để xác định mạch vòng trong vấn đề giải tích mạch điện Đồ thị có trọng số trên các cạnh có thể

sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạnh giao thông Chúng ta cũng có thể sử dụng đồ thị để giải các bài toán về lập lịch , thời khoa biểu… Đặc biệt trong khoảng vài mươi năm trở lại đây, cùng với sự ra đời của máy tính điện tử và sự phát triển nhanh chóng của tin học, lí thuyến đồ thị càng được quan tâm đến nhiều hơn Các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Lí thuyết mã, Tối ưu hoá,…

Chính vì thế nhóm em đã lựa chọn đề tài “ Minh họa trực quan bằng giao diện đồ họa các thuật toán tìm thành phần liên thông của đồ thị, duyệt đồ thị theo chiều rộng và theo chiều sâu, thuật toán Prim, thuật toán Kruskal, thuật toán Dijsktra” để nghiên cứu, tìm hiểu tạo ra một giao diện trực quan giúp cho người dùng dễ tiếp cận và sử dụng , hiểu hơn về các thuật toán tìm đường đi duyệt theo chiều sâu (DFS) hay duyệt theo chiều rộng (BFS), tìm thành phần liên thông của của đồ thị, thuật toán Prim, thuật toán Kruskal, thuật toán Dijkstra.

2 Mục tiêu nghiên cứu

Mục tiêu của đồ án này nhằm giúp chúng em có được sự hiểu biết sâu hơn về các thuật toán tìm đường đi duyệt theo chiều sâu (DFS) hay duyệt theo chiều rộng (BFS), tìm thành phần liên thông của của đồ thị, tìm cây khung ngắn nhất bằng hai thuật toán Kruskal và Prim và tìm đường đi ngắn nhất bằng thuật toán

Trang 8

Dijkstra Đồng thời cũng tạo ra một giao diện trực quan để giúp cho người dùng

có hướng tiếp cận dễ dàng hơn cũng như có cách nhìn trực quan hơn về các thuật toán này.

Trang 9

NỘI DUNG

1 GIỚI THIỆU THUẬT TOÁN.

1.1 Thuật toán xét liên thông.

Định nghĩa: là đồ thị chỉ có 01 thành phần liên thông, hay nói cách khác

giữa 2 đỉnh bất kỷ trong đồ thị luôn có đường đi từ đỉnh này tới đỉnh kia (trực tiếp hay gián tiếp qua các đỉnh trung gian).

Một đồ thị không liên thông sẽ bao gồm nhiều đồ thị con liên thông, các đồ thị con này được gọi là các thành phần liên thông (connected component).

Các thành phần liên thông: Một đồ thị không liên thông sẽ bao gồm

nhiều đồ thị con liên thông, các đồ thị con này được gọi là các thành phần liên thông.

Đồ thị liên thông khi và chỉ khi có một thành phần liên thông.

1.2 Thuật toán BFS – DFS.

1.1.1 Thuật toán BFS

Định nghĩa: Trong lý thuyết đồ thị, tìm kiếm theo chiều rộng (BFS) là

một thuật toán tìm kiếm trong đồ thị trong đó việc tìm kiếm chỉ bao gồm 2 thao tác: (a) cho trước một đỉnh của đồ thị; (b) thêm các đỉnh kề với đỉnh vừa cho vào danh sách có thể hướng tới tiếp theo Có thể sử dụng thuật toán tìm kiếm theo chiều rộng cho hai mục đích: tìm kiếm đường đi từ một đỉnh gốc cho trước tới một đỉnh đích, và tìm kiếm đường đi từ đỉnh gốc tới tất cả các đỉnh khác.

Các bước duyệt đồ thị như sau:

Cho G là đồ thị liên thông với tập đỉnh {v1, v2, , vn}

Bước 1 Xuất phát từ 1 đỉnh cho trước nào đó.

Bước 2 Xử lý đỉnh này và đánh dấu để không xử lý lần sau.

Bước 3 Đưa tất cả các đỉnh kề với nó vào danh sách xử lý và lần lượt xử lý

các đỉnh kề với đỉnh đang xét

Trang 10

Bước 4 Quay lại Bước 2 cho đến khi không còn đỉnh trong danh sách.

Cây T thu được là cây khung của đồ thị.

1.1.2 Thuật toán DFS

Định nghĩa: Tìm kiếm ưu tiên chiều sâu hay tìm kiếm theo chiều sâu ( Depth-first search - DFS) là một thuật toán duyệt hoặc tìm kiếm trên một cây hoặc một đồ thị Thuật toán khởi đầu tại gốc (hoặc chọn một đỉnh nào

đó coi như gốc) và phát triển xa nhất có thể theo mỗi nhánh.

Thông thường, DFS là một dạng tìm kiếm thông tin không đầy đủ mà quá trình tìm kiếm được phát triển tới đỉnh con đầu tiên của nút đang tìm kiếm cho tới khi gặp được đỉnh cần tìm hoặc tới một nút không có con Khi đó giải thuật quay lui về đỉnh vừa mới tìm kiếm ở bước trước Trong dạng không đệ quy, tất cả các đỉnh chờ được phát triển được bổ sung vào một ngăn xếp

Các bước duyệt đồ thị như sau:

Cho G là đồ thị liên thông với tập đỉnh {v1, v2, , vn}

Bước 1: Xuất phát từ 1 đỉnh cho trước nào đó.

Bước 2: Xử lý đỉnh này và đánh dấu đã duyệt để không xử lý lần sau Bước 3: Đưa tất cả các đỉnh kề với nó vào danh sách xử lý và chọn 1 đỉnh

để xử lý tiếp theo.

Bước 4: Quay lại Bước 2 cho đến khi không còn đỉnh trong danh sách.

Cây T thu được là cây khung của đồ thị.

1.3 Thuật toán Prim

Định Nghĩa:Thuật toán Prim 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ó 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

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 = ∈ ∅

Trang 11

1.4 Thuật Toán Kruskal.

Định nghĩa: Thuật toán Kruskal là một thuật toán trong lý thuyết đồ thị để tìm cây bao trùm nhỏ nhất của một đồ thị liên thông có trọng số Nói cách khác,

nó tìm một tập hợp các cạnh tạo thành một cây chứa tất cả các đỉnh của đồ thị và

có tổng trọng số các cạnh là nhỏ nhất.

Cho G = (V, E) là một đồ thị liên thông có trọng số gồm n đỉnh

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 = 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}

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

1.5 Thuật Toán Dijkstra.

Định nghĩa: Thuật toán Dijkstra là là một thuật toán giải quyết bài toán đường đi ngắn nhất từ một đỉnh đến các đỉnh còn lại của đồ thị có hướng không có cạnh mang trọng số không âm Thuật toán thường được sử dụng trong định tuyến với một chương trình con trong các thuật toán đồ thị hay trong công nghệ Hệ thống định vị toàn cầu

Trang 12

Bước 4: ∀k∈T và có cạnh nối từ v đến k, Nếu Length[k]>Length[v]+L thì vk

Trang 13

2 GIỚI THIỆU VỀ CHƯƠNG TRÌNH.

1.6 Tổng quan về giao diện.

Hình 2 1 Giao diện chương trình

Đồ Thị

- Chức năng đồ thị dùng để vẽ đồ thị và mô phỏng các thuật toán.

Thông Tin Sản Phầm

- Giới thiệu sơ về chương trình của nhóm

- Cho biết các thông tin của từng thành viên trong nhóm

- Cho thông tin liên hệ của nhóm trưởng (nếu cần )

• CODE Giao Diện Chính

public partial class Form1 : Form

{

//

private IconButton currentBtn;

private Panel leftBorderBtn;

private Form currentChildForm;

leftBorderBtn = new Panel();

leftBorderBtn.Size = new Size(7, 69);

panelMenu.Controls.Add(leftBorderBtn);

this.Text = string.Empty;

Trang 14

this.ControlBox = false;

this.DoubleBuffered = true;

this.MaximizedBounds =

Screen.FromHandle(this.Handle).WorkingArea;

}

// Hàm RGBcolor đ l u màu c a giao di n.ể ư ủ ệ

private struct RGBcolors

{

public static Color color1 = Color.FromArgb(172, 126, 241); public static Color color2 = Color.FromArgb(249, 118, 176); public static Color color3 = Color.FromArgb(253, 138, 114); public static Color color4 = Color.FromArgb(95, 77, 221); public static Color color5 = Color.FromArgb(249, 88, 115); public static Color color6 = Color.FromArgb(24, 161, 251); }

currentBtn.TextImageRelation = TextImageRelation.TextBeforeImage;

currentBtn.ImageAlign = ContentAlignment.MiddleRight; //left border button

Trang 15

currentBtn.TextAlign = ContentAlignment.MiddleCenter; currentBtn.IconColor = Color.Gainsboro;

currentBtn.TextImageRelation =

TextImageRelation.ImageBeforeText;

currentBtn.ImageAlign = ContentAlignment.MiddleLeft; leftBorderBtn.Visible = false;

iconcurrentChildform.IconChar = IconChar.Home;

lblTittleChildForm.Text = "Home";

iconcurrentChildform.IconColor = Color.MediumPurple; }

[DllImport("user32.DLL", EntryPoint = "ReleaseCapture")]

private extern static void ReleaseCapture();

[DllImport("user32.DLL", EntryPoint = "SendMessage")]

private extern static void SendMessage(System.IntPtr hWnd, int

wMsg, int wParam, int lParam);

private void pnlTittle_MouseDown(object sender, MouseEventArgs e) {

ReleaseCapture();

SendMessage(this.Handle, 0x112, 0xf012, 0);

}

//reset l i trang giao di nạ ệ

private void logoHCMUE_Click(object sender, EventArgs e)

Trang 16

// M giao di n Thông Tin S n Ph mở ệ ả ẩ

private void btnThongTin_Click(object sender, EventArgs e) {

ActivateButton(sender, RGBcolors.color1);

openChildForm(new ThongTinSanPham());

panelMenu.BorderStyle = BorderStyle.FixedSingle;

}

1.7 Các file xử lí thuật toán trong chương trình.

Chúng ta sẽ giới thiệu những file, hàm sự kiện còn lại trong chương trình Egde.cs: Định nghĩa cạnh của đồ thị và các hàm bổ trợ có liên quan FS-Graph.cs: Xử lí thuật toán trong chương trình

NodeGraphs.cs: Định nghĩa đỉnh và các hàm bổ trợ của liên quan

Trang 17

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);

Trang 18

"Thông Báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);

Egdes = new Class_FS_Graph.Egde();

Nod = new Class_FS_Graph.NodeGraph();

Trang 19

Egdes = new Class_FS_Graph.Egde();

Nod = new Class_FS_Graph.NodeGraph();

Cạnh trước khi xóa:

Cạnh sau khi xóa:

Hình 2.3.1.c Trước khi xóa Cạnh

Trang 20

Code:

pnlVeDoThi.Invalidate(); pnlVeDoThi.Refresh(); int n = ListarrEgde.Count; for (int i = 0; i < ListarrEgde.Count; i++) {

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 (!CheckHuong && ListarrEgde.Count >= 0) {

CheckHuong = ListarrEgde[i].CheckHuong(Egdes); }

}

}

d) Chức năng Xóa Đỉnh

Người dùng có thể xóa đỉnh tại các đỉnh mình muốn xóa và sau đó click vào button “Xóa Đỉnh”

Đỉnh trước khi xóa:

Trang 21

Hình 2.3.1.e Trước khi xóa Đỉnh

Đính sau khi xóa:

Hình 2.3.1.f Sau khi xóa Đỉnh

Sau khi xóa một đỉnh, các cạnh nối của đỉnh đó sẽ tự động xóa đi và các đỉnh còn lại sẽ tự động thay đổi số sao cho phù hợp với đồ thị

for (int i = 0; i < ListarrNod.Count; i++)

Trang 22

btn.Text = string.Format("{0}", n++);

btn.Click += new EventHandler(getToaDo);

Nod = new Class_FS_Graph.NodeGraph();

Egdes = new Class_FS_Graph.Egde();

2.1.2 Các thuật toán chương trình hỗ trợ:

Hình 2.3.2.a Các chức năng trong chương trình

Người dùng có thể chọn một trong các thuật toán để mô phỏng thuật toán đó

♦ Xét liên thông

Trang 25

♦ Dijkstra

Hình 2.3.2.g Mô phỏng thuật toán Dịkstra Hình 2.3.2.f Mô Phỏng thuật toán Prim

Trang 26

3 HƯỚNG DẪN SỬ DỤNG.

1.9 Download Source Code.

Bạn có thể download source code trên GitHub.

https://github.com/pthinh106/LTTW hoặc có thể tải file đóng gói của chương trình trên file.

Trang 27

KẾT LUẬN

Thông qua quá trình học tập nghiên cứu cũng như sự giúp đỡ của thầy nhóm tụi

em đã hoàn thành được đồ án cuối kì với đề tài Mô phỏng giao diện thuật toán Prim,Kruskal,Dijkstra, BFS, DFS, thành phần liên thông Sản phẩm cuối cùng của chúng em hoàn thành là một phần mềm hỗ trợ học tập môn Lý thuyết đồ thị và ứng dụng với các nội dung duyệt cây khung bằng thuật toán Prim,Kruskal,Dijkstra, BFS, DFS và thành phần liên thông.

Mặt hạn chế: Giao diện chưa được tiện ích khi sữ dụng, còn có những thiếu sót trong thuật toán, chưa đầy đủ tất các thuật toán trong môn Lí thuyết đồ thị

Trang 28

TÀI LIỆU THAM KHẢO

[1] Võ Tiến An, Slide giáo trình C#, 2018

[2]Trần Thanh Nhã, các bài tập Lab của học phần Lý Thuyết Đồ Thị

[3]Tài liệu học tập môn Lý thuyết đồ thị và ứng dụng :

https://drive.google.com/drive/folders/1SxjymHWLUAlV6cmnI5p5AFxenTtxY IwG

[4]Tài liệu tham khảo về Windows Form :

https://drive.google.com/drive/folders/1pYDWNlE_ssRyDBz4V8Nw3yWXbiO 0pIlx?

fbclid=IwAR2Y7qrEVPqinVUO1XAgZyivcENjN6cl2K6clnOVPkbqWtZsXUA ZjfyqxPA

Ngày đăng: 26/04/2022, 17:57

HÌNH ẢNH LIÊN QUAN

2 GIỚI THIỆU VỀ CHƯƠNG TRÌNH. 1.6 Tổng quan về giao diện. - Mô phỏng thuật toán của lý thuyết đồ thị
2 GIỚI THIỆU VỀ CHƯƠNG TRÌNH. 1.6 Tổng quan về giao diện (Trang 13)
Hình 2.3.1.a Vẽ Đỉnh - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.1.a Vẽ Đỉnh (Trang 17)
Hình 2.3.1.b Vẽ Cạnh - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.1.b Vẽ Cạnh (Trang 18)
Hình 2.3.1.c Trước khi xóa Cạnh - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.1.c Trước khi xóa Cạnh (Trang 19)
Hình 2.3.1.e Trước khi xóa Đỉnh - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.1.e Trước khi xóa Đỉnh (Trang 21)
Hình 2.3.1.f Sau khi xóa Đỉnh - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.1.f Sau khi xóa Đỉnh (Trang 21)
Hình 2.3.2.a Các chức năng trong chương trình - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.2.a Các chức năng trong chương trình (Trang 22)
Hình 2.3.2.b Mô phỏng thuật toán Xét liên thông - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.2.b Mô phỏng thuật toán Xét liên thông (Trang 23)
Hình 2.3.2.c Mô phỏng thuật toán DFS - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.2.c Mô phỏng thuật toán DFS (Trang 23)
Hình 2.3.2.e Mô phỏng thuật toán Kruskal - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.2.e Mô phỏng thuật toán Kruskal (Trang 24)
Hình 2.3.2.d Mô Phỏng thuật toán BFS - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.2.d Mô Phỏng thuật toán BFS (Trang 24)
Hình 2.3.2.g Mô phỏng thuật toán DịkstraHình 2.3.2.f Mô Phỏng thuật toán Prim - Mô phỏng thuật toán của lý thuyết đồ thị
Hình 2.3.2.g Mô phỏng thuật toán DịkstraHình 2.3.2.f Mô Phỏng thuật toán Prim (Trang 25)

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w