Tiểu luận LẬP TRÌNH SYMBOLIC Bài toán người đưa thư

9 575 0
Tiểu luận LẬP TRÌNH SYMBOLIC Bài toán người đưa thư

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

Thông tin tài liệu

S Y Giảng v Học viê n Mã số: C TRƯ Ờ BÀI Y MB O Đề t iên: PGS n : Đào T h C H11011 1 Ờ NG ĐẠI ĐẠI H Ọ THU O LIC V ài: Bà i .TS Đỗ V h ị Phấn 1 8 TP H HỌC CÔ N Ọ C QUỐ C HOẠ C V À T R i toán ăn Nhơn H CM, Th á N G NGH Ệ C GIA TP C H M Ô R Í TU Ệ ngườ i á ng 02/20 Ệ THÔN G HCM Ô N H Ệ NH Â i đưa t 13 G TIN ỌC Â N T Ạ t hư Ạ O Trang 2 Lời nói đầu Tiểu luận này nhằm trình bày bài toán người đưa thư, đồng thời trình bày cấu trúc dữ liệu sử dụng cũng như các thuật toán nhằm giải quyết vấn đề bài toán. Tiểu luận cũng nêu lên kết quả chạy thử cho bài toán với dữ liệu thử tương đối nhỏ. Em xin chân thành cảm ơn PGS.TS. Đỗ Văn Nhơn – Giảng viên môn học “Symbolic và trí tuệ nhân tạo” đã truyền đạt cho em những ki ến thức vô cùng quý báu. Em cũng xin chân thành cảm ơn quý Thầy Cô thuộc phòng đào tạo Sau đại học và các bạn về tài liệu tham khảo để em có thể hoàn thành môn học này. Chân thành cảm ơn! Trang 3 Mục lục 1. Phát biểu bài toán người đưa thư 4 2. Cách giải 4 3. Cấu trúc dữ liệu 4 4. Các thuật toán 5 5. Chạy thử 8 6. Hạn chế 9 Trang 4 1. Phát biểu bài toán người đưa thư Một người đưa thư xuất phát từ bưu điện phải đến một số con đường để phát thư rồi quay trở về điểm xuất phát, hỏi người đó phải đi như thế nào để số đường đi là ít nhất. 2. Cách giải Bài toán giải bằng phương pháp đồ thị. Dựng một đồ thị có các cạnh tương ứng với các con đường mà người đưa thư phải đi qua. Một chu trình đi qua tất cả các cạnh gọi là một hành trình. Giải bài toán người đưa thư tương đương với bài toán tìm chu trình ngắn nhất đi qua tất cả các cạnh của một đồ thị cho trước. Đỉnh xuất phát của chu trình này tương ứng với vị trí của bưu điện. Các đỉnh khác trên đường đi ứng với các nơi mà người đưa thư cần giao thư. Giả sử ở đây sử dụng đồ thị vô hướng có trọng số dương. Giả sử đồ thị có n đỉnh, khi đó thuật toán tối ưu sẽ là thuật toán tìm chu trình Hamilton ngắn nhất, có độ phức tạp là O(n!). Nhắc lại: Trong lý thuyết đồ thị, một đường đi Hamilton là một đường đi trong đồ thị vô hướng đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần. Một chu trình Hamilton là một đường đi Hamilton sau đi qua tất cả các đỉnh của đồ thị thì trở về đỉnh xuất phát. 3. Cấu trúc dữ liệu Định nghĩa một kiểu dữ liệu dothi là một danh sách gồm có 2 thành phần, thành phần thứ nhất là tập các đỉnh, mỗi đỉnh là một cái tên (name) thành phần thứ hai là tập các cạnh kèm trọng số, mỗi cạnh là một danh sách gồm 3 thành phần, 2 thành phần đầu là 2 đỉnh tạo nên cạnh và thành phần thứ 3 là trọng số của c ạnh. Ở đây sử dụng đồ thị đơn, không có khuyên. Ví dụ: một đồ thị G có 4 đỉnh a, b, c, d và bốn cạnh (a,b), (b,c), (c,d), (d,a) có trọng số biểu diễn như sau: Trang 5 4. Các thuật toán Trước khi tìm hành trình ngắn nhất (chu trình ngắn nhất), đồ thị sẽ được kiểm tra tính liên thông. Nếu đồ thị liên thông mới tiến hành việc tìm chu trình, ngược lại thì dừng. Giả sử có đồ thị vô hướng G(V,E), V là tập đỉnh và E là tập các cạnh. Thủ tục tìm hành trình ngắn nhất cho người đưa thư mô tả ngắn gọn như sau: Thủ tục nguoi_dua_thu(G) IF lien_thong(G) THEN Chọn v là đỉnh xu ất phát Tim_chu_trinh_min(v,G) IF tồn tại chu trình THEN Xuất chu trình ELSE Xuất “Không có chu trình trong đồ thị” END IF ELSE Xuất “Đồ thị không liên thông” END IF Hết thủ tục Thủ tục lien_thong(G) dùng để xét tính liên thông của đồ thị G. Nó được xây dựng dựa trên kỹ thuật duyệt đồ thị theo chiều rộng. Xuất phát từ một đỉnh của đồ thị, thăm các đỉnh kề với nó, và quá trình được lặp lại cho các đỉnh kề này, cho đến khi nào số đỉnh được thăm bằng với tập đỉnh của đồ thị hoặc không còn đỉnh nào để thăm nữa. Thủ tục lien_thong(G) Chọn v là đỉnh đầu tiên của G Trang 6 Đưa v vào danh sách hàng đợi Q Đưa v vào danh sách đã thăm L WHILE Q khác rỗng DO Lấy phần tử t đầu tiên trong Q FOR tất cả các đỉnh d trong tập cạnh V DO IF tồn tại cạnh(d,t) trong G và d chưa thămTHEN Đưa d vào danh sách đã thăm L Đưa d vào danh sách hàng đợi Q END IF END FOR IF L=V THEN return true //đồ thị liên thông END IF END WHILE return false //đồ thị không liên thông Hết thủ tục Thủ tục tim_chu_trinh_min(v,G) thực hiện tìm chu trình Hamilton ngắn nhất trong tất cả chu trình Hamilton có trong đồ thị G và bắt đầu từ đỉnh v. Trong thủ tục này cần gọi đến một thủ tục khác là tim_chu_trinh(v,G) để tìm tất cả các chu trình Hamilton và sau đó chọn một chu trình ngắn nhất trong các chu trình tìm được và nếu chỉ có một chu trình được tìm thấy thì đó là chu trình ngắn nhất. Thủ tục tim_chu_trinh_min(v,G) có thể mô tả như sau: Thủ tục tim_chu_trinh_min(v,G) Kqua={} //chứa danh sách các chu trình Ct=[] //chứa 1 chu trình L=0 //tổng độ dài các cạnh 1 chu trình Tim_chu_trinh(v,G) IF Kqua #{} THEN Ct_min=Kqua[1] //xem chu trình thứ nhất là ngắn nhất Trang 7 D_min=phần tử cuối của Ct_min FOR mỗi chu trình c trong Kqua DO D=phần tử cuối của c //chiều dài của c IF D < D_min THEN Cập nhật D_min=D Cập nhật Ct_min=c END IF END FOR return Ct_min //trả chu trình ngắn nhất về ELSE return {} //không có chu trình END IF Hết thủ tục Thủ tục tim_chu_trinh(v,G) thực hiện tìm các chu trình Hamilton có trong đồ thị với đỉnh bắt đầu là v. Thủ tục sẽ thực hiện đệ qui để tìm tất cả chu trình Hamilton trong đồ thị. M ỗi một chu trình được lưu vào một danh sách và phần tử cuối của danh sách là độ dài của chu trình (tổng các cạnh trong chu trình). Ý tưởng của việc tìm tất cả chu trình Hamilton bằng đệ qui như sau: B1: Đưa đỉnh v vào đường đi B2: Kiểm tra chu trình đủ chiều dài chưa (bằng tập đỉnh?) đồng thời đỉnh đầu và đỉnh cuối có cạnh nối hay không. Nếu đúng, ghi nhận một chu trình Hamilton, ngược lại tới B3 B3: Duy ệt tất cả các đỉnh kề x với v B4: Nếu x chưa đi qua thì gọi đệ qui với đỉnh x để tìm chu trình B5: Loại x ra khỏi chu trình Dựa vào ý tưởng trên, thủ tục tim_chu_trinh(v,G) được thực hiện như sau: Kqua={} //chứa danh sách các chu trình Ct=[] //chứa 1 chu trình L=0 //tổng độ dài các cạnh 1 chu trình n h c h D v à Thủ t ụ Đ ư C ậ IF L) E N F O E N Hết t h 5. Chạ y Mục n h ất cho bà i h ứa 6 chu t D ữ liệu đồ t à k ết quả s ụ c Tim_ch u ư a đỉnh v v ậ p nhật L= L (L=tập đỉ n THEN Temp= Đưa T e N D IF O R m ỗi đỉ n IF (x kh ô Ti m Lo ạ END IF N D FOR h ủ tục y thử ày trình b à i toán ngư ờ t rình Ham i t hị chạy th ử au khi chạ y u _trinh(v, G v ào Ct L + độ dài c n h của G) [Ct,L] e mp vào K q n h x trong G ô ng thuộc C m _chu_tri n ạ i x ra khỏ à y k ết quả c ờ i đưa thư. i lton và cá c ử : y : Trang G ) c ạnh(2 đỉ n AND (có q ua G DO C t) AND ( n h(x,G) i Ct c hạy thử c h Ở đây, d ữ c thuật toá n 8 n h cuối tro n cạnh nối g ( có cạnh n ố //gọi h o thủ tục ữ liệu chạy n trên đượ c n g L) g iữa đỉnh đ ố i giữa x v à đệ qui tìm chu tr ì thử với đ ồ c cài đặt tr ê đ ầu và đỉn h à v) THE N ì nh Hamilt ồ thị có 4 đ ỉ ê n Maple 1 h cuối củ a N on ngắn ỉ nh và 1 6. a đ ó t h c h Trong ó có 2 chu h ì kết quả s h ọn và dm i 6. Hạn Thuật t đỉnh cao hình trên, t r ình có c ù s ẽ là chu tr ì i n là chiều chế oán chỉ ch ạ hơn thì bị dựa vào d ữ ù ng chiều d ì nh thứ nh ấ d ài chu tr ì ạ y tốt với đ lỗi đệ qui Trang ữ liệu của đ d ài là 10, t u ấ t, chính l à ì nh được c h đ ồ thị 4 đỉ n lặ p quá n h 9 đ ồ thị G, c u y nhiên, v à cmin. ct m h ọn. n h, khi đồ t h iều lần. ó 6 chu trì n v ới thuật t o m in là chu t t hị có nhi ề n h Hamilt o o án đã nêu t rình ngắn ề u chu trìn h o n, trong bên trên nhất được h với số . Phát biểu bài toán người đưa thư 4 2. Cách giải 4 3. Cấu trúc dữ liệu 4 4. Các thuật toán 5 5. Chạy thử 8 6. Hạn chế 9 Trang 4 1. Phát biểu bài toán người đưa thư Một người đưa thư xuất. với các con đường mà người đưa thư phải đi qua. Một chu trình đi qua tất cả các cạnh gọi là một hành trình. Giải bài toán người đưa thư tương đương với bài toán tìm chu trình ngắn nhất đi qua. NH Â i đưa t 13 G TIN ỌC Â N T Ạ t hư Ạ O Trang 2 Lời nói đầu Tiểu luận này nhằm trình bày bài toán người đưa thư, đồng thời trình bày cấu trúc dữ liệu sử dụng cũng như các thuật toán

Ngày đăng: 10/04/2015, 00:50

Từ khóa liên quan

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

Tài liệu liên quan