Tải bản đầy đủ (.pdf) (31 trang)

đềtài lý thuyết đồ thị chutrìnheulervà chu trìnhhamilton

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.23 MB, 31 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCMĐH QUỐC GIA TP HỒ CHÍ MINH</b>

<b>BÁO CÁO BÀI TẬP LỚNĐẠI SỐ TUYẾN TÍNH</b>

<b>NỘI DUNG ĐỀ TÀI:</b>

<b>LÝ THUYẾT ĐỒ THỊ (CHU TRÌNH EULERVÀ CHU TRÌNH HAMILTON)</b>

<b>GV Hướng Dẫn: Nguyễn TrọngLớp L04 Nhóm 12</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>NHẬN XÉT CỦA GVHD</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>MỤC LỤC</b>

LỜI MỞ ĐẦU ---3

1 Chu trình Euler, Đường đi Euler và Đồ thị Euler --- 4

1.1 Các định nghĩa cơ bản về lí thuyết đồ thị --- 4

1.2 Khái niệm Chu trình Euler, Đường đi Euler và Đồ thị Euler --- 7

1.3 Thuật tốn Fleury tìm chu trình Euler ---8

1.4 Một số thuật tốn trên Đồ thị --- 9

1.5 THUẬT TỐN TÌM 1 CHU TRÌNH EULER TỪ 1 ĐỈNH BẤT KÌ --- 13

3. Thuật tốn quay lui giải bài toán người giao hàng ---19

3.1 Thuật toán quay lui: --- 19

3.2 Bài toán người giao hàng: --- 19

3.3 Cách giải bài toán người giao hàng ---20

4. Ứng dụng của bài toán Người giao hàng ---21

5. Cài đặt chương trình và minh họa kết quả --- 22

5.1 Cấu trúc dữ liệu và giải thuật --- 22

5.2 Cấu trúc dữ liệu --- 24

5.3 Giải thuật ---25

5.4 Minh họa kết quả --- 26

<b>LỜI MỞ ĐẦU</b>

Mơn Đại Số Tuyến Tính là một mơn học có những ứng dụng rất thực tế vào đời sống ,trong nhiều lĩnh vực khác nhau như kĩ thuật ảnh, bn bán,kinh tế,…Nó có tác động to lớn đến lí thuyết đồ thị ngày nay và mai sau.

Trong q trình học tập tại trường chúng tơi đã nhận được sự hỗ trợ nhiệt tình từ giáo viên bộ môn và bạn bè xung quanh đã giúp chúng em có những cái nhìn mới mẻ hơn về mơn học .Nó khơng chỉ đơn thuần là lí thuyết mà đó cịn là thực tiễn.Vì thế ,chúng em quyết định viết bài báo cáo nghiên cứu về lí thuyết đồ thị xoay quanh các định nghĩa về đồ thị và chu trình euler và hamilton

Qua việc thực hiện bài báo cáo này đã giúp chúng em hiểu thêm những kiến thức bổ ích .Tuy nhiên trong q trình làm báo cáo khó trách khỏi thiếu sót .Chúng em mong nhận được sự xem xét từ thầy để báo cáo được hoàn thiện hơn

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>1 Chu trình Euler, Đường đi Euler và Đồ thị Euler1.1 Các định nghĩa cơ bản về lí thuyết đồ thị</b>

1. Đơn đồ thị vơ hướng

+ Đơn đồ thị vô hướng : G = <V, E>, gồm V là tập các đỉnh, E là tập các cặp khơng có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh

2.Đa đồ thị vô hướng

+ Đa đồ thị vô hướng G = <V, E>, gồm V là tập các đỉnh, E là họ các cặp khơng có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh. Hai cạnh e1, e2 được gọi là cạnh bội nếu chúng cùng tương ứng với 1 cặp đỉnh

3.Đơn đồ thị có hướng

+ Đơn đồ thị có hướng :G = <V, E>, gồm V là tập các đình, E là tập các cặp có thứ tự gồm hai phần tử V gọi là các cung

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

4.Đa đồ thị có hướng

+ Đa đồ thị có hướng G = <V, E>, gồm V là tập các đỉnh, E là họ các cặp có thứ tự gồm hai phần tử V gọi là các cung. Hai cung e1, e2 tương ứng với cùng một cặp đình được gọi là cung lặp

+ Dây các đỉnh (hoặc dãy các cạnh) trong đó 2 đình liên tiếp có cạnh nổi. Độ dài đường đi là số cạnh trên đường đi.

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

13.Liên thông yếu

+Đồ thị có hướng gọi là liên thơng yếu nếu đồ thị vơ hướng tương ứng của nó liên <small>thơng</small>

Ví dụ 1.1. Tìm các đường đi, chu trình trong đồ thị vơ hướng như hình 1.1

<small>Hình 1.1. Đường đi trên đồ thị</small> + a, b, c, d là đường đi đơn độ dài 3.

+ a, b, f, không là đường đi vì (b, f) khơng phải là cạnh của đồ thị. + Dãy a, b, c, f, e, a là chu trình độ dài 5.

+ Đường đi a, b, c, f, e, b, c có độ dài 6 khơng phải là đường đi đơn vì cạnh (b, c) có mặt hai lần.

<small>Ví dụ 1.2. Kiểm tra tính liên thơng của đồ thị hình 1.2</small>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<small>Đồ thị này khơng liên thơng vì có đỉnh g là đỉnh cơ lập nên khơng có đường đi từđình bất kỳ đến đỉnh g.</small>

<small>Hình 1.2. Đồ thị khơng liên thơng</small>

<i><b>1.2 Khái niệm Chu trình Euler, Đường đi Euler và Đồ thị Euler</b></i>

<small>Cho đồ thị vơ hướng G=(V,E).</small>

<i><small>Chu trình Euler là chu trình đi qua mọi cạnh và mọi đỉnh của đồ thị, mỗi cạnh</small></i>

<small>không đi quá 1 lần.</small>

<i><small>Đường đi Euler là đường đi qua mọi cạnh và mọi đỉnh của đồ thị, mỗi cạnh khơng</small></i>

<small>đi q 1 lần.</small>

<small>Cho đồ thị có hướng G=(V,E).</small>

<i><small>Chu trình có hướng Euler là chu trình có hướng đi qua mọi cung và mọi đỉnh đồ thị,</small></i>

<small>mỗi cung không đi quá 1 lần.</small>

<i><small>Đường đi có hướng Euler là đường đi có hướng đi qua mọi cung và mọi đỉnh đồ thị,</small></i>

<small>mỗi cung không đi quá 1 lần.</small>

<i><small>Đồ thị chứa chu trình Euler gọi là Đồ thị Euler.</small></i>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<i><b>1.3 Thuật tốn Fleury tìm chu trình Euler</b></i>

<i>Đầu vào. Đồ thị G ≠</i> <small>∅</small>, khơng có đỉnh cơ lập.

<i>Đầu ra. Chu trình Euler C của G, hoặc kết luận G khơng có chu trình Euler</i>

-Trường hợp đỉnh v<small>1</small>khơng là đỉnh treo:

Nếu mọi cạnh liên thuộc v<small>1</small>là cầu, thì khơng có chu trình Euler, kết thúc.

-Ngược lại, chọn cạnh( v<small>1</small>,v<small>2</small>) bất kỳ không phải là cầu trong H. Thêm vào đường đi đỉnh v<small>2</small>. Sang bước (4)

(4)Xoá cạnh vừa đi qua, và xố đỉnh cơ lập:

Loại khỏi H cạnh ( v<small>1</small>,v<small>2</small>). Nếu H có đỉnh cơ lập, thì loại chúng khỏi H. Đặt v<small>1</small>:=v<small>2</small>.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

+Nếu xuất phát từ đỉnh 1, có hai cách đi tiếp: hoặc sang 2 hoặc sang 3, giả sử ta sẽ sang 2 và xoá cạnh (1, 2) vừa đi qua. Từ 2 có ba cách để đi, là sang 3 sang 4 hoặc sang 5, giả sử ta sẽ sang 5 và xoá cạnh (2, 5) vừa đi qua. Từ đỉnh 5, chỉ có 1 cách đi là sang đỉnh 6, nên cho dù (5, 6) là cầu ta cũng phải đi sau đó xố ln cạnh (5, 6). Từ đỉnh 6, chỉ có 1 cách đi là sang đỉnh 3, nên cho dù (6, 3) là cầu ta cũng phải đi sau đó xố ln cạnh (6, 3). Đến đây, các cạnh cịn lại của đồ thị có thể vẽ như Hình bằng nét liền, các cạnh đã bị xố được vẽ bằng nét đứt.

<small>Hình 1.5. Duyệt đồ thị theo thuật tốn Fleury</small>

Bây giờ đang đứng ở đỉnh 6 thì ta có 3 cách đi tiếp: sang 1, sang 2 hoặc sang 4. Vì (3, 1) là cầu nên ta sẽ không đi theo cạnh (3, 1) mà sẽ đi (3, 4) hoặc (3, 2). Nếu đi

theo (3, 4) và cứ tiếp tục đi như vậy, ta sẽ được chu trình Euler là <1, 2, 5, 6, 3, 4, 2, 3, 1>. Cịn đi theo (3, 2) sẽ tìm được chu trình Euler là: <1, 2, 5, 6, 3, 2, 4, 3, 1>.

<i><b>1.4 Một số thuật toán trên Đồ thị</b></i>

<b>*Thuật toán Floyed tìm đường đi ngắn nhất giữa mọi cặp đỉnh trên đồthị:</b>

Thuật giải tìm độ dài đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng liên thơng có trọng số (khơng bắt buộc ≥ 0).

<i>Đầu vào. Đồ thị liên thơng G=(V,E), V= {1, 2,..., n}, có trọng số w(i,j) với</i>

mọi cung (i,j).

<i>Đầu ra. Ma trận D=[d(i,j)], trong đó d(i,j) là chiều dài đường đi ngắn nhất từ</i>

i đến j với mọi cặp (i,j).

<i>Phương pháp:</i>

Bước khởi tạo: Ký hiệu D<small>0</small>là ma trận xuất phát D<small>0</small>= [d<small>0</small>(i,j)] <small>4</small>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

Trong đó: d<small>0</small>(i,j) = w(i,j) nếu tồn tại cung (i,j) và d<small>0</small>(i,j) = <small>+</small> nếu không tồn tại cung (i,j) (đặc biệt nếu khơng có khun tại i thì d<small>0</small>(i,i) =<small>+</small>).

Gán k:=0.

Kiểm tra kết thúc: Nếu k = n, kết thúc.

D = D<small>n</small> là ma trận độ dài đường đi ngắn nhất. Ngược lại tăng k lên 1 đơn vị (k:=k+1) và sang (3).

Tính ma trận D<small>k</small>theo D<small>k-1</small>:

Với mọi cặp (i,j), i=1..n, j=1..n thực hiện:

Nếu d<small>k-1</small>(i,j) > d<small>k-1</small>(i,k) + d<small>k-1</small>(k,j) thì đặt d<small>k</small>(i,j) := d<small>k-1</small>(i,k) + d<small>k-1</small>(k,j) ngược lại đặt d<small>k</small>(i,j) := d<small>k-1</small>(i,j) Quay lại bước (2).

<i><b>Định lý 1: Thuật toán Floyd là đúng.Hệ quả:</b></i>

Nếu ma trận kết quả của thuật tốn Floyd có phần tử hữu hạn trên đường chéo i = i thì đồ thị chứa chu trình.

Nếu ma trận kết quả chứa phần tử +∞ ngồi đường chéo i = i thì đồ thị không liên thông mạnh.

<i>Ghi chú: Từ hệ quả trên ta có thể sử dụng thuật tốn Floyd, với w(i, j) = 1</i>

nếu tồn tại cung (i, j) và w(i, j)= +∞ nếu không tồn tại cung (i, j), để xác định xem đồ thị có chu trình hay có liên thông hay không.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<small>D0=</small> <b><small>3</small></b> <small>3</small>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Từ ma trận D<small>0</small>, theo thuật toán, ta xây dựng các ma trận tiếp theo như sau (các ô gạch dưới có giá trị thay đổi)

<small>Bảng 1.8. Các bước tìm đường đi ngắn nhất giữa mọi cặp đỉnh bằng Floyd</small>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Cuối cùng, D<small>6</small>là ma trận khoảng cách ngắn nhất giữa các đỉnh. Theo hệ quả ta thấy đồ thị liên thông chứa mạnh và chu trình

<b>1.5 THUẬT TỐN TÌM 1 CHU TRÌNH EULER TỪ 1 ĐỈNH BẤT KÌ</b>

import numpy as np

n = int(input('Nhập số đỉnh của đồ thị: '))

adj = [[] for _ in range(n)] #tạo 1 ds kề adj với n phần tử để chứa các đỉnh kề degree = [0] * n #Tạo một danh sách để lưu chữ bậc của đỉnh

print("Nhập ma trận kề (mỗi hàng cách nhau một dấu cách):") a = np.array([input().split() for _ in range(n)], dtype=int) #Lệnh để tạo nên danh sách kề và bậc của đỉnh

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

#Tạo ngăn xếp rỗng để lưu trữ các đỉnh trong quá trình tìm kiếm

#Điều kiện để là chu trình euler

if (all(degree[i] % 2 == 0 for i in range(n))) and all(visited):

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Nhập dữ liệu:

In ra kết quả:

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<b>2 Đồ thị Hamilton</b>

<b>2.1 Khái niệm đường đi, chu trình Hamilton</b>

Cho đồ thị G = (V, E) có n đỉnh.

<i>Chu trình (x<small>1</small>, x<small>2</small>, ..., x<small>n</small>, x<small>1</small></i>) được gọi là chu trình Hamilton nếu<i><small>xi≠ xjvới 1 ≤ i < j ≤ n</small>Đường đi (x<small>1</small>, x<small>2</small>, ..., x<small>n</small></i>) được gọi là đường đi Hamilton nếu<i><small>xi≠ xjvới 1 ≤ i < j ≤ n</small></i>

Chúng ta có thể phát biểu lại như sau:

+ Chu trình Hamilton là chu trình xuất phát từ 1 đỉnh, đi thăm tất cả những đỉnh còn lại mỗi đỉnh đúng một lần, cuối cùng quay trở lại với đỉnh xuất phát.

+ Đường đi Hamilton là đường đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần.

Khác với khái niệm chu trình Euler và đường đi Euler, một chu trình Hamilton khơng phải là đường đi Hamilton bởi có đỉnh xuất phát được thăm tới 2 lần.

Ví dụ: Xét 3 đơn đồ thị G<small>1</small>, G<small>2</small>, G<small>3</small>sau:

Đồ thị G<small>1</small> có chu trình Hamilton (a, b, c, d, e, a). G<small>2</small> khơng có chu trình Hamilton vì deg(a) = 1 nhưng có đường đi Hamilton (a, b, c, d). G<small>3</small>khơng có cả chu trình Hamilton lẫn đường đi Hamilton.

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.

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

<b>* Hệ quả:</b>

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.

<i>(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.</i>

<b>2.2.2 Điều kiện đủ</b>

<b>* Định lí 1: Đồ thị đủ K</b><small>n</small> <i>với n lẻ n ≥3 có n – ½ chu trình Hamilton từng đôi một</i>

không giao nhau.

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

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

<i><b>* Định lý 3: Cho G là đồ thị đơn n đỉnh (n ≥ 3). Nếu bậc d(v) ≥ (n-1)/2 với mọi đỉnh</b></i>

<i>v của G thì G có đường đi Hamilton.</i>

<i><b>* Định lý 4 : Cho G là đồ thị đơn n đỉnh (n≥3). Giả sử u và v là 2 đỉnh không kề</b></i>

<i>nhau của G sao cho deg(u) + deg(v) ≥ n</i>

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

<i><b>* Định lý 5 : Cho G là đồ thị đơn giản n đỉnh. Giả sử G’ và G’’ là 2 đồ thị thu được</b></i>

từ G bằng cách quy nạp nối tất cả các cặp đỉnh khơng kề nhau có tổng các bậc ít nhất

<i>bằng n. Khi đó ta có G’ = G’’.</i>

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

<i><b>* Bao đóng : C(G) của đồ thị G n đỉnh là đồ thị thu được từ G bằng cách, theo quy</b></i>

<i>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</i>

khơng cịn cặp đỉnh nào như vậy nữa.

<b>* Định lý 6: Đồ thị G có chu trình Hamilton khi và chỉ khi bao đóng của G có chu</b>

trình Hamilton.

<b>* Định lý 7: Nếu bao đóng C(G) = K</b><small>n</small>(n 3) thì đồ thị G có chu trình Hamilton.

<i><b>* Định lý 8 ( Định lý Ore): Cho G là đơn đồ thị n đỉnh (n 3).</b></i>

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<i>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</i>

<i>Nếu deg(v) > n/2 với mọi đỉnh v của G thì G có chu trình Hamilton.</i>

<b>* Định lý 11: Đồ thị K</b><small>m,n</small><i>có chu trình Hamilton khi và chỉ khi m = n.</i>

<b>* Định lý 12: Đồ thị K</b><small>m,n</small><i>có đường đi Hamilton khi và chỉ khi .|m-n|=1</i>

<b><small>2.2.3 Đồ thị có hướng:</small></b>

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

<i>a. (Meyniel) Nếu đồ thị G liên thông mạnh và deg(u) + deg(v) ≥ 2n - 1,</i>

u, v G khơng kề nhau thì G có chu trình có hướng Hamilton

<i>b. (Ghoula – Houri) Nếu đồ thị G liên thơng mạnh và deg(v) n v G</i>

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

<i>c. (Woodall) Nếu deg<small>0</small>(u) + deg<small>1</small>(v) n u, v G không tồn tại cung từ u từ v</i>

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

<i>d. Nếu deg<small>1</small>(v) n/2 & deg<small>0</small>(v) n/2 v G thì G có chu trình có hướng Hamilton.</i>

<b>* Định lý 14: (Điều kiện đủ tồn tại đường đi có hướng Hamilton)</b>

<i>a. Nếu deg(u) + deg(v) 2n - 3 u, v G không kề nhau thì G có đường đi có</i>

hướng Hamilton.

<i>b. Nếu deg(v) n - 1 v G thì G có đường đi có hướng Hamilton.c. Nếu deg<small>0</small>(u) + deg<small>1</small>(v) n – 1 u, v G không tồn tại cung từ u đến v</i>

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

<i>d. Nếu deg<small>1</small>(v) n/2 & deg<small>0</small>(v) n/2 v G thì G có đường đi có hướng Hamilton.</i>

Bây giờ chúng ta 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 đủ.

<b>* Định lý 15: (Konig) Mọi đồ thị có hướng đủ đều có đường đi có hướng Hamilton.</b>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<i><b>* Định lý 16: Đồ thị có hướng đủ G = (V, E) gọi là bắc cầu nếu (u, v) và (v, w) E</b></i>

<i>suy ra (u, w) E.</i>

Từ định nghĩa ta thấy ngay, một đồ thị có hướng đủ là bắc cầu khi và chỉ khi nó khơng có chu trình có hướng độ dài 3.

<b>* Định lý 17: Đồ thị có hướng đủ bắc cầu khi và chỉ khi nó khơng có chu trình có</b>

<b>* Định lý 18: Đường đi Hamilton trong đồ thị có hướng đủ là duy nhất khi và chỉ khi</b>

đồ thị bắc cầu.

<b>* Định lý 19: (Moon – Moser) Cho G = (V, E) là đồ thị có hướng đủ liên thơng</b>

<i>mạnh bậc n (n 3). Khi đó với mọi đỉnh v và số nguyên p (3 p n) ln tồn tạichu trình có hướng sơ cấp độ dài p qua đỉnh v.</i>

<b>* Định lý 20: (Camion) Đồ thị có hướng đủ có chu trình có hường Hamilton khi và</b>

chỉ khi nó liên thơng mạnh.

<b>3. Thuật toán quay lui giải bài toán người giao hàng3.1 Thuật toán quay lui:</b>

Thuật toán quay lui là một phương pháp lập trình để giải quyết các vấn đề một cách hệ thống bằng cách chia nhỏ chúng thành các bài toán con nhỏ hơn. Phương pháp này thường được sử dụng trong các bài tốn tối ưu hóa và các bài toán quyết định

<b>3.2 Bài toán người giao hàng<small>:</small></b>

<i><b>Một người giao hàng cần phải giao hàng đến m địa điểm khác nhau trong một</b></i>

thành phố. Mỗi địa điểm cần được thăm đúng một lần, và sau đó người giao hàng cần quay trở lại điểm xuất phát ban đầu. Mục tiêu là xác định trình tự giao hàng sao cho tổng khoảng cách di chuyển là ngắn nhất. Khoảng cách giữa hai địa điểm có thể được hiểu là cự li địa lý, thời gian di chuyển, hoặc chi phí phát sinh, và được xem là đã biết trước.

<i><b>Giả sử có ma trận chi phí C=c<small>ij</small>với i,j=1,2,…m, trong đó c</b></i><small>ij</small>​ là chi phí di

<i><b>chuyển từ địa điểm i đến địa điểm j. Hành trình của người giao hàng có thể được</b></i>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

<i><b>biểu diễn như một chuỗi các cặp: (v(1),v(2)),(v(2),v(3)),…,(v(m-1),v(m)),(v(m),v(1))</b></i>

<b>với v(i) là địa điểm thứ i trong hành trình.</b>

<i><b>Ta xét đồ thị đầy đủ G=(V,E) với V={1,2…m},có trọng số trên các cạnh c</b></i><small>ij</small>,

<i><b>nghĩa là giữa mọi cặp địa điểm i và j với i≠j, ln có cạnh nối (i,j) và (j,i) trong đồ</b></i>

<i><b>thị. Bài toán trở thành việc tìm chu trình Hamilton có tổng chi phí là nhỏ nhấttrên đồ thị G, với chu trình Hamilton là một chu trình đi qua mỗi đỉnh đúng mộtlần và quay về điểm xuất phát</b></i>

<b>3.3 Cách giải bài toán người giao hàngBước 1: Khởi tạo</b>

Ma trận chi phí C: Đây là ma trận đã cho, nơi C[i][j] biểu diễn chi phí di chuyển từ địa điểm i đến địa điểm j.

-Mảng đường đi: Một mảng để lưu trữ đường đi hiện tại.

-Biến chi phí tối ưu: Một biến để lưu trữ chi phí tối ưu nhất tìm được. -Mảng đánh dấu: Một mảng để đánh dấu các địa điểm đã được thăm.

<b>Bước 2: Định nghĩa Hàm Quay Lui</b>

Hàm quay lui sẽ thực hiện các nhiệm vụ sau:

-Kiểm tra điều kiện dừng: Nếu tất cả các địa điểm đã được thăm, kiểm tra xem chi phí trở về điểm xuất phát có thấp hơn chi phí tối ưu hiện tại khơng. Nếu có, cập nhật chi phí tối ưu.

-Lặp qua các địa điểm: Với mỗi địa điểm chưa được thăm, thực hiện các bước sau: -Đánh dấu địa điểm đó là đã thăm.

-Thêm chi phí di chuyển đến địa điểm đó vào chi phí hiện tại. -Gọi đệ quy hàm quay lui với địa điểm mới.

-Khi trở về từ đệ quy, bỏ đánh dấu và trừ bớt chi phí tương ứng. -Quay lui: Quay lại bước trước để thử các khả năng khác.

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b>Bước 3: Chạy Hàm Quay Lui</b>

-Bắt đầu từ một địa điểm (thường là địa điểm xuất phát). -Gọi hàm quay lui.

<b>Bước 4: In kết quả</b>

Sau khi hàm quay lui hoàn thành, in ra đường đi và chi phí tối ưu.

<b>4. Ứng dụng của bài tốn Người giao hàng</b>

Bài tốn người giao hàng sử dụng chu trình Hamilton là một bài toán nổi tiếng trong lĩnh vực tối ưu hóa và lý thuyết đồ thị. Mục tiêu của bài tốn này là tìm ra một chu trình (đường đi qua mỗi đỉnh một lần và trở về điểm xuất phát) có tổng chi phí (thường là khoảng cách hoặc thời gian) nhỏ nhất qua một tập các đỉnh trên đồ thị. Một công ty giao hàng nhỏ có trụ sở tại Hà Nội, Việt Nam, cần phải giao hàng đến 5 địa điểm khác nhau trong thành phố. Mục tiêu của họ là tối ưu hóa lộ trình để giảm thiểu tổng quãng đường di chuyển. Chúng ta sẽ sử dụng bài toán người giao hàng dựa trên chu trình Hamilton để tìm ra lộ trình tối ưu.

Các địa điểm cụ thể là:

1 Trụ sở công ty (điểm xuất phát và kết thúc): 1 Lê Thánh Tông, Hoàn Kiếm 2 Điểm giao hàng A: 25 Láng Hạ, Ba Đình

3 Điểm giao hàng B: 132 Xuân Thủy, Cầu Giấy 4 Điểm giao hàng C: 56 Phạm Hùng, Nam Từ Liêm 5 Điểm giao hàng D: 100 Trần Duy Hưng, Cầu Giấy 6 Điểm giao hàng E: 75 Đường Thành, Hồn Kiếm

Giả sử chúng ta có thơng tin khoảng cách giữa các điểm như sau (đơn vị: km):

</div>

×