Tìm hiểu những vấn đề cơ bản của lý thuyết đồ thị

67 373 0
Tìm hiểu những vấn đề cơ bản của lý thuyết đồ thị

Đ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

Mục lục Mục lục Lời mở đầu 1.1 Định nghĩa đồ thị .4 1.1.1 Đơn đồ thị 1.1.2 Đa đồ thị .4 1.1.3 Giả đồ thị 1.1.4 Đồ thị có hướng 1.1.5 Đa đồ thị có hướng 1.2 Bậc đỉnh 1.2.1 Định nghĩa .6 1.2.2 Định nghĩa .6 1.2.4 Hệ quả: .7 1.2.5 Mệnh đề 1.2.6 Định nghĩa .8 1.2.7 Định nghĩa .8 1.2.8 Mệnh đề 1.3.2 Định nghĩa .10 1.3.3 Định nghĩa .10 1.4 Cây khung đồ thị 11 1.4.1 Định nghĩa .11 1.4.2 Mệnh đề 12 1.4.3 Định lý 12 1.4.4 Định nghĩa .13 1.4.5 Định nghĩa .13 1.4.6 Định nghĩa .15 1.4.7 Định nghĩa .15 1.4.8 Mệnh đề 15 1.4.9 Mệnh đề 16 Chương 2: CÁC THUẬT TOÁN CƠ BẢN TRÊN LÝ THUYẾT ĐỒ THỊ 17 2.1 Các thuật tìm kiếm đồ thị 17 2.1.1 Giới thiệu toán 17 2.1.2 Thuật toán A* 18 2.1.3 Thuật toán nhánh cận 21 2.2 Bài toán tìm khung nhỏ 23 2.2.1 Giới thiệu toán 23 2.2.2 Thuật toán Kruskal 24 2.2.3 Thuật toán Prim 26 Chương 3: NGÔN NGỮ VISUAL BASIC 6.0 29 3.1 Giới thiệu tổng quát ngôn ngữ lập trình Visual Basic .29 3.2 Thiết kế giao diện 31 3.2.1 Form 31 3.2.2 ToolsBox 31 3.2.3 Properties Windows 32 3.2.4 Project Explorer 32 3.3 Viết lệnh cho đối tượng 33 3.3.1 Cửa sổ code 33 3.3.2 Biến 33 3.3.5 Hộp thoại 37 3.3.6 Các hàm chuỗi 38 3.3.7 Mảng truy cập 40 Chương 4: CÀI ĐẶT CHƯƠNG TRÌNH 45 4.1 Bài toán tìm kiếm nhánh cận .45 4.1.1 Giới thiệu 45 4.1.2 Giao diện thao tác với chương trình 45 4.1.3 Các hàm thủ tục chương trình .49 4.2 Thuật toán tìm Prim tìm khung nhỏ 57 4.2.1 Giới thiệu 57 4.2.2 Giao diện tương tác với chương trình .57 4.2.3 Các hàm thủ tục chương trình .60 Kết Luận .66 Tài Liệu Tham Khảo 67 Lời mở đầu Lý thuyết đồ thị lĩnh vực có từ lâu có nhiều ứng dụng đại, tư tưởng lý thuyết đồ thị đề xuất vào năm đầu kỷ 18 nhà bác học lỗi lạc người Thuỵ Sỹ Lenhard Eurle Chính ông người sử dụng đồ thị để giải toán tiếng cầu thành phố Konigsberg Đồ thị sử dụng để giải toán nhiều lĩnh vực khác chẳng hạn, đồ thị sử dụng để xác định mạch vòng vấn đề giải tích mạch điện Chúng ta xác định hai máy tính mạng trao đổi thông tin với hay không nhờ mô hình đồ thị mạng máy tính Đồ thị có trọng số cạnh sử dụng để giải toán như: Tìm đường ngắn hai thành phố mạng giao thông, giải toán lập lịch, thời khoá biểu phân bố tần số cho trạm phát truyền hình… Lý thuyết đồ thị nhánh quan trọng toán học tổ hợp nghiên cứu sâu sắc hàng trăm năm Nhiều tính chất quan trọng hữu ích đồ thị chứng minh, nhiều vấn đề khó chưa giải xong Ở đề tài với mục đích tìm hiểu vấn đề lý thuyết đồ thị sâu vào tìm hiểu số thuật toán đồ em cài đặt thuật toán số thuật toán tìm đuờng ngắn tìm khung nhỏ ngôn ngữ lập trình Visual Basic 6.0 Trong thời gian làm đề tài cố gắng nhiều kiến thức thân có hạn, ngôn ngữ lập trình phải tự tìm hiểu, nên đề tài không tránh khỏi thiếu sót Em kính mong nhận đánh giá bảo thầy cô giáo để đề tài em hoàn thiện Một lần em xin chân thành cảm ơn thầy giáo Vũ Vinh Quang tận tình hướng dẫn giúp em hoàn thành đồ án Chương 1: CÁC KHÁI NIỆM CƠ BẢN VỀ LÝ THUYẾT ĐỒ THỊ 1.1 Định nghĩa đồ thị Đồ thị cấu trúc rời rạc gồm đỉnh cạnh (vô hướng có hướng)nối đỉnh Người ta phân loại đồ thị tùy theo đặc tính số cạnh nối cặp đỉnh đồ thị Nhiều toán thuộc lĩnh vực khác giải mô hình đồ thị Chẳng hạn người ta dùng đồ thị để biểu diễn cạnh tranh loài môi trường sinh thái, dùng đồ thị để biểu diễn có ảnh hưởng lên tổ chức đó, dùng đồ thị để biểu diễn kết cục thi đấu thể thao Chúng ta dùng đồ thị để giải toán toán tính số tổ hợp khác chuyến bay hai thành phố mạng hàng không, hay để giải toán tham quan tất đường phố thành phố cho đường phố qua lần, toán tìm số màu cần thiết để tô vùng khác đồ Trong đời sống, thường gặp sơ đồ, sơ đồ tổ chức máy, sơ đồ giao thông, sơ đồ hướng dẫn thứ tự đọc chương sách, , gồm điểm biểu thị đối tượng xem xét (người, tổ chức, địa danh, chương mục sách, )và nối số điểm với đoạn thẳng (hoặc cong)hay mũi tên, tượng trưng cho quan hệ đối tượng Đó thí dụ đồ thị 1.1.1 Đơn đồ thị Một đơn đồ thị G = (V, E)gồm tập khác rỗng V mà phần tử gọi đỉnh tập E mà phần tử gọi cạnh, cặp thứ tự đỉnh phân biệt 1.1.2 Đa đồ thị Một đa đồ thị G = (V, E)gồm tập khác rỗng V mà phần tử gọi đỉnh họ E mà phần tử gọi cạnh, cặp thứ tự đỉnh phân biệt Hai cạnh gọi cạnh bội hay song song chúng tương ứng với cặp đỉnh Rõ ràng đơn đồ thị đa đồ thị, đa đồ thị đơn đồ thị 1.1.3 Giả đồ thị Một giả đồ thị G = (V, E)gồm tập khác rỗng V mà phần tử gọi đỉnh họ E mà phần tử gọi cạnh, cặp thứ tự đỉnh (không thiết phân biệt) Với vV, (v,v)E ta nói có khuyên đỉnh v Tóm lại, giả đồ thị loại đồ thị vô hướng tổng quát chứa khuyên cạnh bội Đa đồ thị loại đồ thị vô hướng chứa cạnh bội có khuyên, đơn đồ thị loại đồ thị vô hướng không chứa cạnh bội khuyên Thí dụ: V1 V5 V2 V3 V6 V4 V7 V1 V2 V3 V4 V5 V6 Đơn đồ thị Giả đồ thị 1.1.4 Đồ thị có hướng Một đồ thị có hướng G = (V, E) gồm tập khác rỗng V mà phần tử gọi đỉnh tập E mà phần tử gọi cung, cặp có thứ tự phần tử thuộc V 1.1.5 Đa đồ thị có hướng Một đa đồ thị có hướng G = (V, E) gồm tập khác rỗng V mà phần tử gọi đỉnh họ E mà phần tử gọi cung, cặp có thứ tự phần tử thuộc V Đồ thị vô hướng nhận từ đồ thị có hướng G cách xoá bỏ chiều mũi tên cung gọi đồ thị vô hướng G Thí dụ: V1 V2 V3 V4 V5 V6 V7 Đồ thị có hướng V1 V2 V3 V4 V5 V6 Đa đồ thị có hướng 1.2 Bậc đỉnh 1.2.1 Định nghĩa Hai đỉnh u v đồ thị (vô hướng) G=(V,E) gọi liền kề (u,v)E Nếu e = (u,v) e gọi cạnh liên thuộc với đỉnh u v Cạnh e gọi cạnh nối đỉnh u v Các đỉnh u v gọi điểm đầu mút cạnh e 1.2.2 Định nghĩa Bậc đỉnh v đồ thị G=(V,E), ký hiệu deg(v), số cạnh liên thuộc với nó, riêng khuyên đỉnh tính hai lần cho bậc Đỉnh v gọi đỉnh treo deg(v) =1 gọi đỉnh cô lập deg(v) =0 Thí dụ: V1 V2 V3 V4 V5 V6 V7 Ta có deg(v1) =7, deg(v2) =5, deg(v3) =3, deg(v4) =0, deg(v5) =4, deg(v6) =1, deg(v7) =2 Đỉnh v4 đỉnh cô lập đỉnh v6 đỉnh treo 1.2.3 Mệnh đề Cho đồ thị G = (V, E) Khi 2|E| =  deg(v) vV Chứng minh: Rõ ràng cạnh e = (u,v) tính lần deg(u) lần deg(v) Từ suy tổng tất bậc đỉnh hai lần số cạnh 1.2.4 Hệ quả: Số đỉnh bậc lẻ đồ thị số chẵn Chứng minh: Gọi V1 V2 tương ứng tập đỉnh bậc chẵn tập đỉnh bậc lẻ đồ thị G = (V, E) Khi 2|E| =  deg(v) +  deg(v) vV1 vV2 Vế trái số chẵn tổng thứ số chẵn nên tổng thứ hai số chẵn Vì deg(v) lẻ với v  V2 nên |V2| số chẵn 1.2.5 Mệnh đề Trong đơn đồ thị, tồn hai đỉnh có bậc Chứng minh: Xét đơn đồ thị G=(V,E) có |V|=n Khi phát biểu đưa toán: phòng họp có n người, tìm người có số người quen số người dự họp 1.2.6 Định nghĩa Đỉnh u gọi nối tới v hay v gọi nối từ u đồ thị có hướng G (u,v) cung G Đỉnh u gọi đỉnh đầu đỉnh v gọi đỉnh cuối cung 1.2.7 Định nghĩa Bậc vào (tương ứng bậc ra) đỉnh v đồ thị có hướng G, ký hiệu degt(v) (tương ứng dego(v)), số cung có đỉnh cuối v Thí dụ: V1 V4 V2 V3 V5 V6 degt(v1) = 2, dego(v1) = 3, degt(v2) = 5, dego(v2) = 1, degt(v3) = 2, dego(v3) = 4, degt(v4) = 1, deg0(v4) = 3, degt(v5) = 1, dego(v5) = 0, degt(v6) = 0, dego(v6) = Đỉnh có bậc vào bậc gọi đỉnh cô lập Đỉnh có bậc vào bậc gọi đỉnh treo, cung có đỉnh cuối đỉnh treo gọi cung treo 1.2.8 Mệnh đề Cho G =(V, E) đồ thị có hướng Khi  deg t (v)   deg o (v) = |E| vV vV Chứng minh: Kết có cung tính lần cho đỉnh đầu lần cho đỉnh cuối 1.3 Tính liên thông 1.3.1 Định nghĩa Đường độ dài n từ đỉnh u đến đỉnh v, với n số nguyên dương, đồ thị (giả đồ thị vô hướng đa đồ thị có hướng) G=(V,E) dãy cạnh (hoặc cung) e1, e2, , en đồ thị cho e1=(x0,x1), e2=(x1,x2), ,en=(xn-1,xn), với x0=u xn=v Khi đồ thị cạnh (hoặc cung) bội, ta ký hiệu đường dãy đỉnh x0, x1, , xn Đường gọi chu trình bắt đầu kết thúc đỉnh Đường chu trình gọi đơn không chứa cạnh (hoặc cung) lần Một đường chu trình không qua đỉnh lần (trừ đỉnh đầu đỉnh cuối chu trình trùng nhau) gọi đường chu trình sơ cấp Rõ ràng đường (tương ứng chu trình) sơ cấp đường (tương ứng chu trình) đơn Thí dụ: X Y Z W V Y Trong đơn đồ thị trên, x, y, z, w, v, y đường đơn (không sơ cấp) độ dài 5; x, w, v, z, y không đường (v, z) không cạnh; y, z, w, x, v, u, y chu trình sơ cấp độ dài 1.3.2 Định nghĩa Một đồ thị (vô hướng) gọi liên thông có đường cặp đỉnh phân biệt đồ thị Một đồ thị không liên thông hợp hai hay nhiều đồ thị liên thông, cặp đồ thị đỉnh chung Các đồ thị liên thông rời gọi thành phần liên thông đồ thị xét Như vậy, đồ thị liên thông có thành phần liên thông Thí dụ: X Y Z A B E V W D C G M U T G H N G’ Đồ thị G liên thông, đồ thị G’ không liên thông có thành phần liên thông 1.3.3 Định nghĩa Một đỉnh đồ thị G mà xoá tất cạnh liên thuộc với ta nhận đồ thị có nhiều thành phần liên thông đồ thị G gọi đỉnh cắt hay điểm khớp Việc xoá đỉnh cắt khỏi đồ thị liên thông tạo đồ thị không liên thông Hoàn toàn tương tự, cạnh mà ta bỏ tạo đồ thị có nhiều thành phần liên thông so với đồ thị xuất phát gọi cạnh cắt cầu Thí dụ: X Y T U V W S Z 10 x1 = Nhan(j).Left + 200 y1 = Nhan(j).Top + 200 x2 = Nhan(i).Left + 200 y2 = Nhan(i).Top + 200 h = Sqr((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) sin = (x2 - x1) / h cos = (y2 - y1) / h x1 = x1 + 205 * sin x2 = x2 - 205 * sin y1 = y1 + 205 * cos y2 = y2 - 205 * cos If InStr(1, Path, Nhan(i).Caption & " >" & Nhan(j).Caption, 1)> And Path "" And Mode = Then frmNhanhcan.ForeColor = mDo If cboTruoc.Text = Nhan(i).Caption And cboSau.Text = Nhan(j).Caption And Mode = Then frmNhanhcan.ForeColor = mXanh Line (x1, y1)-(x2, y2) X = x1 + 200 * sin Y = y1 + 200 * cos X = X + 100 * cos Y = Y - 100 * sin Line (x1, y1)-(X, Y) X = X - 200 * cos Y = Y + 200 * sin Line (x1, y1)-(X, Y) X = (x1 + x2)/ Y = (y1 + y2)/ CurrentX = X - 150 * cos - 120 CurrentY = Y + 150 * sin - 150 frmNhanhcan.Print C(i, j) frmNhanhcan.ForeColor = mDen Next k Next i End Sub * Thủ tục in giá trị hàm đánh giá lên đỉnh Private Sub InGtri(i As Integer) Dim X As Integer Dim Y As Integer X = Nhan(i).Left Y = Nhan(i).Top Select Case G(i) Case 1: CurrentX = X + 100 CurrentY = Y - 200 Case 2: CurrentX = X + 400 CurrentY = Y + 100 Case 3: CurrentX = X + 100 CurrentY = Y + 400 Case 4: CurrentX = X - 200 CurrentY = Y + 100 End Select Me.Print V(i) End Sub 53 * Hàm nhánh cận, hàm chương trình Private Sub Nhanhcan() Dim i As Integer Dim j As Integer Dim k As Integer Dim m As Integer Dim h As Integer Dim l(30)As Byte l(0) = m = l(0) l(1) = S Cost = maxInt For i = To n F(i) = Next i F(S) = V(S) While m For i = To m For j = i + To m If F(l(j))> F(l(i))Then k = l(i) l(i) = l(j) l(j) = k End If Next j Next i k = l(m) m=m-1 If k = T Then If F(k)< Cost Then Cost = F(k) Else For i = To A(k, 0) h = A(k, i) F(h) = F(k)+ V(h)+ C(k, h)- V(k) If F(h)< Cost Then m=m+1 l(m) = h D(h) = k End If Next i End If Wend End Sub * Thủ tục mở file có sẵn Private Sub OpenFile() Path = FileSelect("Open file") ReadFile (Path) m=n If m > Then Thongbao "ÐaÞ ðoòc file, ðôÌ thiò gôÌm " & n & " ðiÒnh HaÞy click lên Form ðêÒ seìt viò triì cho caìc ðiÒnh" Me.Cls End If setCbo End Sub * Đọc nội dung file gán vào cho đồ thị 54 Private Sub ReadFile(ByVal DuongDan As String) Dim i As Integer Dim j As Integer Dim T()As String Dim F As Integer ' Khai bao bien ma so cho tap tin Dim sDong As String ' Khai bao bien tra ve noi dung cho tung dong ' Bay loi doc tap tin nhu duong dan khong hop le hay file dang duoc doc On Error GoTo Loi F = FreeFile ' tra ve ma so file hop le Open DuongDan For Input As F 'Mo tap tin theo ma so f If EOF(F)Then Close F GoTo Loi End If Line Input #F, sDong n = CInt(sDong) i=0 Do While Not EOF(F)' Dung vong lap de doc tung dong i=i+1 Line Input #F, sDong T = Split(sDong, " ") 'Gan tung phan tu vao mang t G(i) = Nhan(i).Caption = T(0) V(i) = CInt(T(1)) A(i, 0) = CInt(T(2)) For j = To A(i, 0) A(i, j) = CInt(T(2 * j + 1)) C(i, A(i, j)) = CInt(T(2 * j + 2)) Next Loop Close F ' Dong file Exit Sub ' Thoat neu khong co loi Loi: ' Nhan loi ' Thong bao suot hien loi n=0 MsgBox "Loi doc tap tin, co the file khong ton tai, khong dung dinh dang hoac file da duoc mo" End Sub * Thủ tục hộp thoại thông báo Private Sub Thongbao(vData As String, Optional bConvertUni As Boolean = True) msb.uniMsg vData, "Thông baìo", MB_ICONINFORMATION Or MB_OK, bConvertUni End Sub * Hàm kiểm tra xem nhãn đỉnh tồn chưa Private Function Tontai(st As String)As Boolean Dim i As Integer Dim ok As Boolean For i = To n If Nhan(i).Caption = st And Mode = Then ok = True Next Tontai = ok End Function * Hàm lưu nội dung vào file Private Sub WriteFileText(ByVal DuongDan As String, ByVal sNoiDung As String) 55 Dim F As Integer On Error GoTo Loi F = FreeFile Open DuongDan For Output As F Print #F, sNoiDung Close F Thongbao "ÐaÞ lýu vaÌo file" Exit Sub Loi: MsgBox "Loi ghi tap tin !" End Sub * Hàm xóa đỉnh sửa đỉnh Private Sub XoaDinh(k As Integer) Dim i As Integer Dim j As Integer Dim T As Integer ' Gan dinh n cho dinh k roi xoa n Nhan(k).Caption = Nhan(n).Caption V(k) = V(n) A(k, 0) = A(n, 0) For i = To A(n, 0) j = A(n, i) C(k, j) = C(n, j) Next For i = To n For j = To A(i, 0) If A(i, j) = k Then A(i, 0) = A(i, 0)- For T = j To A(i, 0) A(i, T) = A(i, T + 1) Next End If If A(i, j) = n Then A(i, j) = k C(i, k) = C(i, n) End If Next Next Nhan(k).Left = Nhan(n).Left Nhan(k).Top = Nhan(n).Top Dinh(k).Left = Dinh(n).Left Dinh(k).Top = Dinh(n).Top Nhan(n).Visible = False Nhan(n).Caption = "" Dinh(n).Visible = False Dinh(k).FillColor = &HC0C0FF Dinh(k).BorderColor = &HC0C0FF n=n-1 E=0 setCbo Hienthi End Sub 56 4.2 Thuật toán tìm Prim tìm khung nhỏ 4.2.1 Giới thiệu Đầu vào toán đồ thị vô hướng, đầu khung nhỏ đồ thị Việc nhập đồ thị cách: Tạo đồ thị random, nhập đồ thị có sẵn lưu dạng file text (file chứa ma trận đồ thị) hay tạo đồ thị cách nhập số đỉnh, đường đỉnh dạng ma trận trọng số Khi chạy thuật toán chương trình đưa cậy khung nhỏ bước tính toán chương trình dạng bảng 4.2.2 Giao diện tương tác với chương trình * Giao diện ban đầu: Giao diện chia làm phần: + Ma trận mô tả đồ thị: lưu ma trận đồ thị tương tác với chương trình + Quá trình tính toán: chi tiết bước tính toán để kết 57 + Phần lại chứa mô hình đồ thị * Các tương tác với chương trình + Nhập từ file: cho phép nhập đồ thị từ file text sẵn có File phải có định dạng sau: Dòng đầu chưa số đỉnh đồ thị, dòng nửa mà trận đồ thị, cần lưu nửa ma trận đồ thị vô hướng tức đường từ AB đường từ BA file mở lưu vào ma trận đồ thị VD: file text sau Dòng đầu: - đồ thị gồm đỉnh Dòng 2: - đường từ đỉnh AA Dòng 3: 15 - đường từ BA 15, từ B  B Dòng 4: 16 33 - đường từ CA 16, từ CB 33, từ CC Dòng 5: 19 13 13 - đường từ DA 19, từ DB 13, từ DC 13, từ DD Ta thu ma trận đồ thị hình 58 + Xuất file: Xuất đồ thị file theo cấu trúc + Tạo random: Tạo ma trận đồ thị random + Thêm đỉnh: thêm đỉnh vào đồ thị, thêm cấp cho ma trận + Bớt đỉnh: Xóa đỉnh cuối khỏi đồ thị, giảm cấp ma trận + Hiển thị: Khi có ma trận đồ thị ta cho hiển thị vào phần form cách click trọn vị trí cho đỉnh Chương trình tự động tạo đường cho đỉnh theo ma trận + Chạy thuật toán: Khi có đồ thị ta chạy thuật toán theo dõi kết 59 Cây khung gồm cạnh: (A,B), (B,D), (D,C) Quá trình tính toán + Khởi tạo: tập đỉnh V={A}, tập cạnh E={  } + Bước 1: Đường từ AB 15 có nhãn [A,15], từ AC 16 có nhãn [A,16], từ AD 19 có nhãn [A,19] Ta thấy B Kết nạp B vào tập đỉnh V={A,B} Kết nạp cạnh (A,B) vào tập cạnh E={(A,B)} + Bước 2: với C có BC=33>16 nguyên [A,16], với D có BD=13

Ngày đăng: 04/08/2016, 08:47

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan