Tìm đường đi ngắn nhất bằng thuật toán dijkstra và xây dựng chương trình (2014)

56 6 0
  • Loading ...
1/56 trang

Thông tin tài liệu

Ngày đăng: 16/04/2018, 16:17

TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN - PHAN VĂN THẢO TÌM ĐƯỜNG ĐI NGẮN NHẤT BẰNG THUẬT TỐN DIJKSTRA XÂY DỰNG CHƯƠNG TRÌNH KHĨA LUẬN TỐT NGHIỆP ĐẠI HỌC Chuyên ngành: Tin học Người hướng dẫn khoa học Th.S Lưu Thị Bích Hương Hà Nội - 2014 LỜI CẢM ƠN Lời em xin chân thành cảm ơn hướng dẫn tận tình giáo Th.S Lưu Thị Bích Hương, khoa Cơng nghệ thơng tin, trường Đại học sư phạm Hà Nội Em xin chân thành cảm ơn thầy, cô giáo khoa Công nghệ thông tin, thầy, cô giáo trường giảng dạy giúp đỡ em năm học vừa qua Chính thầy, cô giáo xây dựng cho chúng em kiến thức tảng kiến thức chuyên môn để em hồn thành khóa luận tốt nghiệp chuẩn bị cho cơng việc sau Cuối em xin bày tỏ lòng biết ơn tới gia đình bạn bè giúp đỡ động viên em nhiều suốt trình học tập để em thực tốt khóa luận Tuy có cố gắng định thời gian trình độ có hạn nên chắn khóa luận nhiều thiếu sót hạn chế Kính mong nhận góp ý thầy, giáo bạn Hà Nội, tháng 05 năm 2014 Sinh viên Phan Văn Thảo LỜI CAM ĐOAN Tên em là: Phan Văn Thảo Sinh viên lớp: K36 – Tin học, khoa Công nghệ thông tin, trường Đại học sư phạm Hà Nội Em xin cam đoan: Đề tài “Tìm đường ngắn thuật toán Dijkstra xây dựng chương trình” nghiên cứu riêng em, hướng dẫn cô giáo Th.S Lưu Thị Bích Hương Khóa luận hồn tồn khơng chép tác giả khác Nếu sai em xin hoàn toàn chiu trách nhiệm Hà Nội, tháng 05 năm 2014 Người cam đoan Phan Văn Thảo MỤC LỤC MỞ ĐẦU CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Định nghĩa 1.1.1 Định nghĩa đồ thị 1.1.2 Phân loại đồ thị 1.1.3 Các thuật ngữ 1.2 Đường đi, chu trình, đồ thị liên thơng 11 1.3 Ma trận kề, ma trận trọng số 15 1.4 Một số dạng đồ thị đặc biệt 18 1.4.1 Đồ thị đầy đủ 18 1.4.2 Đồ thị vòng 18 1.4.3 Đồ thị bánh xe 19 1.4.4 Đồ thị lập phương 19 1.4.5 Đồ thị phân đôi (đồ thị hai phe) 20 1.5 Ứng dụng đồ thị đặc biệt 20 1.5.2 Các mạng cục (LAN) 20 1.5.3 Xử lý song song 21 CHƯƠNG 2: BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT 24 2.1 Khái niệm 24 2.2 Đường ngắn xuất phát từ đỉnh 26 2.3 Thuật toán Dijkstra 27 2.3.1 Mơ tả thuật tốn 27 2.3.2 Nội dung thuật toán 32 2.3.3 Lưu đồ thuật toán 33 2.3.4 Độ phức tạp thuật toán 34 CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH 35 3.1 Phát biểu toán 35 3.2 Thiết kế chương trình 36 3.2.1 Thiết kế sở liệu 36 3.2.2 Thiết kế giao diện 39 KẾT LUẬN HƯỚNG PHÁT TRIỂN 46 TÀI LIỆU THAM KHẢO 48 DANH MỤC HÌNH VẼ Hình 1.1 Ví dụ đồ thị Hình 1.2 Sơ đồ mạng máy tính Hình 1.3 Sơ đồ mạng máy tính với kênh đa thoại Hình 1.4 Sơ đồ mạng máy tính với kênh thơng báo Hình 1.5 Mạng máy tính với kênh thoại chiều Hình 1.6 Đồ thị vơ hướng Hình 1.7 Đồ thị có hướng 10 Hình 1.8 Đường đồ thị 11 Hình 1.9 Đồ thị liên thơng G đồ thị H gồm thành phần liên thông H1, H2, H3 13 Hình 1.10 Đồ thị liên thông mạnh G đồ thị liên thơng yếu H 14 Hình 1.11 Đồ thị vơ hướng G đồ thị có hướng G1 15 Hình 1.12 Đồ thị đầy đủ 18 Hình 1.13 Đồ thị vòng 18 Hình 1.14 Đồ thị bánh xe 19 Hình 1.15 Đồ thị lập phương 19 Hình 1.16 Đồ thị phân đơi 20 Hình 1.17 Các cấu trúc mạng 21 Hình 1.18 Mạng chiều 22 Hình 1.19 Mạng kiểu lưới 23 Hình 1.20 Mạng kiểu siêu khối 23 Hình 2.1 Đồ thị vơ hướng G 29 Hình 2.2 Đồ thị có hướng H 31 Hình 2.3 Lưu đồ thuật toán Dijkstra 33 Hình 3.1 Mối quan hệ sở liệu, danh sách liên kết ma trận trọng số 37 Hình 3.2 Form giao diện 39 Hình 3.3 Form giao diện với đồ thị vơ hướng 40 Hình 3.4 Form giao diện với đồ thị có hướng 41 Hình 3.5 Form vùng hiển thị đồ thị 42 Hình 3.6 Form tính tốn đường 43 Hình 3.7 Form thích kết đường 44 Hình 3.8 Form lưu liệu 45 DANH MỤC CÁC BẢNG BIỂU Bảng 2.1 Bảng kết tính tốn đồ thị vơ hướng G 29 Bảng 2.2 Bảng kết tính tốn đồ thị có hướng H 31 MỞ ĐẦU Mục đích, lý chọn đề tài 1.1 Lý chọn đề tài Trong năm gần đây, phương pháp tối ưu hoá ngày áp dụng sâu rộng hiệu vào ngành giao thông vận tải, mạng viễn thông, kinh tế, kỹ thuật, công nghệ thông tin ngành khoa học khác Các phương pháp tối ưu công cụ đắc lực giúp người làm định có giải pháp tốt định lượng định tính Một lớp toán tối ưu nghiên cứu thuật tốn giải tốn tìm đường ngắn có trọng số xác định Bài tốn tìm đường ngắn vấn đề quan trọng lý thuyết đồ thị, nghiên cứu từ lâu có nhiều ứng dụng nhiều ngành khoa học nói chung, khoa học máy tính hệ thống thơng tin nói riêng giải thuật Dijkstra phát triển để tìm đường ngắn ngày nhiều nhà nghiên cứu nhằm cải tiến xây dựng giải thuật giải tốn tìm đường ngắn với liệu mờ dạng khoảng Bài tốn tìm đường ngắn phát triển rộng rãi trở thành chuyên ngành toán học từ năm 1950 Giải đáp câu hỏi đặt mà tìm đường ngắn với cạnh có trọng số xác định Thuật toán Dijkstra thuật toán phổ biến tính hiệu Nó tìm đường ngắn với chi phí nhỏ Vì có ý nghĩa to lớn thực tế Chính vậy, sau thời gian tìm hiểu học tập với hướng dẫn tận tình giáo ThS Lưu Thị Bích Hương em định chọn đề tài: “Tìm đường ngắn thuật tốn Dijkstra xây dựng chương trình” làm khóa luận 1.2 Mục đích Mục đích khóa luận nghiên cứu thuật tốn Dijkstra để tìm đường ngắn Nhiệm vụ Khóa luận “Tìm đường ngắn thuật tốn Dijkstra xây dựng chương trình” nghiên cứu với nhiệm vụ sau: - Tìm hiểu tốn đường ngắn - Tìm hiểu thuật tốn Dijkstra áp dụng tốn tìm đường ngắn từ đỉnh đến tất đỉnh - Xây dựng chương trình mơ Phương pháp nghiên cứu a Phương pháp nghiên cứu lý luận Nghiên cứu qua việc đọc sách, báo tài liệu liên quan nhằm xây dựng sở lý thuyết khóa luận biện pháp cần thiết để giải vấn đề khóa luận b Phương pháp chuyên gia Tham khảo ý kiến chuyên gia để thiết kế chương trình phù hợp với yêu cầu thực tiễn Nội dung xử lý nhanh đáp ứng yêu cầu ngày cao người sử dụng c Phương pháp thực nghiệm Thông qua quan sát thực tế, yêu cầu sở, lý luận nghiên cứu kết đạt qua phương pháp Đối tượng, phạm vi nghiên cứu - Đối tượng nghiên cứu khóa luận thuật tốn Dijkstra 2.3.4 Độ phức tạp thuật toán Mệnh đề: Thuật tốn Dijkstra tìm đường ngắn từ đỉnh cho trước đến đỉnh tuỳ ý đơn đồ thị vơ hướng liên thơng có trọng số có độ phức tạp O(n2) Chứng minh: Thuật tốn dùng khơng n1 bước lặp Trong bước lặp, dùng không 2(n1) phép cộng phép so sánh để sửa đổi nhãn đỉnh Ngoài ra, đỉnh thuộc Sk có nhãn nhỏ nhờ khơng q n1 phép so sánh Do thuật tốn có độ phức tạp O(n2) 34 CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH 3.1 Phát biểu tốn Cho đơn đồ thị liên thơng, có trọng số G = (V, E) Tìm khoảng cách d(u0, v) từ đỉnh u0 cho trước đến đỉnh v G tìm đường ngắn từ u0 đến v Có số thuật tốn tìm đường ngắn nhất, ta có thuật toán E Dijkstra, nhà toán học người Hà Lan, đề xuất năm 1959 Trong phiên mà ta trình bày, người ta giả sử đồ thị vơ hướng, trọng số dương Chỉ cần thay đổi đơi chút giải tốn tìm đường ngắn đồ thị có hướng Phương pháp thuật toán Dijkstra là: xác định đỉnh có khoảng cách đến u0 từ nhỏ đến lớn Trước tiên, đỉnh có khoảng cách đến a nhỏ a, với d(u0,u0)=0 Trong đỉnh v  u0, tìm đỉnh có khoảng cách k1 đến u0 nhỏ Đỉnh phải đỉnh kề với u0 Giả sử u1 Ta có: d(u0,u1) = k1 Trong đỉnh v  u0 v  u1, tìm đỉnh có khoảng cách k2 đến u0 nhỏ Đỉnh phải đỉnh kề với u0 với u1 Giả sử u2 Ta có: d(u0,u2) = k2 Tiếp tục trên, tìm khoảng cách từ u0 đến đỉnh v G Nếu V = {u0, u1, , un} thì: = d(u0,u0) < d(u0, u1) < d(u0, u2) < < d(u0, un) 35 3.2 Thiết kế chương trình 3.2.1 Thiết kế sở liệu  Danh sách liên kết Sử dụng danh sách liên kết DSDinh(Danh sách đỉnh) DSCanh (Danh sách cạnh): - DSDinh: Mỗi phần tử danh sách chứa thông tin tên đỉnh, tọa độ x đỉnh, tọa độ y đỉnh Danh sách đỉnh dùng để lưu thông tin đỉnh người dùng nhập vào đỉnh hay chương trình đọc từ file text Mỗi phần tử danh sách chứa thông tin đỉnh - DSCanh: Mỗi phần tử danh sách cạnh chứa thông tin tên đỉnh 1, tên đỉnh 2, trọng số Danh sách cạnh dùng để lưu thông tin cạnh (đối với đồ thị vô hướng) hay cung (đối với đồ thị có hướng) Mỗi phần tử danh sách tương ứng với cạnh/cung đồ thị  Cơ sở liệu Cơ sở liệu sử dụng tập tin dạng text để lưu trữ liệu cần thiết đồ thị Việc lưu trữ giúp sử dụng lại liệu đồ thị tạo phiên làm việc trước/lưu lại liệu đồ thị phiên làm việc để làm làm việc sau sử dụng lại (nếu đồng ý người dùng) Hai tập tin nói bao gồm: - DanhSachDinh.txt  Dữ liệu tập tin bố trí theo dòng dòng biểu diễn thơng tin đỉnh (tên đỉnh, tọa độ x, tọa độ y đỉnh đó)  Các thơng tin dòng phân cách với dấu “,” (dấu phẩy) Ví dụ 17: A,500,123 //Đỉnh tên A có tọa độ (500,123) B,674,387 //Đỉnh tên B có tọa độ (674,387) C,723,100 //Đỉnh tên C có tọa độ (723,100) 36 - DanhSachCanh.txt  Dữ liệu tập tin bố trí theo dòng, dòng biểu diễn thơng tin cho cạnh/1 cung (tên đỉnh đầu-tên đỉnh cuối-trọng số) Vì cạnh/cung xác định đỉnh  Các thơng tin dòng phân cách với dấu “- ” (dấu gạch nối) Ví dụ 18: A-B-2 //Cạnh/cung AB có trọng số A-C-5 //Cạnh/cung AC có trọng số C-B-1 //Cạnh/cung CB có trọng số  Mối liên hệ sở liệu, danh sách liên kết ma trận trọng số Hình 3.1 Mối quan hệ sở liệu, danh sách liên kết ma trận trọng số Chú giải: 1: Lấy liệu từ tập tin “DanhSachDinh.txt” để tạo “DSDinh” 2: Lưu phần tử danh sách liên kết “DSDinh” vào tập tin “DanhSachDinh.txt” 3: Lưu phần tử danh sách liên kết “DSCanh” vào tập tin “DanhSachCanh.txt” 37 4: Lấy liệu từ tập tin “DanhSachCanh.txt” để tạo “DSCanh” 5, 6: Lấy liệu từ “DSDinh” “DSCanh” để ghi trọng số cho “Ma Trận Trọng Số” Trọng số vị trí [i,j] “Ma Trận Trọng Số” lấy từ “DSCanh” Dòng thứ i cột thứ j “Ma Trận Trọng Số” số thứ tự phần tử “DSDinh”  Tổ chức liệu Danh sách đỉnh: Mỗi phần tử danh sách chứa tên đỉnh, tọa độ x,y đỉnh Danh sách cạnh: Mỗi phần tử danh sách chứa trọng số cạnh đó, tên đỉnh đầu tên đỉnh cuối cạnh Matrantrongso[,]: Là ma trận trọng số đồ thị Truoc[]: Lưu lại đỉnh trước đỉnh i (Truoc[i]) Daxet[]: Đánh dấu đỉnh đồ thị đỉnh xét đỉnh chưa xét TrongSo[]: Lưu tổng trọng số từ đỉnh đầu đến  Thuật tốn Bước 1: Khởi tạo  TrongSo[i] = Matrantrongso[s, i]  Truoc[i] = s  Daxet[i] = false  Gán Trongso[s] = 0, Daxet[s] = true Bước 2: Vòng lặp  Tìm đỉnh u chưa xét có TrongSo[u] nhỏ  Nếu khơng tìm đỉnh u thỏa điều kiện (hoặc u==dinhcuoi)  khỏi vòng lặp Ngược lại: Daxet[u] = true 38 Sửa lại giá trị lưu mảng TrongSo[] cho đỉnh v kề với đỉnh u vừa tìm theo công thức: Nếu TrongSo[v] > TrongSo[u] + Matrantrongso[u, v] thì: TrongSo[v] = TrongSo[u] + Matrantrongso[u, v] Truoc[v] = u Bước 3: Tìm ghi kết  TrongSo[i] độ dài đường ngắn từ đỉnh s đến i Lần ngược theo mảng Truoc để in kết đường 3.2.2 Thiết kế giao diện  Giao diện Hình 3.2 Form giao diện 39  Giao diện với đồ thị vơ hướng Hình 3.3 Form giao diện với đồ thị vô hướng 40  Giao diện với đồ thị có hướng Hình 3.4 Form giao diện với đồ thị có hướng 41  Vùng vẽ, hiển thị hiệu chỉnh đồ thị Hình 3.5 Form vùng hiển thị đồ thị Trong vùng bạn thao tác đồ thị thao tác sau:  Thêm đỉnh: Chọn “chế độ nhập đỉnh” menu start, left click vào vùng này, gõ tên đỉnh cần nhập vào  Xóa đỉnh: Right click vào đỉnh cần xóa, chọn menu ngữ cảnh “xóa” 42  Đặt đỉnh đầu: Right click vào đỉnh chọn làm đỉnh đầu, chọn menu ngữ cảnh “Đặt làm đỉnh bất đầu”  Nhập cạnh/cung: Chọn “Chế độ nối đỉnh”, left click vào đỉnh thứ đỉnh thứ (nếu bạn click gần đỉnh) bạn nhập trọng số cho cạnh/cung vừa chọn Chú ý bạn quyền nhập số vào ô cho bạn nhập trọng số mà thơi  Bảng kết tính tốn Hình 3.6 Form tính tốn đường 43  Bảng thích, kết đường trọng số Hình 3.7 Form thích kết đường 44  Lưu liệu Hình 3.8 Form lưu liệu Yes: Dữ liệu đồ thị lưu lại để làm việc tiếp lần làm việc sau No: Không lưu liệu đồ thị lại 45 KẾT LUẬN HƯỚNG PHÁT TRIỂN Kết luận Khóa luận “Tìm đường ngắn thuật tốn Dijkstra xây dựng chương trình” trình bày số khái niệm lý thuyết đồ thị trình bày thuật tốn Dijktra để giải tốn tìm đường ngắn từ đỉnh đến tất đỉnh lại đồ thị theo cách Chương trình minh họa sử dụng ngơn ngữ lập trình C# minh họa trực quan thuật toán Dijkstra cho phép thao tác trực tiếp giao diện công việc sau:  Nhập đỉnh  Xóa đỉnh  Nối cạnh từ đỉnh định  Chuyển đổi qua lại đồ thị có hướng vơ hướng  Minh họa bước thuật toán Dijkstra giao diện chương trình  Lưu liệu đồ thị xuống file text  Nạp liệu đồ thị từ file text Qua thời gian thực khóa luận, em thu nhiều kiến thức bổ ích nhiều học quý báu Tuy nhiên thời gian có hạn kiến thức hạn chế nên khóa luận em khơng tránh khỏi thiếu sót có nhiều điểm chưa phù hợp Em xin chân thành cảm ơn giáo Lưu Thị Bích Hương tận tình giúp đỡ để em hồn thành khóa luận này, em mong nhận ý kiến đóng góp q thầy bạn khoa để khóa luận hồn thiện 46 Hướng phát triển Khóa luận “Tìm đường ngắn thuật tốn Dijkstra xây dựng chương trình” trình bày tốn tìm đường ngắn thuật tốn Dijkstra theo cách tuần tự, giải thuật có độ phức tap O(n2) n tăng lên lớn (khoảng vài chục ngàn đỉnh) thời gian xử lý chậm đáng kể điều không đáp ứng với đòi hỏi thời gian nhanh Vì vậy, thời gian tới xây dựng thuật tốn song song hóa thuật tốn Dijkstra mơ hình xử lý song song giúp tiết kiệm thời gian đáp ứng với toán lớn 47 TÀI LIỆU THAM KHẢO Tham khảo http://vi.wikipedia.org Giáo trình “Lý thuyết đồ thị” - Th.S Nguyễn Thanh Hùng Tóm tắt giảng “Lý thuyết đồ thị” - Khoa Toán-tin trường Đại học Sư phạm TP.HCM Bài giảng “Lý thuyết đồ thị” - Đại học Hàng Hải Ngơn ngữ lập trình C# - Nguyễn Hồng Phương “Toán rời rạc” - Nguyễn Đức Nghĩa, Nguyễn Tô Thành - NXB Đại học quốc gia Hà Nội 48 ... thuật tốn Dijkstra để tìm đường ngắn Nhiệm vụ Khóa luận Tìm đường ngắn thuật tốn Dijkstra xây dựng chương trình nghiên cứu với nhiệm vụ sau: - Tìm hiểu tốn đường ngắn - Tìm hiểu thuật tốn Dijkstra. .. tốn Dijkstra xây dựng chương trình giúp hiểu thuật tốn Dijkstra tốn tìm đường ngắn từ đỉnh đến tất đỉnh lại đồ thị, qua mơ chương trình cách cụ thể giúp hiểu rõ thuật tốn xây dựng chương trình. .. luận thuật tốn Dijkstra - Trên sở thuật tốn Dijkstra, khóa luận xây dựng chương trình tìm đường ngắn từ đỉnh đến tất đỉnh đồ thị theo cách Ý nghĩa khoa học thực tiễn Khóa luận Tìm đường ngắn thuật
- Xem thêm -

Xem thêm: Tìm đường đi ngắn nhất bằng thuật toán dijkstra và xây dựng chương trình (2014) , Tìm đường đi ngắn nhất bằng thuật toán dijkstra và xây dựng chương trình (2014) , CHƯƠNG 1: CƠ SỞ LÝ THUYẾT, CHƯƠNG 2: BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT, CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH, 2 Thiết kế chương trình

Gợi ý tài liệu liên quan cho bạn

Nhận lời giải ngay chưa đến 10 phút Đăng bài tập ngay