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

Tiểu luận Thuật toán và phương pháp giải quyết vấn đề Bài toán người du lịch

37 1,9K 3

Đ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 37
Dung lượng 1,18 MB

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

Nội dung

LỜI MỞ ĐẦUBài toán Người du lịch, tìm đường đi ngắn nhất cho người thương nhân salesman,hay còn gọi là người chào hàng xuất phát từ một thành phố, đi qua lần lượt tất cả cácthành phố duy

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

Bài thu hoạch môn:

Thuật toán & Phương pháp giải quyết vấn đề

Trang 2

MỤC LỤC

LỜI MỞ ĐẦU 3

PHẦN 1: LÝ THUYẾT LIÊN QUAN BÀI TOÁN NGƯỜI DU LỊCH 4

1 Đường đi, chu trình Hamilton 4

1.1.1 Định nghĩa 4

1.1.2 Điều kiện cần 4

1.1.3 Điều kiện đủ 7

2 Thuật toán nhánh cận giải bài toán người du lịch 10

2.1.1 Giới thiệu bài toán 10

2.1.2 Phương pháp nhánh và cận 10

2.1.3 Cơ sở lý luận của phép toán 11

2.1.4 Ma trận rút gọn 11

2.1.5 Phân nhánh 11

2.1.6 Thủ tục chọn cạnh phân nhánh 12

2.1.7 Chọn 2 cạnh cuối cùng 12

PHẦN 2: THIẾT KẾ CẤU TRÚC DỮ LIỆU VÀ CÀI ĐẶT THUẬT TOÁN 13

1 Thiết kế cấu trúc dữ liệu 13

2 Thuật toán 13

2.1.1 Hàm rút gọn 13

2.1.2 Thủ tục phân nhánh 15

2.1.3 Thủ tục chọn cạnh phân nhánh 17

PHẦN 3: MÃ NGUỒN CHƯƠNG TRÌNH 24

PHẦN 4: GIỚI THIỆU GIẢI BÀI TOÁN NGƯỜI DU LỊCH NỔI TIẾNG BẰNG MÔ PHỎNG HÀNH VI CỦA ĐÀN KIẾN TRONG TỰ NHIÊN 31

4.1.1 Nhắc lại bài toán Người du lịch 31

4.1.2 Ý tưởng mô phỏng hành vi của đàn kiến thực trong tự nhiên 31

4.1.3 Thuật toán đàn kiến giải bài toán người du lịch 32

4.1.4 Hướng dẫn cài đặt bằng ngôn ngữ PASCAL 33

TÀI LIỆU THAM KHẢO 37

Trang 3

LỜI MỞ ĐẦU

Bài toán Người du lịch, tìm đường đi ngắn nhất cho người thương nhân (salesman),hay còn gọi là người chào hàng xuất phát từ một thành phố, đi qua lần lượt tất cả cácthành phố duy nhất một lần và quay về thành phố ban đầu với chi phí rẻ nhất, đượcphát biểu vào thế kỷ 17 bởi hai nhà toán học vương quốc Anh là Sir William RowanHamilton và Thomas Penyngton Kirkman, và được ghi trong cuốn giáo trình Lý thuyết

đồ thị nổi tiếng của Oxford Nó nhanh chóng trở thành bài toán khó thách thức toànthế giới bởi độ phức tạp thuật toán tăng theo hàm số mũ (trong chuyên ngành thuậttoán người ta còn gọi chúng là những bài toán NP-khó) Người ta bắt đầu thử và công

bố các kết quả giải bài toán này trên máy tính từ năm 1954 (49 đỉnh), cho đến năm

2004 bài toán giải được với số đỉnh lên tới 24.978, và dự báo sẽ còn tiếp tục tăng caonữa

Bài toán Người du lịch (Travelling Salesman Problem) là một trong những bài toánkinh điển và khó trong tin học Có rất nhiều cách tiếp cận giải bài toán này ngay từ khi

nó mới ra đời, như sử dụng quy hoạch tuyến tính, nhánh và cận Gần đây các cách tiếpcận về tiến hóa, như thuật toán di truyền được áp dụng có những kết quả khả quan.Trong tiểu luận này, em xin được phép giới thiệu chi tiết phương pháp nhánh vàcận và sơ lược về phương pháp giải độc đáo dựa vào mô phỏng hành vi của đàn kiếnthực với quá trình tha thức ăn về tổ trong tự nhiên để giải bài toán tìm đường đi ngắnnhất cho người du lịch Đây là phương pháp tương đối khó nên trong tiểu luận này chỉnhấn mạnh vào ý tưởng, và hướng dẫn cài đặt, cũng như trình bày một cách đơn giảnnhất qua đó có được một cách nhìn khác với các cách giải truyền thống bài toán này.Bài thu hoạch này em xin trình bày bốn phần sau đây:

Phần 1: Lý thuyết liên quan đến bài toán người du lịch

Phần 2: Thiết kế cấu trúc dữ liệu và cài đặt chương trình

Em xin chân thành cảm ơn PGS TS Đỗ Văn Nhơn đã có những bài giảng súc tích

và sâu sắc để tạo cảm hứng cho sự ra đời của bài thu hoạch này

Trang 4

PHẦN 1: LÝ THUYẾT LIÊN QUAN BÀI TOÁN NGƯỜI DU LỊCH

1 Đường đi, chu trình Hamilton

1.1.1 Định nghĩa

Cho đồ thị (có hướng) G=(V,E)

Chu trình (có hướng) Hamilton là chu trình (có hướng) sơ cấp qua mọi đỉnh đồ thị Đường đi (có hướng) Hamilton là đường đi (có hướng) sơ cấp qua mọi đỉnh đồ thị.

Như vậy mọi chu trình Hamilton có độ dài bằng số đỉnh, và mọi đường đi Hamilton

Định lí: Giả sử đồ thị G có chu trình Hamilton C Khi đó

(i) Đồ thị G liên thông

(ii) Mọi đỉnh của G có bậc lớn hơn hoặc bằng 2, và có đúng hai cạnh liên thuộcthuộc chu trình C

(iii) Nếu xóa đi k đỉnh bất kỳ cùng các cạnh liên thuộc chúng, thì đồ thị còn lại

sẽ có tối đa k thành phần liên thông.

Giả sử đồ thị n đỉnh G có đường đi Hamilton P Khi đó

(i) Đồ thị G liên thông

(ii) Có ít nhất n2 đỉnh bậc  2, và mỗi đỉnh có đúng hai cạnh liên thuộc thuộc

đường đi P

(iii) Nếu xóa đi k đỉnh bất kỳ cùng các cạnh liên thuộc chúng, thì đồ thị còn lại

sẽ có tối đa k +1 thành phần liên thông.

Trang 5

Ví dụ 1 Xét đồ thị

Hình 2

Đồ thị không có chu trình Hamilton

Thật vậy, nếu tồn tại chu trình Hamilton C thì nó phải có 5 cạnh Vì bậcdeg(v2) = deg(v4) = 3 nên phải một cạnh tới v2 và một cạnh tới v4 không thuộc chutrình C Số cạnh còn lại là 4 nên C không thể có 5 cạnh được, mâu thuẫn

Ta cũng có thể áp dụng trực tiếp Định lý trên Nếu bỏ đi 2 đỉnh v2 và v4 cùngcác cạnh liên thuộc chúng thì đồ thị còn lại là 3 đỉnh độc lập, có 3 thành phần liênthông Như vậy theo mệnh đề (iii) của Định lý trên thì đồ thị không có chu trìnhHamilton

Ví dụ 2 Chứng minh rằng đồ thị sau không có đường đi Hamilton.

Vì số cạnh liên thuộc 1 đỉnh nằm trên đường đi P nhiều nhất là 2 nên mỗi tập

E1, E2, E3, E7 có ít nhất 1 cạnh và mỗi tập E4, E5, E6 có ít nhất 3 cạnh Vì vậy

k  4*1 + 3*3 =13

Trang 6

mâu thuẫn với (**).

- Cách 2 Xét 9 đỉnh còn lại Đây là các đỉnh không kề nhau từng cặp một, trong

đó có ít nhất 7 đỉnh có 2 cạnh liên thuộc  P và 2 đỉnh còn lại có ít nhất 1 cạnh liênthuộc  P Như vậy số cạnh  P ít nhất là 7*2+2 = 16, mâu thuẫn với (*)

- Cách 3 Xoá 7 đỉnh 1, 2, 3, 4, 5, 6, 7 và các cạnh liên thuộc thì đồ thị còn lại

có 9 đỉnh cô lập, tức 9 thành phần liên thông Theo hệ quả 2.4.2 (iii), đồ thị không cóđường đi Hamilton

Ví dụ 3 (Bài toán xếp chỗ ngồi) 9 người bạn cùng ngồi ăn trong bàn tròn 4 lần Mỗi

lần họ được xếp ngồi theo một thứ tự Hãy thay đổi chỗ ngồi mỗi lần sao cho không có

2 người ngồi gần nhau hơn 1 lần

Ta lập đồ thị 9 đỉnh 1,2, ,9, đỉnh i chỉ người i Ta đặt đỉnh 1 tại tâm và các đỉnhcòn lại trên đường tròn như hình vẽ Mỗi cách xếp là một chu trình Hamilton của đồthị

Trang 7

Định lý 1 Đồ thị đủ Kn với n lẻ (n  3) có (n1)/2 chu trình Hamilton từng đôi

một không giao nhau (tức là không có cạnh chung)

Chứng minh

Tương tự như lời giải bài toán xếp 9 người trên bàn tròn, ta xây dựng cách xếptheo chu trình Hamilton trên đồ thị sau (n=2k+1):

123 2k2k+11

Hình 8

Trang 8

Xoay chu trình lần lượt một góc /k theo chiều kim đồng hồ ta nhận được kcách xếp.

Định lý 2 (Dirac): Cho G là đơn đồ thị n đỉnh (n  3) Nếu bậc deg(v)  n/2 với

mọi đỉnh v của G, thì G có chu trình Hamilton.

Định lý 3: Cho G là đồ thị đơn n đỉnh (n  3) Nếu bậc deg(v)  (n1)/2 với mọi đỉnh

v của G thì G có đường đi Hamilton

Chứng minh

Nếu n = 1 thì G có đường Hamilton tầm thường là 1 đỉnh

Giả sử n > 1 Ta lập đồ thị H bằng cách thêm vào G đỉnh v và tất cả các cạnh nối vvới mọi đỉnh của G Đồ thị H có n + 1 đỉnh và deg(v) = n Với mọi đỉnh uG ta có:

degH(u) = degG(u) + 1  (n1)/2 + 1 = (n+1)/2

Theo định lý Dirac thì H có chu trình Hamilton C Bỏ đi v và các cạnh tới v tađược đường đi Hamilton trong G

Định lý 4: Cho G là đồ thị đơn n đỉnh (n  3) Giả sử u và v là hai đỉnh không kề

nhau của G sao cho:

deg(u) + deg(v)  n

Khi đó G có chu trình Hamilton khi và chỉ khi đồ thị G+(u,v) (đồ thị G thêm cạnh(u,v)) có chu trình Hamilton

Định lý 5: Cho G là đồ thị đơn giản n đỉnh Giả sử G’ và G” là hai đồ thị thu được

từ G bằng quy nạp nối tất cả cặp đỉnh không kề nhau có tổng các bậc ít nhất bằng n.Khi đó ta có G’ = G”

Từ định lý trên ta có thể định nghĩa khái niệm bao đóng của đồ thị.

Định nghĩa 6: Bao đóng C(G) của đồ thị G n đỉnh là đồ thị thu được từ G bằng cách,

theo quy nạp, nối tất cả các cặp đỉnh không kề nhau mà tổng số bậc ít nhất bằng n cho

đến khi không còn cặp đỉnh nào như vậy nữa

Ví dụ 2.4.5 Minh hoạ cách xây dựng bao đóng.

Hình 9

Định lý 7: Đồ thị G có chu trình Hamilton khi và chỉ khi bao đóng của G có chu trình

Hamilton

Định lý 8: Nếu bao đóng C(G) = Kn (n3) thì đồ thị G có chu trình Hamilton

Định lý 9 (Định lý Ore): Cho G là đơn đồ thị n đỉnh (n3) Nếu deg(u)+deg(v)n

với mọi cặp đỉnh không kề nhau thì đồ thị G có chu trình Hamilton

Định lý 10: Cho G là đơn đồ thị n đỉnh (n3) và m cạnh Nếu m  C(n1,2)+2 thì

Trang 9

Định lý 11: Cho đồ thị đơn G là đồ thị lưỡng phân với hai tập đỉnh V1 và V2 saocho:

card(V1) = card(V2) = n  2Nếu bậc deg(v) > n/2 với mọi đỉnh v của G, thì G có chu trình Hamilton

Đồ thị có hướng.

Cho đồ thị có hướng G với n đỉnh Ta có các kết quả phát biểu trong các định

lý sau

Định lý 12: (điều kiện đủ tồn tại chu trình có hướng Hamilton)

a (Meyniel) Nếu đồ thị G liên thông mạnh và

deg(u) + deg(v)  2n1 u, vG không kề nhau

thì G có chu trình có hướng Hamilton

b (Ghoula-Houri) Nếu đồ thị G liên thông mạnh và

deg(v)  n  vG

thì G có chu trình có hướng Hamilton

c (Woodall) Nếu

degO(u) + degI(v)  n u, vG không tồn tại cung từ u đến v

thì G có chu trình có hướng Hamilton

deg(u) + deg(v)  2n3 u, vG không kề nhau

thì G có đường đi có hướng Hamilton.

b Nếu

deg(v)  n  1  vG

thì G có đường đi có hướng Hamilton.

c Nếu

degO(u) + degI(v)  n  1 u, vG không tồn tại cung từ u đến v

thì G có đường đi có hướng Hamilton.

d Nếu

degI(v)  n/2 & degO(v)  n/2 vG

thì G có đường đi có hướng Hamilton.

Bây giờ chúng ta sẽ nghiên cứu đường đi và chu trình có hướng Hamilton trong

đồ thị có hướng đủ (có đồ thị lót đủ) Trước hết là định lý khẳng định sự tồn tại đường

đi có hướng Hamilton trong đồ thị có hướng đủ

Định lý 14 (Konig) Mọi đồ thị có hướng đủ đều có đường đi có hướng Hamilton Định lý 15 (Camion) Đồ thị có hướng đủ có chu trình có hướng Hamilton khi và chỉ

khi nó liên thông mạnh

Trang 10

2 Thuật toán nhánh cận giải bài toán người du lịch

2.1.1 Giới thiệu bài toán

Một người xuất phát từ một thành phố nào đó muốn tới thăm n 1 thànhphố khác, mỗi thành phố đúng một lần, rồi quay về thành phố ban đầu Hỏi nên đitheo trình tự nào để độ dài tổng cộng các đoạn đường đi qua là ngắn nhất (khoảngcách giữa hai thành phố có thể hiểu là cự ly thông thường hoặc thời gian cần đi hoặcchi phí của hành trình, và xem như cho trước)

Xét đồ thị đầy đủ G=(V,E), với V={1, 2, ., n}, có trọng số với trọng sốmij= m(i,j) có thể khác mji = m(j,i) Như vậy, ta có thể xem G như là một đồ thị cóhướng đầy đủ “mạnh” theo nghĩa với mọi i, j=1, 2, ., n, i≠j, luôn có (i,j),(j,i)E Bài toán trở thành tìm chu trình Hamilton có độ dài ngắn nhất trong G.Bài toán nổi tiếng này đã có lời giải bằng cách sử dụng phương pháp “nhánh vàcận”

2.1.2 Phương pháp nhánh và cận

Thuật toán nhánh cận là một trong các phương pháp chủ yếu giải bài toán tối ưu

tổ hợp Tư tưởng cơ bản của nó là trong quá trình tìm kiếm ta phân hoạch các phương

án của bài toán ra thành hai hay nhiều tập con như là các nút của cây tìm kiếm và cốgắng đánh giá cận cho các nút, loại bỏ những nhánh mà ta biết chắc chắn là khôngchứa phương án tối ưu

Xét bài toán người du lịch Gọi

Trong bài toán người du lịch khi tiến hành tìm kiếm lời giải ta sẽ phân tập hànhtrình thành hai tập con: Một tập chứa cạnh (i,j) và tập không chứa cạnh này Ta gọiviệc đó là phân nhánh, mỗi tập con nói trên gọi là nhánh Việc phân nhánh được minhhoạ bởi cây tìm kiếm:

Tập tất cả hành trình

Việc phân nhánh sẽ được dựa trên qui tắc hợp lý nào đó cho phép ta rút ngắnquá trình tìm kiếm phương án tối ưu Sau khi phân nhánh ta sẽ tính cận dưới của hàmmục tiêu trong mỗi tập con nói trên Việc tìm kiếm sẽ tìm trên tập con có cận dưới nhỏhơn Thủ tục sẽ tiếp tục cho đến khi thu được hành trình đầy đủ, tức là phương án củabài toán người du lịch Sau đó ta chỉ cần xét những tập con có cận dưới nhỏ hơn giá trịhàm mục tiêu tìm được

Trang 11

2.1.3 Cơ sở lý luận của phép toán

Nếu không xác định thành phố xuất phát thì có n! hành trình, mỗi hành trìnhứng với một hoán vị nào đó của tập {1, 2, , n} Còn nếu cho trước thành phố xuấtphát thì có tất cả là (n 1)! hành trình

2.1.4 Ma trận rút gọn

Rõ ràng tổng chi phí của một hành trình sẽ chứa đúng một phần tử trên mỗi dòng

và mỗi cột của ma trận chi phí C = (cij) Do đó nếu ta trừ bớt mỗi phần tử của mộtdòng (hay một cột) đi cùng một giá trị thì chi phí của tất cả hành trình sẽ giảm đi mộtlượng, vì thế hành trình tối ưu sẽ không thay đổi Vì vậy nếu tiến hành trừ bớt cácphần tử của mỗi dòng và mỗi cột đi một hằng số sao cho thu được ma trận không âm

và mỗi cột cũng như mỗi dòng chứa ít nhất một số 0 , thì tổng các hằng số trừ đi đó sẽcho ta cận dưới của mọi hành trình Thủ tục trừ bớt này gọi là thủ tục rút gọn, các hằng

số trừ ở mỗi dòng (cột) gọi là hằng số rút gọn dòng (cột), ma trận thu được gọi là matrận rút gọn

Thủ tục rút gọn:

 Đầu vào : Ma trận chi phí C = (cij)

 Đầu ra : Ma trận rút gọn và tổng hằng số rút gọn Sum

 Thuật toán:

(i) Khởi tạo :

Sum := 0 ; (chỉ áp dụng cho ma trận chi phí ban đầu)

- Giảm cấp ma trận chi phí C bằng cách loại dòng r và cột s

- Ngăn cấm tạo chu trình con :

Trang 12

được hiệu chỉnh và giảm 1 bậc Việc chọn cạnh nào để phân nhánh ta sẽ bàn ở mụctiếp theo.

(i) Khởi tạo :  :=  ;

(ii) Với mỗi cặp (i,j) thoả c ij = 0 (i=1, ,k; j=1, ,k) thực hiện

- Xác định

minr = min{cih : h  j }mins = min{chj : h  i }

- Nếu  < minr + mins , đặt

 := minr + mins; r := i; s := j;

2.1.7 Chọn 2 cạnh cuối cùng

Mỗi hành trình có n cạnh Sau khi đã chọn n2 cạnh, ta phải chọn nốt 2 cạnh còn

lại Lúc này ma trận rút gọn có bậc 2 và là một trong hai dạng sau

cùng cận dưới 

Trong trường hợp (i) ta chọn hai cạnh (p,u) và (q,v), còn trong trường hợp (ii)

ta chọn hai cạnh (p,v) và (q,u) Tổng chi phí là 

Trang 13

PHẦN 2: THIẾT KẾ CẤU TRÚC DỮ LIỆU VÀ CÀI ĐẶT THUẬT TOÁN

1 Thiết kế cấu trúc dữ liệu

Để giải quyết các vấn đề của đồ thị bằng máy tính chúng ta cần lưu giữ đồ thịtrong bộ nhớ của máy tính Do đó chúng ta cần đưa ra các phương pháp biểu diễn đồthị bởi các cấu trúc dữ liệu Có nhiều phương pháp biểu diễn đồ thị: biểu diễn đồ thịbằng ma trận kề, ma trận liên thuộc, danh sách cạnh(cung) và danh sách kề

Trong đề tài này đồ thị được lưu trữ bởi ma trận vuông COST[n][n], với n là số

đỉnh của đồ thị và COST[I][J] là chi phí đi từ đỉnh i đến đỉnh j

20

15

51

55

201

0 20

2

Trang 14

Với mỗi cột c từ 1 đến n của ma trận C thực hiện :

Trừ bớt các phần tử dòng 1, 2, 3, 4, 5, 6 đi các hằng số rút gọn tương ứng trên cột ta được ma trận

Trang 15

( nghĩa là không có hành trình có tổng chi phí nhỏ hơn 81).

2.1.2 Thủ tục phân nhánh

Giả sử ta chọn cạnh phân nhánh (r, s) Như vậy các hành trình sẽ được chia làm hai tập: P1 chứa các hành trình qua (r, s) và P2 chứa các hành trình không qua (r,s).+ Nhánh tập P1 : Cận dưới  với giá trị xuất phát có từ thủ tục rút gọn

- Giảm cấp ma trận chi phí C bằng cách loại dòng r và cột s

- Ngăn cấm tạo hành trình con :

Cấm cạnh (s,r) bằng cách đặt csr = 

Nếu (r,s) là cạnh phân nhánh thứ hai trở đi thì phải xét các cạnh đã chọn nối

trước và sau cạnh (r,s) thành dãy nối tiếp các cạnh như hình sau

+ Ví dụ Xét tiếp ví dụ trên Giả sử ta chọn cạnh phân nhánh là (r,s) = (6,3) Các hành

trình sẽ được phân thành hai nhánh:

P1 chứa các hành trình qua cạnh (6,3) và

P2 chứa các hành trình không qua cạnh (6,3)

 Xét nhánh tập P1 :

- Giảm cấp ma trận chi phí C bằng cách loại dòng 6 và cột 3

- Ngăn cấm tạo hành trình con :

Trang 16

Ta nhận được ma trận chi phí tương ứng cùng cận dưới xuất phát  = 81.

Vì ma trận đã ở dạng rút gọn nên cận dưới vẫn giữ nguyên  = 81

Ta có thể tiếp tục thủ tục phân nhánh theo nhánh này với ma trận chi phí đã đượchiệu chỉnh Việc chọn cạnh nào để phân nhánh ta sẽ bàn ở mục tiếp theo

Trang 17

Thủ tục chọn cạnh phân nhánh (r,s)

+ Đầu vào : Ma trận rút gọn bậc k

+ Đầu ra : Cạnh phân nhánh (r,s).

+ Thuật toán :

(i) Khởi tạo :  := - ;

(ii) Với mỗi cặp (i,j) thoả cij = 0 (i=1, ,k; j=1, ,k) thực hiện

- Xác định

minr = min{cih : h  j }mins = min{chj : h  i }

- Nếu  < minr + mins , đặt

 := minr + mins; r := i; s := j;

+ Ví dụ Xét tiếp ví dụ trên Ta đi theo nhánh P1 , qua cạnh (6,3) Cận dưới  = 81

và ma trận chi phí tương ứng như sau

Trang 18

- Cấm tạo chu trình con:

Cạnh (6,3) chọn trước kế tiếp sau cạnh (4,6)

(4,6) (6,3)Trong bước này ta cấm cạnh (3,4), bằng cách đặt c34 =  Ta nhận được ma trận

Ngày đăng: 23/05/2015, 00:07

HÌNH ẢNH LIÊN QUAN

Đồ thị không có chu trình Hamilton. - Tiểu luận Thuật toán và phương pháp giải quyết vấn đề Bài toán người du lịch
th ị không có chu trình Hamilton (Trang 5)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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