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

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

9 578 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 261,15 KB

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

Nội dung

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ắc lại: Trong lý thuyết đồ thị, một đường đi Hamilton là

Trang 1

Giảng v

Học viên

Mã số: C

TRƯỜ

BÀI YMBO

Đề t

iên: PGS

n: Đào Th

CH110111

ỜNG ĐẠI ĐẠI HỌ

THU OLIC V

ài: Bài

.TS Đỗ V

hị Phấn

18

TPH

HỌC CÔN

ỌC QUỐC

HOẠC

VÀ TR

i toán

ăn Nhơn

HCM, Thá

NG NGHỆ

C GIA TP

CH MÔ

RÍ TUỆ

người

áng 02/20

Ệ THÔNG HCM

ÔN H

Ệ NHÂ

i đưa t

13

G TIN

ỌC

ÂN TẠ

thư

Ạ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

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

Trang 8

ch

D

Thủ tụ

Đư

Cậ

IF

L)

EN

FO

EN

Hết th

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_chu

ưa đỉnh v v

ập nhật L=L

(L=tập đỉn

THEN

Temp=

Đưa Te

ND IF

OR mỗi đỉn

IF (x khô Tim Loạ END IF

ND FOR

hủ tục

y thử

ày trình bà

i toán ngườ

trình Hami

thị chạy thử

au khi chạy

u_trinh(v,G vào Ct L+ độ dài c

nh của G)

[Ct,L]

emp vào Kq

nh x trong G ông thuộc C m_chu_trin

ại x ra khỏ

ày kết quả c

ời đưa thư

ilton và các ử:

y:

G)

cạnh(2 đỉn AND (có

qua

G DO Ct) AND ( nh(x,G)

i Ct

chạy thử ch

Ở đây, dữ

c thuật toán

nh cuối tron cạnh nối g

(có cạnh nố //gọi

ho thủ tục

ữ liệu chạy

n trên được

ng L) giữa đỉnh đ

ối giữa x và

đệ qui

tìm chu trì thử với đồ

c cài đặt trê

đầu và đỉnh

à v) THEN

ình Hamilt

ồ thị có 4 đỉ

ên Maple 1

h cuối của

N

on ngắn ỉnh và

16

a

Trang 9

th

ch

Trong

ó có 2 chu

hì kết quả s

họn và dmi

6 Hạn

Thuật t

đỉnh cao

hình trên,

trình có cù

sẽ là chu trì

in 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

ữ liệu của đ dài là 10, tu

ất, chính là ình được ch

đồ thị 4 đỉn lặp quá nh

đồ thị G, c

uy nhiên, v

à cmin ctm họn

nh, khi đồ t hiều lần

ó 6 chu trìn với thuật to min là chu t

thị có nhiề

nh Hamilto oán đã nêu trình ngắn

ều chu trình

on, trong bên trên nhất được

h với số

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

HÌNH ẢNH LIÊN QUAN

Đồ thị 4 đỉn lặp quá nh - Tiểu luận LẬP TRÌNH SYMBOLIC Bài toán người đưa thư
th ị 4 đỉn lặp quá nh (Trang 9)

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