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

Bài toán luồng trên mạng và ứng dụng

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 (2.01 MB, 74 trang )

i

LỜI CAM ĐOAN
Tôi xin cam đoan: Luận văn thạc sĩ Khoa học máy tính “ Bài toán luồng
trên mạng và ứng dụng” là công trình nghiên cứu thực sự của bản thân, được
thực hiện trên cơ sở nghiên cứu lý thuyết và cài đặt ứng dụng dưới sự hướng
dẫn khoa học của Tiến sĩ Trương Hà Hải, Trường Đại học Công nghệ Thông
tin và Truyền thông - Đại học Thái Nguyên.
Tôi xin chịu trách nhiệm về lời cam đoan này.
Thái Nguyên, ngày tháng 9 năm 2015
Tác giả

Nông Thị Lý


ii

LỜI CẢM ƠN
Để hoàn thành luận văn, tác giả xin chân thành cảm ơn Trường Đại học
Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên, Phòng Đào tạo,
các thầy, cô giáo giảng dạy lớp cao học Khoa học máy tính K12E đã quan tâm,
tạo điều kiện thuận lợi, tận tình giảng dạy và giúp đỡ tác giả trong thời gian
theo học tại trường.
Đặc biệt, tác giả xin bày tỏ lòng biết ơn sâu sắc đến cô hướng dẫn TS.
Trương Hà Hải đã tận tình hướng dẫn tác giả trong suốt quá trình làm luận
văn.
Tác giả xin cảm ơn các cán bộ, giảng viên đồng nghiệp Trường Đại học
Hùng Vương đã luôn giúp đỡ, động viên, khích lệ tác giả trong suốt quá trình
nghiên cứu.
Mặc dù đã rất cố gắng song nội dung bản luận văn không thể tránh khỏi
những thiếu sót. Tác giả rất mong nhận được sự góp ý quý báu của các thầy cô


và các bạn đồng nghiệp để luận văn thêm hoàn thiện.
Xin trân trọng cảm ơn.
Thái Nguyên, ngày tháng 9 năm 2015
Tác giả

Nông Thị Lý


iii

MỤC LỤC
LỜI CAM ĐOAN................................................................................................................. I
LỜI CẢM ƠN ......................................................................................................................II
MỤC LỤC.......................................................................................................................... III
DANH MỤC CÁC BẢNG................................................................................................ V
DANH MỤC CÁC HÌNH VẼ ......................................................................................... VI
MỞ ĐẦU .............................................................................................................................. 1
CHƯƠNG 1 ......................................................................................................................... 3
MỘT SỐ KHÁI NIỆM CƠ BẢN CỦA LÝ THUYẾT ĐỒ THỊ................................... 3
1.1. Một số định nghĩa và ký hiệu ..................................................................................... 3
1.1.1.

Định nghĩa đồ thị .................................................................................................. 3

1.1.2.

Các loại đồ thị ....................................................................................................... 4

1.1.3. Các khái niệm liên quan .......................................................................................... 6
1.2. Biểu diễn đồ thị trên máy tính .................................................................................... 9

1.2.1.

Biểu diễn bằng ma trận kề ................................................................................... 9

1.2.2.

Biểu diễn bằng ma trận liên thuộc....................................................................11

1.2.3.

Danh sách cạnh ...................................................................................................12

1.2.4.

Danh sách kề .......................................................................................................13

1.2.5.

Đồ thị trọng số ....................................................................................................14

1.3. Một số bài toán tối ưu trên đồ thị .............................................................................14
1.3.1.

Các bài toán kinh điển .......................................................................................14

1.3.2.

Các bài toán NP-khó ..........................................................................................16

1.4. Kết luận chương 1......................................................................................................20

CHƯƠNG 2: BÀI TOÁN LUỒNG CỰC ĐẠI TRÊN MẠNG VÀ CÁC THUẬT
TOÁN .................................................................................................................................22
2.1. Phát biểu bài toán.......................................................................................................22
2.1.1. Mạng và luồng trên mạng......................................................................................22
2.1.2. Bài toán luồng cực đại trên mạng .........................................................................24


iv
2.1.3. Lát cắt, định lý Ford – Fulkerson .........................................................................24
2.2. Các thuật toán giải bài toán luồng trên mạng.........................................................25
2.2.1. Các thuật toán hiện có ............................................................................................25
2.2.2. Thuật toán Ford – Fulkerson .................................................................................26
2.2.3. Thuật toán Edmonds–Karp....................................................................................32
2.2.4. Thuật toán Dinits ....................................................................................................32
2.2.5. Các thuật toán khác ................................................................................................33
2.3. Một số ứng dụng thực tế của bài toán .....................................................................33
2.3.1. Bài toán tìm công suất bơm dầu ...........................................................................33
2.3.2. Bài toán xét ứng cử viên vô địch ..........................................................................34
2.3.3. Bài toán tìm luồng giao thông cực đại .................................................................35
2.4. Kết luận chương 2......................................................................................................36
CHƯƠNG 3: BÀI TOÁN ỨNG DỤNG THỰC TẾ VÀ CHƯƠNG TRÌNH THỬ
NGHIỆM ............................................................................................................................37
3.1. Vấn đề tính toán số lượt du khách về thăm đền Hùng trong dịp lễ hội ..............37
3.2. Phát biểu bài toán.......................................................................................................39
3.3. Mô hình hóa bài toán bằng đồ thị và các bước giải bài toán................................40
3.4. Xây dựng chương trình .............................................................................................50
3.4.1. Môi trường cài đặt ..................................................................................................50
3.4.2. Giao diện chương trình ..........................................................................................51
3.5. Kết quả thực nghiệm tính số lượt người về thăm đền Hùng năm 2015 ..............52
3.5.1. Thực nghiệm 1: Tính toán trong ngày thứ nhất (06/03 âm lịch) ......................53

3.5.2. Thực nghiệm 2: Tính toán trong ngày thứ hai (10/03 âm lịch) ........................56
3.5.3. Tổng hợp các kết quả thử nghiệm ........................................................................59
3.6. Kết luận chương 3......................................................................................................60
KẾT LUẬN VÀ HƯỚNG NGHIÊN CỨU ...................................................................61
TÀI LIỆU THAM KHẢO ................................................................................................63
PHỤ LỤC


v

DANH MỤC CÁC BẢNG
Bảng 2.1. Các thuật toán giải bài toán luồng cực đại ................................. 31
Bảng 3.1. Bảng chỉ số các tỉnh thành trên bản đồ ...................................... 46
Bảng 3.2. So sánh kết quả tính toán và dữ liệu thực tế ............................... 71


vi

DANH MỤC CÁC HÌNH VẼ
Hình 1.1. Bài toán bảy cây cầu ở Konigsberg........................................... 4
Hình 1.2. Các loại đồ thị ......................................................................... 6
Hình 1.3. Các dạng đồ thị đặc biệt ........................................................... 7
Hình 1.4. Minh họa các khái niệm liên quan đến đồ thị ............................ 7
Hình 1.5. Minh họa đỉnh rẽ nhánh và cầu................................................. 9
Hình 1.6. Minh họa đồ thị con và đồ thị đẳng cấu .................................. 10
Hình 1.7. Biểu diễn đồ thị bằng ma trận kề ............................................ 11
Hình 1.8. Biểu diễn đồ thị bằng ma trận liên thuộc ................................. 12
Hình 1.9. Biểu diễn đồ thị bằng danh sách cạnh ..................................... 13
Hình 1.10. Biểu diễn đồ thị bằng danh sách kề ....................................... 14
Hình 2.1. Mạng và luồng trên mạng ...................................................... 23

Hình 2.2. Luồng cực đại trên mạng........................................................ 24
Hình 2.3. Lát cắt hẹp nhất mạng ............................................................ 25
Hình 2.4 Mạng ban đầu......................................................................... 28
Hình 2.5. Khởi tạo luồng bằng 0............................................................ 28
Hình 2.6. Xây dựng mạng còn dư .......................................................... 29
Hình 2.7. Tăng luồng theo đường 𝑷𝒇𝟏 Pf1 ................................................ 29
Hình 2.8. Tăng luồng theo đường 𝑷𝒇𝟐 .................................................... 30
Hình 2.9. Tăng luồng theo đường 𝑷𝒇𝟑 .................................................... 30
Hình 2.10. Tính toán luồng cực đại từ mạng đã tăng luồng cực đại ......... 31
Hình 2.11. Bài toán tìm công suất bơm dầu............................................ 33
Hình 2.12. Bài toán loại bỏ ứng cử viên vô địch ..................................... 34
Hình 2.13. Bài toán tìm luồng giao thông cực đại..................................... 3
Hình 3.1. Bài toán tính số lượt du khách tới thăm Đền Hùng - Phú Thọ .. 40
Hình 3.2. Mạng của bộ dữ liệu #1.......................................................... 42
Hình 3.3. Khởi tạo luồng bằng 0 của bộ dữ liệu #1 ................................. 43


vii

Hình 3.4. Xây dựng mạng còn dư của bộ dữ liệu #1 ............................... 43
Hình 3.5. Tăng luồng theo đường 𝑷𝒇𝟏 của bộ dữ liệu #1 ......................... 44
Hình 3.6. Tăng luồng theo đường 𝑷𝒇𝟐 của bộ dữ liệu #1......................... 44
Hình 3.7. Tăng luồng theo đường 𝑷𝒇𝟑 của bộ dữ liệu #1 ......................... 45
Hình 3.8. Tăng luồng theo đường 𝑷𝒇𝟒 Pf4 của bộ dữ liệu #1 ..................... 45
Hình 3.9. Tăng luồng theo đường 𝑷𝒇𝟓 của bộ dữ liệu #1 ......................... 46
Hình 3.10. Tăng luồng theo đường 𝑷𝒇𝟔 của bộ dữ liệu #1 ....................... 46
Hình 3.11. Tăng luồng theo đường 𝑷𝒇𝟕 của bộ dữ liệu #1 ....................... 47
Hình 3.12. Luồng cực đại của bộ dữ liệu #1 .......................................... 47
Hình 3.13. Giao diện của chương trình .................................................. 49
Hình 3.14. Mô phỏng với bộ dữ liệu #1 trên chương trình ...................... 52

Hình 3.15. Chạy chương trình với bộ dữ liệu #1..................................... 53
Hình 3.16. Chạy chương trình với bộ dữ liệu #2..................................... 56
Hình 3.17. Biểu đồ so sánh kết quả tính toán và dữ liệu thực tế............... 57


MỞ ĐẦU
Để giải quyết các vấn đề phát sinh từ các bài toán thực tế cần có được sự
hợp tác chặt chẽ giữa các chuyên gia trong lĩnh vực chuyên môn, các chuyên
gia Toán, Toán ứng dụng và các chuyên gia Tin học, kỹ sư lập trình. Điều này
đặc biệt cần thiết khi giải quyết các bài toán cho các hệ thống lớn. Việc thiết
lập được một mô hình hợp lý, phản ánh được bản chất của bài toán thực tế đồng
thời khả thi về phương diện tính toán luôn là điều đáng được quan tâm.
Trong số các mô hình toán học đã được áp dụng có nhiều mô hình tối ưu,
nhiều bài toán qui hoạch tuyến tính có thể qui về bài toán làm cực tiểu cước phí
vận chuyển hàng trong một mạng (gồm các nút và các cung đường) sao cho
đảm bảo được các nhu cầu ở một số nút sau khi biết nguồn cung cấp tại một số
nút khác, hoặc đưa về bài toán xác định cường độ dòng lớn nhất của dòng vận
tải giữa hai nút của một bản đồ giao thông, bài toán tìm luồng dầu lớn nhất có
thể bơm từ tàu chở dầu vào bể chứa của một hệ thống đường ống dẫn dầu,....
Các bài toán như vậy được gọi là các bài toán luồng trên mạng hay bài toán
chuyển vận (TransShipment Problem). Đây là lớp bài toán quan trọng nhất và
hay gặp nhất trong qui hoạch toán học. Lớp này bao gồm các bài toán quen
thuộc trong thực tế như: Bài toán vận tải, bài toán mạng điện, bài toán mạng
giao thông, bài toán quản lý, bài toán phân bổ vật tư, bài toán kế hoạch tài
chính, bài toán đường ngắn nhất, bài toán luồng lớn nhất.
Vì là một bài toán qui hoạch tuyến tính nên các bài toán luồng trên mạng
có thể giải được bằng bất kỳ thuật toán nào giải được bài toán qui hoạch tuyến
tính, chẳng hạn bằng thuật toán cổ điển của qui hoạch tuyến tính như thuật toán
đơn hình. Mặt khác, bằng cách tận dụng những cấu trúc đặc biệt của các bài
toán luồng trên mạng thông qua việc mô hình hóa bài toán thành cấu trúc đồ thị

(mô hình gồm các đỉnh và các cạnh nối các đỉnh đó) thì bài toán trên có thể đưa
về bài toán tìm luồng trên mạng của một đồ thị.


2

Vì những ứng dụng thực tế rất ý nghĩa của lớp bài toán này, cùng với thế
mạnh và niềm yêu thích về toán học, tin học, thuật toán, trong phạm vi luận
văn, tác giả tập trung nghiên cứu về lớp bài toán luồng trên mạng, phương pháp
giải bài toán luồng trên mạng bằng lý thuyết đồ thị và ứng dụng giải bài toán
trong thực tế.
Luận văn được trình bày thành 3 phần bao gồm: Phần mở đầu, phần nội
dung và phần kết luận.
Phần mở đầu:
Giới thiệu khái quát về đề tài, mục tiêu, đối tượng, phạm vi nghiên cứu,
ý nghĩa khoa học và xã hội mang lại thông qua việc giải quyết các vấn đề được
nêu trong đề tài.
Phần nội dung:
Chương 1: Trình bày một số kiến thức cơ bản về Lý thuyết đồ thị: đỉnh,
cạnh, bậc của đồ thị, các loại đồ thị, cách biểu diễn đồ thị trên máy tính và một
số bài toán cơ bản trên đồ thị. Các kiến thức này là cơ sở để trình bày các nội
dung quan trọng trong chương 2 và 3.
Chương 2: Luận văn trình bày khái niệm mạng, khái niệm luồng trên
mạng, bài toán luồng cực đại trên mạng, phát biểu các dạng bài toán luồng cực
đại trên mạng, trình bày một số thuật toán giải bài toán luồng trên mạng.
Chương 3. Tìm hiểu một bài toán thực tế về lưu lượng du khách về thăm
đền Hùng tỉnh Phú Thọ trong dịp lễ hội thuộc lớp bài toán luồng cực đại trên
mạng, xây dựng chương trình thử nghiệm mô phỏng tính toán số lượt du khách
về thăm đền Hùng tỉnh Phú Thọ trong dịp lễ hội năm 2015.
Phần kết luận: Trình bày kết quả mà luận văn đạt được và hướng phát

triển cho mô hình mà luận văn đã đề xuất.


3

CHƯƠNG 1
MỘT SỐ KHÁI NIỆM CƠ BẢN CỦA LÝ THUYẾT ĐỒ THỊ
Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu và có nhiều ứng
dụng hiện đại. Những tư tưởng cơ bản của lý thuyết đồ thị được đề xuất vào
những năm đầu của thế kỷ XVIII bởi nhà toán học lỗi lạc người Thụy sỹ
Leonhard Euler. Nội dung cơ bản của chương trình bày các kiến thức cơ sở về
lý thuyết đồ thị, các loại đồ thị, cách biểu diễn đồ thị trên máy tính và trình bày
một số bài toán cơ bản trên đồ thị. Chương 1 là cơ sở lý thuyết làm tiền đề để
trình bày các nội dung trong chương 2 và chương 3.
1.1. Một số định nghĩa và ký hiệu
1.1.1. Định nghĩa đồ thị
Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh
đó. Người ta thường ký hiệu đồ thị G = (V,E), trong đó V là tập hợp các đỉnh
(Verterx), E là tập hợp các cạnh (Edge). [1]
Ví dụ, một bản đồ địa lý có thể mô hình hóa thành một đồ thị bằng cách
biểu diễn các địa điểm định trước bằng đỉnh và con đường nối giữa các địa
điểm đó bằng cạnh. Lý thuyết đồ thị có nhiều ứng dụng quan trọng trong cuộc
sống, được phát triển trong khoảng 4 thế kỉ gần đây. Có hai bài toán nổi tiếng
được nhiều người biết đến như là các bài toán khai sinh ra lý thuyết đồ thị, đó
là:
chu


4
Hình 1.1. Bài toán bảy cây cầu ở Konigsberg


Bài toán 1: Bài toán bảy cây cầu của Euler, còn gọi là Bảy cầu ở
Konigsberg. Nguồn gốc bài toán là từ thành phố Konigsberg, Đức (nay là
Kaliningrad, Nga) nằm trên sông Pregel, bao gồm hai hòn đảo lớn nối với nhau
và với đất liền bởi bảy cây cầu. Bài toán đặt ra là tìm một tuyến đường mà đi
qua mỗi cây cầu một lần và chỉ đúng một lần (bất kể điểm xuất phát hay điểm
tới). Năm 1736, Leonhard Euler đã chứng minh rằng điều đó là không thể được.
Bài toán 2: Vấn đề này lần đầu tiên được đề cập vào năm 1852 bởi
Francis Guthrie khi ông thử tô màu bản đồ nước Anh và ông nhận ra rằng chỉ
cần bốn màu khác nhau là đủ. Ông đã đem vấn đề này hỏi người anh trai là
Fredrick, lúc đó đang là sinh viên của trường Đại học Học viện London (UCL).
Fredrick đã đưa vấn đề này hỏi thầy của mình là nhà toán học Augustus De
Morgan nhưng người thầy cũng chưa biết rõ vấn đề này. Người đầu tiên giới
thiệu vấn đề ra trước công chúng là nhà toán học Arthur Cayley vào năm 1878
tại Hội Toán học London, ông đã chỉ ra người đề cập vấn đề là De Morgan.
1.1.2. Các loại đồ thị
Chúng ta sẽ dựa vào các đặc điểm sau của cạnh để phân biệt các dạng đồ thị:
-

Cạnh e1 = (u, v) và cạnh e2 = (t, k) trên đồ thị G được gọi là cạnh lặp nếu

u t và v k.
-

Các cạnh e E được gọi là có hướng nếu trên đồ thị G ta quan tâm tới

thứ tự hai đỉnh trên một cạnh: phân biệt hai cạnh e1 = (u, v) và e2 = (v, u).
Từ đó ta có các dạng đồ thị cơ bản:
Tồn tại cạnh lặp


Không tồn tại cạnh lặp

Cạnh có hướng

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

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

Cạnh vô hướng

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

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


5

Ta có hình minh họa các loại đồ thị trên.
2

4

2

6

1

3


5

3

2

6

3

5

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

4

1

6

1

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

2

4

4


6

1

5

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

3

5

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

Hình 1.2. Các loại đồ thị

Một số dạng đơn đồ thị vô hướng đặc biệt:
Đồ thị đầy đủ Kn (compelte graph): Là đơn đồ thị vô hướng mà giữa
hai đỉnh bất kì của nó luôn tồn tại cạnh nối.
Đồ thị vòng Cn (cycle graph): Là đơn đồ thị vô hướng G = (V,E) với tập
đỉnh 𝑉 = {1, 2, 3, … , 𝑛} và tập cạnh
𝐸 = {(1, 2); (2, 3); … ; (𝑛 − 1, 𝑛); (𝑛, 1)}.
Đồ thị bánh xe Wn (wheel graph): là đơn đồ thị vô hướng thu được từ
đồ thị Cn-1 bằng cách thêm một đỉnh n nối với n-1 đỉnh của đồ thị Cn-1.


6

Đồ thị hai phía Km,n (bipartite graph): là đồ thị có tập đỉnh phân hoạch
thành hai tập con không giao nhau V=X Y sao cho mọi cạnh thuộc 𝐸 đều nối

một đỉnh thuộc X với một đỉnh thuộc Y.

𝑲𝟑

𝑲𝟒

𝑲𝟓

𝑪𝟑

𝑪𝟒

𝑪𝟓

𝑾𝟒

𝑾𝟓

𝑾𝟔

𝑋
𝑲𝟒,𝟑
𝑌

Hình 1.3. Các dạng đồ thị đặc biệt

1.1.3. Các khái niệm liên quan
Cho đồ thị G=(V, E): V={1, 2, 3, …, n} và E={e1, e2,…, en}.
Các khái niệm được trình bày dưới đây có thể dùng cho cả đồ thị có hướng và
vô hướng hoặc từng dạng đồ thị cụ thể.



7

2

4

b

6

1

5

3
𝐺1

c

f

a

d

e
𝐺2


Hình 1.4. Minh họa các khái niệm liên quan đến đồ thị

Cạnh (edge)
Nếu (u, v) là một cặp đỉnh thuộc E thì nói có một cạnh nối u và v. Khi
đó v được gọi là kề của u.
Bậc của đỉnh
Gọi bậc của đỉnh trong đồ thị vô hướng là số cạnh liên thuộc với nó và
kí hiệu là deg(v).
Bán bậc của đỉnh
Gọi bán bậc ra (vào) của đỉnh trong đồ thị có hướng là số cạnh của đồ thị
đi ra (vào) đỉnh đó và kí hiệu là deg+(v) hay deg -(v). Ví dụ trong hình 1.4 đỉnh
2 của G1 có bán bậc vào là 1: hay deg --(2)=1và bán bậc ra là 2: deg2-(2)=2.
Đường đi (path)
Một đường đi từ đỉnh u đến đỉnh v trên đồ thị G là một dãy đỉnh u1, u2,
…, ui, v mà các cạnh (u, u1), (u 1, u2), …, (u i, v) E, i là số lượng cung trên đường
đi được gọi là độ dài của đường đi.
Đường đi đơn
Một đường đi đơn trên đồ thị là một đường đi mà trên đó không có cạnh
nào lặp lại.


8

Chu trình (cycle)
Một chu trình trên đồ thị G là một đường đi đơn có đỉnh đầu và đỉnh cuối
trùng nhau.
Ví dụ trong hình 1.4 trên G2 ta có:
- Đường đi: abcfebc
- Đường đi đơn: abcfeb
- Chu trình: bcfeb.

Hai đỉnh liên thông
Đỉnh p và q được gọi là liên thông với nhau trên đồ thị G nếu có một
đường đi từ p đến q trên đồ thị đó.
Đồ thị liên thông
Một đồ thị được gọi là liên thông nếu mọi cặp đỉnh của đồ thị đều liên
thông.
Thành phần liên thông
Đồ thị G không liên thông sẽ phân rã thành một số hữu hạn đồ thị con
liên thông đôi một không có đỉnh chung. Các đồ thị con này được gọi là các
thành phần liên thông của đồ thị.
b

c

f

a

d

e

g

𝐺

h

Hình 1.5. Minh họa đỉnh rẽ nhánh và cầu



9

Đỉnh rẽ nhánh
Đỉnh u được gọi là đỉnh rẽ nhánh của đồ thị G nếu việc loại bỏ đỉnh đó
cùng các cạnh liên thuộc với nó làm tăng số thành phần liên thông của đồ thị.
Cầu
Cạnh e được gọi là cầu của đồ thị G nếu việc loại bỏ cạnh đó làm tăng
số thành phần liên thông của đồ thị.

2

4

a

b

c

d

e

f

6

1


3

5
𝐺1

𝐺2

Hình 1.6. Minh họa đồ thị con và đồ thị đẳng cấu

Đồ thị con
Đồ thị H=(W, F) được gọi là đồ thị con của đồ thị G = (V,E) nếu W
V và F E
Đồ thị đẳng cấu
Hai đồ thị G1= (U1, V1) và G2=(U2, V2) được gọi là đồng cấu nếu tồn
tại một song ánh f:V1  V2 sao cho (u, v)  E1 khi và chỉ khi (f(u), f(v)) 
E2.
1.2. Biểu diễn đồ thị trên máy tính
1.2.1. Biểu diễn bằng ma trận kề
Cách biểu diễn đồ thị bằng ma trận kề:


10

- Đánh số các đỉnh thuộc V từ 1n.
Ma trận kề A biểu diễn G là một ma trận vuông n  n có các phần tử nhận

-

giá trị 0 hoặc 1: aij =1 nếu tồn tại một cung định hướng từ vi đến vj.
Ta có Hình 1.7 minh họa biểu diễn đồ thị có hướng có trọng số bằng

ma trận kề.
6

2

4
6

5

3
6

1
3

6

5
3

1
1
2
3
4
5
6

5


1
2
5

3
5

4

5

6
3

3
1

6

6
6

Hình 1.7. Biểu diễn đồ thị bằng ma trận kề

Chúng ta có các nhận xét:
-

Cách biểu diễn bằng ma trận kề có thể dùng cho cả đồ thị có hướng và


vô hướng. Dễ thấy ma trận biểu diễn đồ thị vô hướng đối xứng qua đường chéo
chính.
-

Nếu đồ thị là có trọng số thì các phần tử ma trận kề có thể nhận giá trị là

trọng số của cung.


11

-

Có thể lựa chọn hai giá trị 0 và 1 để phân biệt sự khác nhau giữa cặp đỉnh

có cạnh nối và cặp đỉnh không có cạnh nối. Trong thực tế cài đặt, tùy thuộc vào
thuật toán mà có thể sử dụng các bộ giá trị khác vẫn đảm bảo sự phân biệt.
- Ưu điểm: tốc độ truy xuất thông tin về cạnh cao.
- Nhược điểm:
 Đồ thị thưa có hiệu suất sử dụng tài nguyên thấp.
 Tình huống cập nhật đồ thị bằng thao tác thay đổi kích thước tập đỉnh rất
phức tạp: buộc phải khai báo một ma trận với kích thước mới và hủy bỏ ma
trận đã sử dụng ban đầu.
1.2.2. Biểu diễn bằng ma trận liên thuộc
Cách biểu diễn đồ thị bằng ma trận liên thuộc:
- Đánh số các đỉnh thuộc V từ 1n.
- Đánh số các cạnh thuộc E từ 1m.
- Ma trận liên thuộc A biểu diễn G là một ma trận nm có các phần tử nhận
giá trị 0, 1 hoặc -1:
 aij = 1 nếu đỉnh i là đỉnh đầu của cạnh ej.

 aij = -1 nếu đỉnh i là đỉnh cuối của cạnh ej.
 aij = 0 nếu đỉnh i không là đầu mút của cạnh ej.


12
b

2

4

c

a
d

6

1
e

h

f
3
1
2
3
4
5

6

a
1
-1

b

c

1
-1

5

g
d

e

f
1

g

1
-1

-1


1

h

1
1
-1

-1

-1

1
-1

Hình 1.8. Biểu diễn đồ thị bằng ma trận liên thuộc
Hình 1.8 minh họa biểu diễn đồ thị có hướng không có trọng số bằng
ma trận liên thuộc. Chúng ta có các nhận xét:
- Ma trận liên thuộc chủ yếu dùng biểu diễn đồ thị có hướng.
- Có thể lựa chọn ba giá trị 0, 1 và -1 để phân biệt sự khác nhau giữa đỉnh i
và cạnh ej. Trong thực tế cài đặt, tùy thuộc vào thuật toán mà có thể sử
dụng các bộ giá trị khác vẫn đảm bảo sự phân biệt.
1.2.3. Danh sách cạnh


13
b

2


4

c

a
d

6

1
e

h

f
3

5

g
a
b
c
d
e
f
g
h

i

1
2
4
2
3
1
3
5

j
2
4
6
5
4
3
5
6

Hình 1.9. Biểu diễn đồ thị bằng danh sách cạnh
Cách biểu diễn đồ thị bằng danh sách cạnh:
- Đánh số các đỉnh thuộc V từ 1n.
- Đánh số các cạnh thuộc E từ 1m.
-

Thực hiện lưu trữ đồ thị G bằng cách lưu trữ thông tin về các cạnh: đỉnh

đầu, đỉnh cuối và trọng số (nếu có).
1.2.4. Danh sách kề
Cách biểu diễn đồ thị bằng danh sách kề

- Đánh số các đỉnh thuộc V từ 1n.
- Danh sách L biểu diễn G là một tập gồm n danh sách liên kết.


14
b

2

4

c

a
d

6

1
e

h

f
3

5

g
1

2
3
4
5
6








2
4
4
6
6

3
5
5

Hình 1.10. Biểu diễn đồ thị bằng danh sách kề

-

Danh sách thứ i trong L chứa các đỉnh kề với đỉnh i của đồ thị.

Nhận xét:

-

Đối với đồ thị vô hướng, khi cài đặt nên lưu trữ danh sách theo qui cách:

các đỉnh trong danh sách sẽ có số thứ tự lớn hơn đỉnh tương ứng với danh sách
đó. Qui cách này sẽ giúp đảm bảo việc số ô nhớ dùng để lưu trữ đúng bằng số
cạnh của đồ thị mà không bị mất mát thông tin.
1.2.5. Đồ thị trọng số
Ma trận trọng số là được dùng để biểu diễn đồ thị.
Xét đồ thị G=(X, U) (có hướng hay vô hướng)
Giả sử tập X gồm n đỉnh và được sắp thứ tự X={x1, x2, ..., xn}, tập U gồm
n cạnh và được sắp thứ tự U={u1, u2, ..., un}.
1.3. Một số bài toán tối ưu trên đồ thị
1.3.1. Các bài toán kinh điển


15

Bài toán duyệt đồ thị
Bài toán duyệt đồ thị được phát biểu như sau:
Cho đồ thị G=(V, E). Hãy duyệt tất cả các đỉnh của G, mỗi đỉnh đúng
một lần.
Hiện có hai thuật toán kinh điển giải quyết bài toán này: thuật toán tìm
kiếm theo chiều sâu (Depth First Search) và thuật toán tìm kiếm theo chiều rộng
(Breadth First Search). Cả hai thuật toán đều có độ phức tạp O(|V|+|E|).
Bài toán cây khung nhỏ nhất
Trước hết đến với khái niệm về cây khung. Cho đồ thị vô hướng
G=(V,E). Cây T=(V, F) được gọi là cây khung của đồ thị nếu nó là đồ thị con
của G, tức là FE. Trọng số của cây khung T được định nghĩa là:
𝑐 (𝑇 ) = ∑ 𝑐(𝑒)


(1)

𝑒∈𝐸

Từ đó ta có bài toán cây khung nhỏ nhất:
Cho đồ thị vô hướng G=(V, E) với trọng số của cạnh e là c(e). Hãy tìm
cây khung T của đồ thị có trọng số nhỏ nhất.
Hiện có hai thuật toán kinh điển giải quyết bài toán này: thuật toán
Kruskal hữu hiệu với những đồ thị thưa tức là:
|𝐸| ≈

|𝑉|(|𝑉| − 1)
2

và thuật toán Prim hữu hiệu với những đồ thị dày.
Bài toán tìm đường đi ngắn nhất
Bài toán đặt ra ở đây là tìm đường đi ngắn nhất, tức đường đi có tổng
trọng số nhỏ nhất, trên đồ thị có trọng số cho trước. Chúng ta có ba thuật toán
kinh điển giải các bài toán này:


16

- Thuật toán Ford Bellman tìm đường đi ngắn nhất từ đỉnh s đến tất cả
các đỉnh còn lại trên đồ thị có hướng không có chu trình âm (tức chu trình có
tổng trọng số trên các cạnh là âm).
- Thuật toán Dijkstra tìm đường đi ngắn nhất từ đỉnh s đến tất cả các đỉnh
còn lại trên đồ thị vô hướng có trọng số không âm.
- Thuật toán Floyd tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh trên

đồ thị có trọng số.
Bài toán ghép cặp
Trước hết có khái niệm phép ghép cặp. Cho đồ thị G=(V, E). Phép ghép
cặp M là một phép chọn ra một tập FE sao cho không có hai cạnh nào có
chung đầu mút. Khi đó, số lượng cạnh trong F được gọi là kích thước của cặp
ghép M. Bài toán ghép cặp được trình bày như sau.
Cho đồ thị G=(V, E). Hãy tìm cặp ghép M có kích thước lớn nhất.
Hiện tại, bài toán ghép cặp trên đồ thị hai phía đã có thuật toán hữu hiệu
để giải quyết. Với đồ thị tổng quát, chúng ta đã có được các thuật toán xấp xỉ
hiệu quả để giải quyết.
1.3.2. Các bài toán NP-khó
Là nhóm các bài toán không có giải thuật hữu hiệu, tức giải thuật có độ
phức tạp tính toán là đa thức theo thời gian, để giải quyết.
Bài toán hoàn thiện đồ thị Hamilton
Trước hết có khái niệm đường đi và chu trình Hamilton. Cho đồ thị
G=(V, E). Đường đi đi qua tất cả các đỉnh của G, mỗi đỉnh đúng một lần được
gọi là đường đi Hamilton. Đường đi Hamilton có đỉnh đầu trùng đỉnh cuối gọi
là chu trình Hamilton. Khi đó, một đồ thị có chứa chu trình Hamilton sẽ được


17

gọi là đồ thị Hamilton. Bài toán hoàn thiện đồ thị Hamilton (Hamilton
Completion Problem) đặt ra như sau.
Cho đồ thị G=(V, E). Hãy tìm số cạnh ít nhất bổ sung vào G để G trở
thành đồ thị Hamilton.
Bài toán người du lịch
Bài toán người du lịch (Travelling Salesman Problem) được phát biểu
như sau.
Cho đồ thị có trọng số G=(V, E). Hãy tìm chu trình đi qua tất cả các đỉnh

của đồ thị với trọng số nhỏ nhất.
Bài toán số phủ đồ thị con hai phía đầy đủ
Một đồ thị hai phía đầy đủ là một đồ thị G=(V, E) trong đó V=XY và
với mọi cặp đỉnh x  X, y  Y thì (x, y  E. Khi đó, bài toán số phủ đồ thị con
hai phía đầy đủ (Biclique Cover Number Problem) được phát biểu như sau:
Cho đồ thị vô hướng G=(V, E). Hãy tìm số nhỏ nhất các đồ thị con hai
phía đầy đủ của G sao cho mỗi cạnh của G đều nằm trong ít nhất 1 đồ thị con.
Bài toán quyết định ghép cặp 3 chiều
Cho ba tập giao nhau bằng rỗng X, Y và Z. Xét tập T= X  Y  Z gồm
các bộ ba t=(x, y, z) trong đó x  X, y Y, z  Z. Khi đó, MT được gọi là
một phép ghép cặp 3 chiều nếu với mỗi 2 bộ m1 = (x1, y1, z1) và m2= (x2, y2, z2)
thuộc M, ta luôn có: x1x2, y1y2, z1z2. Bài toán ghép cặp 3 chiều (3Dimensional Matching Decision Problem) được phát biểu như sau:
Cho tập T và một số nguyên k. Hỏi có tồn tại phép ghép cặp 3 chiều
MT nào có kích thước lớn hơn k hay không?
Bài toán quyết định tìm nhóm


18

Cho đồ thị vô hướng G=(V, E). Một nhóm (clique) C là một đồ thị con
đầy đủ của G. Khi đó bài toán quyết định tìm nhóm (Clique Decision Problem)
được phát biểu như sau:
Cho đồ thị vô hướng G=(V, E) và một số nguyên k. Hỏi có tồn tại nhóm
C G nào có kích thước lớn hơn k hay không?
Bài toán tập độc lập
Cho đồ thị vô hướng G=(V, E). Một tập độc lập I  Vlà tập các đỉnh sao cho G
không có cạnh nối giữa hai đỉnh bất kì. Khi đó bài toán tập độc lập (Independent
Set Problem) được phát biểu như sau:
Cho đồ thị vô hướng G=(V, E). Hãy tìm tập độc lập của 𝐺 có kích
thước lớn nhất.

Bài toán quyết định tô màu đầy đủ
Bài toán quyết định tô màu đầy đủ (Complete Coloring Decision
Problem) được phát biểu như sau.
Cho đồ thị vô hướng G=(V, E) và số nguyên dương 𝑘. Hỏi có tồn tại cách
phân chia v thành k hoặc nhiều hơn tập con giao nhau bằng rỗng V=V1  V2 
…  Vk sao cho Vi là tập độc lập i và Vi  Vj không là tập độc lập i, j hay
không?
Bài toán quyết định tập thống trị
Cho đồ thị vô hướng G=(V, E). 𝐷 ⊆ 𝑉 được gọi là tập thống trị nếu mọi
đỉnh 𝑣 ∈ 𝑉 ∖ 𝐷 đều kề với ít nhất một đỉnh của 𝐷 . Bài toán quyết định tập thống
trị (Dominating Set Decision Problem) được phát biểu như sau:
Cho đồ thị vô hướng G=(V, E) và số nguyên dương 𝑘. Hỏi có tập thống
trị 𝐷 nào của 𝐺 có kích thước nhỏ hơn hoặc bằng 𝑘 hay không?


×