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

một số bài toán tối ưu tổ hợp trên đồ thị

67 529 1

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

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

Nội dung

Tuy nhiên, do việc tính toán trên đồ thị thường là cầnkhối lượng tính toán cũng như không gian nhớ lớn, vì vậy gần đây cùngvới sự phát triển mạnh mẽ của kỹ thuật máy tính điện tử, các bà

Trang 1

ĐẠI HỌC THÁI NGUYÊNTRƯỜNG ĐẠI HỌC KHOA HỌC

ĐOÀN NGỌC LÀNH

MỘT SỐ BÀI TOÁNTỐI ƯU TỔ HỢP TRÊN ĐỒ THỊ

LUẬN VĂN THẠC SĨ TOÁN HỌC

Thái Nguyên - 2012

Trang 2

ĐẠI HỌC THÁI NGUYÊNTRƯỜNG ĐẠI HỌC KHOA HỌC

ĐOÀN NGỌC LÀNH

MỘT SỐ BÀI TOÁNTỐI ƯU TỔ HỢP TRÊN ĐỒ THỊ

Chuyên ngành: TOÁN ỨNG DỤNG

Mã số : 60.46.36

LUẬN VĂN THẠC SĨ TOÁN HỌC

Người hướng dẫn khoa học: TS VŨ MẠNH XUÂN

Thái Nguyên - 2012

Trang 3

Mục lục

1.1 Thuật toán và độ phức tạp của thuật toán 5

1.1.1 Thuật toán 5

1.1.2 Độ phức tạp của thuật toán 7

1.1.3 Đánh giá thời gian tốt nhất, tồi nhất và trung bình của một thuật toán 10

1.2 Tối ưu tổ hợp 13

1.2.1 Bài toán tối ưu tổ hợp 13

1.2.2 Một số bài toán cụ thể 14

1.2.3 Bài toán lớp P và lớp N P 16

2 Một số bài toán tối ưu tổ hợp trên đồ thị 18 2.1 Một số khái niệm 18

2.1.1 Đồ thị vô hướng 18

2.1.2 Đồ thị có hướng 19

2.1.3 Đường đi, chu trình Đồ thị liên thông 20

2.2 Thuật toán tìm kiếm trên đồ thị 22

2.2.1 Thuật toán tìm kiếm theo chiều sâu trên đồ thị 22

2.2.2 Tìm kiếm theo chiều rộng trên đồ thị 25

2.3 Bài toán đường đi ngắn nhất 29

2.3.1 Đường đi ngắn nhất xuất phát từ một đỉnh đến các đỉnh còn lại_Thuật toán Dijkstra 31

2.3.2 Đường đi ngắn nhất giữa tất cả các cặp đỉnh_Thuật toán Floyd 37

2.4 Bài toán luồng cực đại trong mạng và ứng dụng 41

2.4.1 Mạng Luồng trong mạng Bài toán luồng cực đại 41

Trang 4

2.4.2 Lát cắt Đường tăng luồng Định lí Ford - Fulkerson 432.4.3 Thuật toán tìm luồng cực đại trong mạng 462.4.4 Một số bài toán luồng tổng quát 542.4.5 Một số ứng dụng trong tổ hợp từ bài toán luồng 57

Trang 5

Mở đầu

Lý thuyết đồ thị là một lĩnh vực nghiên cứu có ý nghĩa thực tiễn cao

đã bắt đầu từ lâu Tuy nhiên, do việc tính toán trên đồ thị thường là cầnkhối lượng tính toán cũng như không gian nhớ lớn, vì vậy gần đây cùngvới sự phát triển mạnh mẽ của kỹ thuật máy tính điện tử, các bài toán tối

ưu trên đồ thị ngày càng được quan tâm và đã đạt được nhiều kết quả khảquan Đáng chú ý, việc chứng minh giả thuyết bốn màu có thể xem nhưmột minh chứng rõ nét về việc chứng minh bài toán nhờ máy tính điện

tử Mặc dù có ý nghĩa thực tiễn cao nhưng lý thuyết đồ thị cũng chỉ mớiđược đưa vào chương trình giảng dạy và nói chung còn sơ sài Đề tài nàyđặt vấn đề nghiên cứu những vấn đề cơ bản về thuật toán, độ phức tạpthuật toán, m ột số bài toán tối ưu cụ thể trên đồ thị và trình bày thuậttoán cũng như kết quả tính toán với những bài toán cụ thể

Nội dung của bản Luận văn gồm 2 chương

Chương 1 trình bày khái quát về thuật toán, độ phức tạp của thuậttoán, nêu một số bài toán có độ phức tạp đa thức và không đa thức.Chương 2 trình bày một số thuật toán giải một lớp những bài toán:duyệt đồ thị, bài toán tìm đường đi ngắn nhất, bài toán luồng cực đại

và minh họa trên những ví dụ cụ thể

Dù đã rất cố gắng, nhưng chắc chắn nội dung được trình bày trong luậnvăn không tránh khỏi thiếu sót nhất định, em rất mong nhận được sự góp

ý của các thầy cô giáo và các bạn

Luận văn này được hoàn thành dưới sự chỉ bảo và hướng dẫn tận tìnhcủa TS Vũ Mạnh Xuân Thầy đã dành nhiều thời gian hướng dẫn và giảiđáp các thắc mắc của tôi trong suốt quá trình làm luận văn Em xin đượcbày tỏ lòng biết ơn sâu sắc đến Thầy

Tôi xin cảm ơn Sở Nội vụ, Sở Giáo dục và Đào tạo Tuyên Quang, trườngTHPT Xuân Vân, Tổ Toán trường THPT Xuân Vân đã giúp đỡ tạo điềukiện cho tôi hoàn thành khóa học này

Trang 6

Em xin gửi tới các thầy cô khoa Toán, phòng đào tạo sau đại học TrườngĐại học Khoa Học, Đại học Thái Nguyên cũng như các Thầy cô đã thamgia giảng dạy khóa cao học 2010 - 2012, lời cảm ơn sâu sắc nhất về cônglao dạy dỗ trong suốt quá trình giáo dục, đào tạo của Nhà trường.

Thái Nguyên, ngày 15 tháng 7 năm 2012

Người thực hiệnĐoàn Ngọc Lành

Trang 7

Chương 1

Tối ưu tổ hợp

Chương này trình bày về lớp bài toán tối ưu tổ hợp, thuật toán và mô tảthuật toán bằng ngôn ngữ tựa Passcal, đánh giá độ phức tạp của thuậttoán Nêu một số bài toán cụ thể thuộc lớp bài toán tối ưu tổ hợp, từ đóđưa ra khái niệm bài toán lớp P và lớp NP

1.1 Thuật toán và độ phức tạp của thuật toán

1.1.1 Thuật toán

Khái niệm thuật toán bắt đầu từ thuật ngữ “Algorithm” (thuật toán) là tênnhà toán học Arập: Aba Ja’fa Mohamedibn Musaal Khowarizmi, người đãviết cuốn sách về các chữ số Hindu - cơ sở của kí hiệu số thập phân hiệnđại Ban đầu từ algorism được dùng để chỉ các quy tắc thực hiện các phéptính số học với các con số được viết trên hệ thập phân Sau đó, Algorismchuyển thành Algorithm vào thế kỷ XIX Với sự quan tâm ngày càng tăngđối với các máy tính, khái niệm thuật toán đã được định nghĩa một cáchhình thức chính xác thông qua máy Turing Tuy nhiên trong Luận văn nàykhái niệm thuật toán được hiểu trực quan như sau

Định nghĩa 1.1.1 Thuật toán để giải một bài toán (P) là một thủ tụcxác định, được chia ra thành các phép toán cơ bản, biến đổi một dãy cácdấu hiệu diễn tả các dữ liệu, không quan trọng ở chỗ thuộc bản chất gìcủa bài toán (P) thành một dãy các dấu hiệu đặc trưng cho các kết quảcủa (P)

Thuật toán có những đặc trưng sau:

• Đầu vào (Input): Một thuật toán nhận các giá trị đầu vào từ mộttập hợp đã được chỉ rõ (tập đã xác định)

Trang 8

• Đầu ra (Output): Từ mỗi tập có các giá trị đầu vào, thuật toán sẽtạo ra các giá trị đầu ra tương ứng Các giá trị đầu ra chính là nghiệm(lời giải) của bài toán.

• Tính chính xác (Precision): Các bước của thuật toán phải được mô

tả chính xác Ở mỗi bước, các thao tác phải hết sức rõ ràng, khônggây nên sự nhập nhằng, lộn xộn, tùy tiện, đa định nghĩa Nói rõ hơn,trong cùng một điều kiện hai bộ xử lý cùng thực hiện một bước củathuật toán phải cho những kết quả như nhau

• Tính hữu hạn hay tính dừng (Finiteness): Sau một số hữu hạnbước thuật toán phải cho kết quả với mọi đầu vào

• Tính đơn trị (Uniqueness): Các kết quả trung gian của từng bướcthực hiện thuật toán được xác định một cách đơn trị, chỉ phụ thuộcđầu vào và các kết quả của các bước trước Với hai bộ dữ liệu giốngnhau cho trước làm input, thuật toán đơn định sẽ thi hành các mã lệnhgiống nhau và cho kết quả giống nhau, còn thuật toán ngẫu nhiên cóthể thực hiện theo những mã lệnh khác nhau và cho kết quả khácnhau

• Tính tổng quát (Generality): Thuật toán có thể giải bất kỳ một bàitoán nào trong lớp các bài toán đang xét Với thuật toán có đầu vào

là các bộ dữ liệu khác nhau trong một miền xác định thì có thể vậndụng được thuật toán

• Tính hiệu quả (The effectiveness): Hiệu quả về thời gian: Thuậttoán phải được thực hiện trong thời gian cho phép, điều này khác vớilời giải toán (chỉ cần chứng minh là kết thúc sau hữu hạn bước) Tínhhiệu quả về bộ nhớ: Kích thước của thuật toán phải đủ nhỏ để phùhợp với khả năng lưu trữ

Mô tả thuật toán: Có nhiều cách trình bày thuật toán, như dùng ngônngữ tự nhiên, ngôn ngữ lưu đồ (sơ đồ khối), ngôn ngữ lập trình, ngôn ngữphỏng trình Trong đề tài này các thuật toán được trình bày bằng ngônngữ tựa Pascal, trong đó cho phép vừa mô tả thuật toán bằng ngôn ngữthông thường, vừa sử dụng những cấu trúc lệnh tương tự như của ngônngữ lập trình Pascal

Trang 9

Ví dụ 1.1.2 Mô tả thuật toán tìm phần tử lớn nhất trong một dãy hữuhạn các số nguyên.

a) Dùng ngôn ngữ tự nhiên để mô tả các bước cần thực hiện

1 Đặt giá trị cực đại tạm thời bằng số nguyên đầu tiên trong dãy (Cựcđại tạm thời sẽ là số nguyên lớn nhất đã được kiểm tra ở một giai đoạnnào đó của thủ tục.)

2 So sánh số nguyên tiếp sau với giá trị cực đại tạm thời, nếu nó lớn hơngiá trị cực đại tạm thời thì đặt cực đại tạm thời bằng số nguyên đó

3 Lặp lại bước trước nếu còn các số nguyên trong dãy

4 Dừng khi không còn số nguyên nào nữa trong dãy Cực đại tạm thời ởđiểm này chính là số nguyên lớn nhất của dãy

b) Thuật toán mô tả tựa Passcal

Input: Dãy gồm n số nguyên a1, a2, , an

Output: Max là số lớn nhất trong dãy

Procedure Max(a1, a2, , an : integer);

Thuật toán này trước hết gán số hạng đầu tiên a1 của dãy cho biến M ax.Vòng lặp for được dùng để kiểm tra lần lượt các số hạng của dãy Nếumột số hạng lớn hơn giá trị hiện thời của M ax thì nó được gán làm giátrị mới của M ax

1.1.2 Độ phức tạp của thuật toán

Để đánh giá khả năng ứng dụng của chương trình ta cần phân tích tínhhiệu quả của thuật toán Phân tích thuật toán là quá trình tìm ra nhữngđánh giá về thời gian tính cũng như dung lượng bộ nhớ cần thiết để thựchiện thuật toán Để đo tính hiệu quả của một thuật toán đã cho, ta thiếtlập mối quan hệ giữa thời gian tiến hành thuật toán, được diễn tả bởi sốcác phép toán cơ bản với kích thước của bài toán đang xét, hoặc được diễn

tả bởi số các dấu hiệu cần thiết để mã hóa các dữ liệu của bài toán

Có ba câu hỏi được đặt ra khi đánh giá thuật toán:

Trang 10

1) Những phép toán cơ bản đang nói đến là những phép toán nào?2) Bộ mã hóa nào của các dữ liệu cho phép ta đo kích thước của bàitoán?

3) Những hàm nào liên kết kích thước với số các phép toán cơ bản mà

có thể giúp ta nói rằng một thuật toán là hiệu quả?

Có thể cho rằng việc trả lời câu hỏi thứ ba cho phép ta trả lời hai câu hỏiđầu

Thước đo hiệu quả của một thuật toán là thời gian mà máy tính sử dụng

để giải bài toán theo thuật toán đang xét, khi các giá trị đầu vào có mộtkích thước xác định Một thước đo thứ hai là dung lượng bộ nhớ đòi hỏi

để thực hiện thuật toán khi các giá trị đầu vào có kích thước xác định.Các vấn đề như thế liên quan đến độ phức tạp tính toán của một thuậttoán

Định nghĩa 1.1.3 Độ phức tạp tính toán của một thuật toán là lượngthời gian và bộ nhớ cần thiết để thực hiện thuật toán (ta gọi là thời giantính của thuật toán)

Vì việc xem xét độ phức tạp không gian gắn liền với các cấu trúc dữ liệuđặc biệt được dùng để thực hiện thuật toán nên ở đây ta sẽ tập trung xemxét độ phức tạp thời gian tính của thuật toán Chúng ta sẽ quan tâm đến:

• Thời gian tính tốt nhất của thuật toán với đầu vào kích thức n, là thờigian tối thiểu cần thiết để thực hiện thuật toán

• Thời gian tính tồi nhất của thuật toán với đầu vào kích thước n, làthời gian nhiều nhất cần thiết để thực hiện thuật toán

• Thời gian tính trung bình của thuật toán, là thời gian trung bình cầnthiết để thực hiện thuật toán, trên tập hữu hạn các đầu vào kích thướcn

Để tính toán thời gian tính của thuật toán ta sẽ đếm số câu lệnh mà nóphải thực hiện, hoặc trong một số trường hợp cụ thể đếm số các phép tính

số học, so sánh, gán, mà thuật toán đòi hỏi thực hiện Đây là tiêu chuẩnkhách quan để đánh giá tính hiệu quả của thuật toán

Ví dụ 1.1.4 Kiểm tra số nguyên dương n có phải là nguyên tố không?

Trang 11

Phân tích Số nguyên dương n là số nguyên tố khi và chỉ khi n > 1 và nchỉ có hai ước là 1 và chính nó hay n>1 và n không chia hết cho k với

If (n mod i =0) then ok:=False;

If ok then n_nguyên_tố else n_hợp_số;

Procedure Nguyento(n);

Begin

ok:=True;

For i:=2 to (n div 2) do

If (n mod i =0) then ok:=False;

If ok then n_nguyên_tố else n_hợp_số;

End;

Độ phức tạp của thuật toán khi đó cỡ n

2 Ví dụ n=10000 thì chương trìnhtrên chỉ phải duyệt 5000 lần

Nhận xét: Nếu n có ước thì n có một ước nguyên tố không vượt quá √

n.Khi đó thuật toán được mô tả như sau

Procedure Nguyento(n);

Begin

ok:=True;

For i:=2 to trunc(sqrt(n)) do

If (nmodi = 0) then ok:=False;

If ok then n_nguyên_tố else n_hợp_số;

End;

Trang 12

Độ phức tạp của thuật toán khi đó cỡ√

n Ví dụ n=10000 thì chương trìnhtrên chỉ phải duyệt 100 lần

Vậy ta thấy cùng một bài toán nhưng khi thay đổi điều kiện cho câu lệnh(phép toán) thì độ phức tạp của thuật toán vẫn là đa thức nhưng đã cóthay đổi giảm đáng kể

1.1.3 Đánh giá thời gian tốt nhất, tồi nhất và trung bình của một thuật

toán

Thông thường trong các ứng dụng thực tế, thời gian chính xác mà thuậttoán đòi hỏi để thực hiện nó ít được quan tâm hơn so với việc xác địnhmức độ tăng lên của thời gian thực hiện thuật toán khi kích thước của dữliệu đầu vào tăng lên Chẳng hạn, một thuật toán đang được xem xét nào

đó có thời gian tính trong trường hợp tồi nhất là

t(n) = 60n2 + 6n + 6 với đầu vào kích thước n

Nếu t(n) được tính bằng giây, thì t(n) = n2 + 0, 1n + 0, 1 sẽ cho ta thờigian đo bằng phút của thuật toán Như vậy khi mô tả tốc độ tăng thờigian tính của thuật toán với kích thước đầu vào tăng, ta chỉ quan tâm đến

số hạng trội (60n2), có thể bỏ qua các hằng số Với giả thiết như vậy, thờigian tính t(n) tăng giống như n2 khi n tăng Ta sẽ nói t(n) có bậc là n2

Trang 13

• f (n) có bậc là g(n), nếu f (n) = O(g(n)) và f (n) = Ω(g(n)) Kí hiệu

f (n) = θ(g(n))

Định nghĩa 1.1.6 Thời gian tính của thuật toán

• Nếu thuật toán đòi hỏi thời gian tính tốt nhất là t(n) với đầu vào kíchthước n và t(n) = O(g(n)) thì thời gian tính tốt nhất của thuật toán cóbậc không quág(n) hay thời gian tính tốt nhất của thuật toán làO(g(n))

• Nếu thuật toán đòi hỏi thời gian tính tồi nhất là t(n) với đầu vào kíchthước n và t(n) = O(g(n)) thì thời gian tính tồi nhất của thuật toán cóbậc không quá g(n)hay thời gian tính tồi nhất của thuật toán là O(g(n))

• Nếu thuật toán đòi hỏi thời gian tính trung bình là t(n) với kích thướcđầu vào là n và t(n) = O(g(n)) thì thời gian tính trung bình của thuậttoán có bậc không quá g(n) hay thời gian tính trung bình của thuật toán

là O(g(n))

Trong định nghĩa trên nếu thay O bởi Ω và không quá bởi ít nhất, ta cóbậc ít nhất của thời gian tính tốt nhất, tồi nhất và trung bình của thuậttoán Nếu thời gian tính tốt nhất của thuật toán vừa là O(g(n)) vừa làΩ(g(n)) thì thời gian tính tốt nhất của thuật toán là θ(g(n)) Tương tựnhư vậy, ta định nghĩa thời gian tính tồi nhất và trung bình của thuậttoán là θ(g(n))

Ví dụ 1.1.7 Xác định vị trí của phần tử x trong dãy số a1, a2, , an hoặcxác định x không có mặt trong dãy số đó

Phân tích

Nếu x trùng với số đầu tiên trong dãy thì thuật toán thực hiện 1 lần lặp.Nếu x ở vị trí thứ i trong dãy thì thuật toán phải thực hiện i lần lặp.Nếu x không có mặt trong dãy thì thuật toán phải thực hiện n lần lặp.Thuật toán tựa Pascal:

Input: dãy a gồm n số a1, a2, , an và phần tử x

Output: vị trí của x trong dãy hoặc 0 nếu không tìm thấy

Function linear_seach(a, n, x) : Integer;

Trang 14

ok := T rue; break;end;

If i ≤ n then linear_seach := i else linear_seach := 0;end;

Độ phức tạp của thuật toán: Thời gian tính của thuật toán có thểđánh giá bởi số lần thực hiện câu lệnh trong vòng For

Nếu a1 = x thì câu lệnh trong thân vòng lặp For thực hiện một lần Do

đó thời gian tính tốt nhất của thuật toán là θ(1)

Nếu x không có mặt trong dãy đã cho, thì câu lệnh trong thân vòng lặpFor thực hiện n lần Do đó thời gian tính tồi nhất của thuật toán là θ(n).Thời gian tính trung bình của thuật toán Nếu x tìm thấy ở vị trí thứ icủa dãy (x = ai) thì câu lệnh For phải thực hiện i lần (i = 1, 2, 3, , n),còn nếu x không có mặt trong dãy đã cho thì câu lệnh For phải thực hiện

n lần Từ đó suy ra số lần trung bình phải thực hiện câu lệnh lặp For là:

[(1 + 2 + + n) + n]

2 + n

n + 1 = nVậy thời gian trung bình của thuật toán là O(n)

Từ đó, thuật toán tìm kiếm tuyến tính có độ phức tạp là θ(n)

Nhận xét 1.1.8 Phân tích độ phức tạp tính toán của một thuật toán làmột vấn đề phức tạp, nó đòi hỏi tư duy sáng tạo và có phương pháp vớicách tiếp cận riêng Mặt khác trong rất nhiều trường hợp, ta không thểthu được những đánh giá đẹp như ví dụ trên

Trang 15

Bảng 1.2 tên gọi một số dạng đánh giá thông dụng.

Dạng đánh giá Tên gọi

θ(log2n) Logarithmθ(n) Tuyến tínhθ(nlog2n) nlog2nθ(n2) Bậc haiθ(n3) Bậc baθ(nm) Đa thứcθ(mn), m ≥ 2 Hàm mũθ(n!) Giai thừaTrong bảng 1.2 các đánh giá được sắp xếp theo thứ tự tăng dần của tốc

độ tăng (ngoại trừ trường hợp θ(nm))

Bảng 1.3 Đánh giá thời gian của thuật toán

n! 2 40,3 giây 8, 34.1023 năm 4, 02.1078 năm

Trong bảng 1.3, cho ta thấy thời gian tính tăng như thế nào với các đánhgiá khác nhau, với đơn vị thời gian 0,001 giây (những số có đơn vị kèmtheo là những số gần đúng)

1.2 Tối ưu tổ hợp

1.2.1 Bài toán tối ưu tổ hợp

Định nghĩa 1.2.1 Bài toán tối ưu hóa tổ hợp được xác định bởi một tậphữu hạn S và một ánh xạ f :S →R Vấn đề đặt ra là xác định s∗ ∈ S saocho:

f (s∗) = min

s∈S {f (s)}

Trang 16

Bài toán tìm phần tử cực đại có thể chuyển về bài toán tìm phần tử cựctiểu vì:

Phương án s∗ ∈ S đem lại giá trị nhỏ nhất cho hàm mục tiêu được gọi làphương án tối ưu, khi đó giá trị f∗ = f (s∗) được gọi là giá trị tối ưu củabài toán

Sau đây ta xét một số bài toán tối ưu hóa tổ hợp truyền thống Các bàitoán này một mặt giữ vai trò là những mô hình toán học có nhiều ứng dụngtrong thực tế, mặt khác chúng giữ vai trò quan trọng trong việc nghiêncứu và phát triển lí thuyết tối ưu hóa tổ hợp

1.2.2 Một số bài toán cụ thể

Bài toán 1.2.2 Bài toán người du lịch Một người du lịch muốn đitham quan n thành phố T1, T2, , Tn Xuất phát từ một thành phố nào đóngười du lịch muốn đi qua tất cả các thành phố còn lại, mỗi thành phốqua đúng một lần, rồi quay trở lại thành phố xuất phát Biết cij là chi phí

từ thành phố Ti đến thành phố Tj (i,j=1,2, ,n), hãy tìm hành trình (mộtcách đi thỏa mãn điều kiện đặt ra) với tổng chi phí là nhỏ nhất

Phân tích độ phức tạp của bài toán

Ý tưởng giải bài toán: Giả sử mọi thành phố đều có đường nối, mỗi cách

đi là sự đánh số các thành phố T1, T2, , Tn Rõ ràng ta có thể thiết lậptương ứng 1 − 1 giữa các hành trình

Phương pháp giải đơn giản nhất là xét tất cả các cách đi để tìm chu trình

bé nhất, tức là phải duyệt n! phép toán thì suy ra hành trình tối ưu.Vậy đây là bài toán tối ưu tổ hợp có độ phức tạp cỡ n!

Trang 17

Bài toán 1.2.3 Bài toán cái túi Một nhà thám hiểm cần đem theomột cái túi có trọng lượng không quá b Có n đồ vật có thể đem theo Đồvật thứ j có trọng lượng aj và giá trị sử dụng cj với (j = 1, 2, , n) Hỏinhà thám hiểm cần đem theo các đồ vật nào để cho tổng giá trị sử dụngcủa các đồ vật đem theo là lớn nhất?

Phân tích độ phức tạp của bài toán

Ý tưởng giải bài toán: Gán một đồ vật j giá trị xj = 1 nếu được chọn,

xj = 0 nếu không được chọn Do đó bài toán có thể phát biểu dưới dạngbài toán tối ưu tổ hợp Tìm dãy nhị phân (x1, x2, , xn) với xj ∈ {0, 1}sao cho:

Đây là bài toán tối ưu tổ hợp có độ phức tạp của tính toán là 2n

Bài toán 1.2.4 Nhân hai ma trận

Cho hai ma trận A, B vuông cấp n Tính tích A.B

Phân tích độ phức tạp của bài toán

Ý tưởng giải bài toán: - Gọi ma trận vuông C là ma trận tích của hai matrận vuông A, B cùng cấp

- Mỗi phần tử của C được tính theo công thức: Ci,j = P

Ta thấy rằng thuật toán thực hiện chức năng chính của việc nhân ma trậnchính là ba vòng lặp For với các biến chỉ số i, j, k và việc thay đổi thứ tự

Trang 18

của ba vòng lặp này không ảnh hưởng gì tới kết quả.

Vậy độ phức tạp của thuật toán là n3

Theo định nghĩa 1.2.5 ta đưa ra một ví dụ về bài toán "không dễ"

Định nghĩa 1.2.7 Một bài toán "nhận biết" là bài toán mà các kếtquả chỉ có thể lập một trong hai giá trị tại đúng hoặc sai

Ví dụ 1.2.8 Bài toán về sự phân bố phù hợp

Cho tập X = {x1, x2, , xn}; các biến Booles và một biểu thức Booleđối với các số hạng của các biến này: E = C1 ∧ C2 ∧ ∧ Cn trong đó

Ci(i = 1, n) là một biểu thức: Ci = uj1 ∧ uj2 ∧ ∧ ujk(i) với mỗi ujq làmột trong các biến của X Bài toán đặt ra là tìm xem có một phân bố cácbiến xk(k = 1, 2, , n) bằng 0 hay 1 sao cho E = 1

Bài giải: Ta biết: 1 ∧ 1 = 1 và 1 ∧ 0 = 0 ∧ 1 = 0 ∧ 0 = 0; 1 = 0

Định nghĩa 1.2.9 Cho bài toán tối ưu tổ hợp min

s∈S {f (s)}(tương ứng vớimax

s∈S {f (s)}) và một số a Định nghĩa "bài toán nhận biết liên hợp" là bàitoán: Liệu có tồn tại s ∈ S sao cho f (s) 6 a (tương ứng f (s) > a)

Ví dụ 1.2.10 Cho một tập gồm n thành phố, các khoảng cách giữa cácthành phố và một số a Bài toán với nội dung là xác định xem có tồn tạimột vòng đi với giá nhỏ hơn hoặc bằng a là bài toán liên hợp của bài toánngười du lịch 1.2.2

Trang 19

Định lý 1.2.11 Nếu bài toán nhận biết liên hợp của bài toán tối ưu tổhợp đã cho là "khó" thì bài toán tối ưu hóa tổ hợp cũng là "khó".

Ký hiệu N P đặc trưng cho lớp các bài toán mà ta nghiên cứu bây giờtrở nên như là "lường gạt" Vấn đề là nó không phải thuộc các bài toán

"không phải là đa thức" như người ta tưởng tượng

Giả sử rằng ta biết câu trả lời của một bài toán nhận biết là đúng Nếu ta

có thể chia sẻ sự tin chắc của ta cho một người "siêu quan sát" bằng thờigian đa thức thì bài toán thuộc lớp N P, ngay cả khi ta không biết tìmbằng thời gian đa thức một nghiệm s mà đối với nó câu trả lời là đúng.Người ta chỉ đòi hỏi rằng nếu nghiệm s được đề xuất có thể thử lại đượcbằng thời gian đa thức rằng câu trả lời tương ứng là đúng

Nguyên tắc của người siêu quan sát cho ta một cách tiếp cận suy diễn củalớp N P

Định nghĩa 1.2.12 Một bài toán thuộc lớp N P nếu nó có thể giải đượcbằng thời gian đa thức bởi một thuật toán không tiền định

Nhận xét 1.2.13 Một bài toán nhận biết mà nó có thể giải được bằngthuật toán đa thức thuộc về lớp N P và kéo theo là P ⊂ N P

Vậy bài toán người du lịch, bài toán cái túi, , là những bài toán thuộclớp N P vì đối với chúng ta không biết thuật toán đa thức để giải nó Mặtkhác ta chưa thể chứng minh được rằng P 6= N P, vì nếu biết rõ P 6= N Pthì có thể nói lớp N P chứa các bài toán khó hơn các bài toán lớp P

Ký hiệu N P dẫn đến vấn đề là những bài toán của lớp này là những bàitoán có thể giải được nhờ một máy Turing bởi thuật toán không tiền định

có thời gian đa thức Những thuật toán không tiền định là một kiến thứcsiêu tưởng, chúng khác các thuật toán tiền định ở chỗ chúng không thểđưa lên máy tính điện tử

Kết luận chương 1

Chương này trình bày khái niệm thuật toán, độ phức tạp của thuật toán

và một số bài toán bài toán tối ưu tổ hợp thực tế, từ đó nêu khái quát vềcác bài toán lớp P và lớp N P

Trang 20

và đỉnh v, đồng thời các đỉnh u và v sẽ được gọi là các đỉnh đầu của cạnh(u, v).

Để có thể biết có bao nhiêu cạnh liên thuộc với một đỉnh, ta đưa vào địnhnghĩa

Định nghĩa 2.1.3 Ta gọi bậc của đỉnh v trên đồ thị vô hướng là số cạnhliên thuộc với nó và sẽ ký hiệu là deg(v)

Trang 21

Đỉnh bậc 0 gọi là đỉnh cô lập Đỉnh bậc 1 được gọi là đỉnh treo Bậc củađỉnh có tính chất sau.

Định lý 2.1.4 Giả sử G = (V,E) là đồ thị vô hướng với m cạnh Khi đótổng bậc của tất cả các đỉnh bằng hai lần số cung

Ví dụ 2.1.5 Đồ thị có n+1 đỉnh thì và mỗi đỉnh có bậc là 6 thì có baonhiêu cạnh?

Bài giải: Ta có 2m = 6(n + 1) => m = 3n + 3 Vậy số cạnh của đồ thị

là 3n+3 cạnh

Hệ quả 2.1.6 Trên đồ thị vô hướng, số đỉnh bậc lẻ (nghĩa là có bậc là sốlẻ) là một số chẵn

Chứng minh Gọi O và U là tập các đỉnh bậc lẻ và tập các đỉnh bậc chẵncủa đồ thị Ta có:

Trang 22

Định nghĩa 2.1.9 Ta gọi bán bậc ra (bán bậc vào) của đỉnh v trên đồthị có hướng là số cung của đồ thị đi ra khỏi nó (đi vào nó) và ký hiệu làdeg+(v) (deg−(v)).

Định lý 2.1.10 Giả sử G= (V,E) là đồ thị có hướng Khi đó

2.1.3 Đường đi, chu trình Đồ thị liên thông

Định nghĩa 2.1.11 Đường đi độ dài n từ đỉnh u đến đỉnh v, trong

đó n là số nguyên dương, trên đồ thị vô hướng G = (V,E) là dãy

x0, x1, , xn−1, xn,trong đó u = x0, v = xn, (xi, xi+1) ∈E, i = 0, 1, 2, , n − 1

Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cạnh:

(x0, x1), (x1, x2), , (xn−1, xn)

Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi Đường

đi có đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình.Đường đi hay chu trình được gọi là đơn nếu như không có cạnh nào bịlặp lại

Ví dụ 2.1.12 Xét đồ thị vô hướng cho trong hình 2.1

Ta có: a, d, c, f, e là đường đi đơn độ dài 4 Còn d, e, c, a không là đường

đi, do (c, e) không phải là cạnh của đồ thị Dãy b, c, f, e, b là chu trình

độ dài 4 Đường đi a, b, e, d, a, b có độ dài là 5 không phải là đường điđơn, do cạnh (a, b) có mặt trong nó hai lần

Khái niệm đường đi và chu trình trên đồ thị có hướng được định nghĩahoàn toàn tương tự như trong trường hợp đồ thị vô hướng, chỉ khác là ta

có chú ý đến hướng trên các cung

Trang 23

Hình 2.1: Đường đi trên đồ thị.

Định nghĩa 2.1.13 Đường đi độ dài n từ đỉnh u đến đỉnh v, trong

đó n là số nguyên dương, trên đồ thị có hướng G= (V,A) là dãy

x0, x1, , xn−1, xn,với u = x0, v = xn, (xi, xi+1) ∈A, i = 0, 1, 2, , n − 1

Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung:

(x0, x1), (x1, x2), , (xn−1, xn)

Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi Đường

đi có đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình.Đường đi hay chu trình được gọi là đơn nếu như không có cạnh nào bịlặp lại

Ví dụ 2.1.14 Trên đồ thị có hướng cho trong hình 2.1 ta có a, d, c, f, e

là đường đi đơn độ dài 4 Còn d, e, c, a không là đường đi, do (c, e) khôngphải là cạnh của đồ thị Dãy b, c, f, e, b là chu trình độ dài 4 Đường đi a,

b, e, d, a, b có độ dài là 5 không phải là đường đi đơn, do cạnh (a, b) cómặt trong nó hai lần

Nếu sử dụng đồ thị để biểu diễn mạng máy tính (trong đó các đỉnh của đồthị tương ứng với các máy tính, còn các cạnh tương ứng với các kênh nối)câu hỏi đặt ra là hai máy tính bất kì có thể trao đổi thông tin với nhauhoặc trực tiếp qua kênh nối chúng hoặc thông qua một vài máy tính trongmạng trung gian không? Câu hỏi đó được phát biểu trong ngôn ngữ đồ thịnhư sau: Tồn tại hay không đường đi giữa mọi cặp đỉnh của đồ thị? Đểtrả lời câu hỏi đó ta xét định nghĩa

Định nghĩa 2.1.15 Đồ thị vô hướng G = (V,E) được gọi là liên thôngnếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của nó

Trang 24

Hai máy tính bất kì trong mạng có thể trao đổi thông tin được với nhaukhi và chỉ khi đồ thị tương ứng với mạng này là đồ thị liên thông.

Định nghĩa 2.1.16 Đồ thị có hướng G = (V,E) được gọi là liên thôngmạnh nếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của nó

Định nghĩa 2.1.17 Đồ thị có hướng G = (V,E) được gọi là liên thôngyếu nếu đồ thị vô hướng tương ứng với nó là vô hướng liên thông

2.2 Thuật toán tìm kiếm trên đồ thị

Sử dụng đồ thị coi như là một mô hình, ta cần kiểm tra các đỉnh: có thểthực hiện việc kiểm tra này như một cuộc "dạo chơi" dọc theo các cạnh(cung) mà theo đó ta đến thăm các đỉnh của đồ thị

Định nghĩa 2.2.1 Một thủ tục cho phép chọn từ các đỉnh đã viếng thămmột đỉnh tiếp theo trong cuộc dạo chơi là việc tìm kiếm trên đồ thị.Đây chính là sự xác định một thứ tự trong việc kiểm tra các đỉnh Cụ thểhơn sự tìm kiếm đó như sau:

* Đánh số các đỉnh đã viếng thăm, ta nói số của một đỉnh biểu thị giờviếng thăm;

* Chọn một cạnh (cung) để đạt được đỉnh mới từ những đỉnh đã viếngthăm Nói cách khác là tại mỗi giờ, các đỉnh đã viếng thăm tạo lên một đồthị liên thông

Ta xét hai phương pháp tìm kiếm trên đồ thị: Tìm kiếm theo chiềusâu và Tìm kiếm theo chiều rộng

Hai phương pháp này cho phép viếng thăm tất cả các đỉnh là tiếp theocủa một đỉnh xuất phát cố định ở trước đó mà ta gọi là gốc của tìm kiếm

Để đơn giản, giả sử rằng đồ thị đã cất bỏ hướng và quan tâm đến các giờviếng thăm các đỉnh hơn là danh sách các cạnh đã qua trong cuộc dạo chơinày Việc chuyển kết quả từ đồ thị vô hướng sang đồ thị có hướng đượcthực hiện không khó khăn

2.2.1 Thuật toán tìm kiếm theo chiều sâu trên đồ thị

Ý tưởng chính của thuật toán:

Ta sẽ bắt đầu tìm kiếm từ một đỉnh v0 nào đó của đồ thị Sau đó chọn

u là một đỉnh tuỳ ý kề với v0 và lặp lại quá trình đối với u Ở bước tổng

Trang 25

quát, giả sử ta đang xét đỉnh v, chúng ta sẽ có hai khả năng sẽ xảy ra:Nếu như trong số các đỉnh kề với v tìm được đỉnh w là chưa được xét thì

ta sẽ xét đỉnh này (nó sẽ trở thành đã xét) và bắt đầu từ nó ta sẽ tiếptục quá trình tìm kiếm Ngược lại, nếu như không còn đỉnh nào kề với v

là chưa xét thì ta sẽ nói rằng đỉnh này là đã duyệt xong và quay trở lạitiếp tục tìm kiếm từ đỉnh mà trước đó ta đến được đỉnh v (nếu v = v0,thì kết thúc tìm kiếm) Do đó, tìm kiếm theo chiều sâu bắt đầu từ đỉnh vđược thực hiện trên cơ sở tìm kiếm theo chiều sâu từ tất cả các đỉnh chưaxét kề với v

Như vậy, trong quá trình thăm đỉnh bằng thuật toán tìm kiếm theo chiềusâu, đỉnh được thăm càng muộn càng sớm được duyệt xong (Last In FirstOut_Vào sau ra trước) Mô tả quá trình này bằng một thủ tục đệ quyDFS (Depth first search) như sau:

if Chuaxet[u] then DFS(u);

end; (*đỉnh v là đã duyệt xong*)

Khi đó, tìm kiếm theo chiều sâu trên đồ thị được thực hiện bằng:

Thuật toán mô tả tựa pascal

Trang 26

false nên mỗi đỉnh sẽ được thăm đúng một lần Thuật toán lần lượt sẽtiến hành tìm kiếm từ các đỉnh chưa được thăm, vì vậy DFS xét qua tất

cả các đỉnh của đồ thị (không nhất thiết phải là liên thông)

Độ phức tạp tính toán của thuật toán Số phép toán cần thực hiệntrong hai chu trình của thuật toán (hai vòng for của chương trình chính)

là cỡ |V| Thủ tục DFS phải thực hiện không quá |V| lần Tổng số phéptoán cần phải thực hiện trong các thủ tục này là O(|V| + |E|), do trongcác thủ tục này ta phải xét qua tất cả các cạnh và các đỉnh của đồ thị.Vậy độ phức tạp tính toán của thuật toán là O(|V| + |E|)

Ví dụ 2.2.2 Xét đồ thị cho trong hình 2.2 Các đỉnh của nó được đánh

số lại theo thứ tự chúng được thăm theo thủ tục tìm kiếm theo chiều sâu

mô tả ở trên Giả thiết rằng đỉnh xuất phát là đỉnhA(1) và các đỉnh trongdanh sách kề của đỉnh v(Ke(v)) được sắp xếp theo thứ tự tăng dần củachỉ số

Hình 2.2: Thuật toán DFS.

Các đỉnh của nó được đánh số lại theo thứ tự chúng được duyệt theo DFSlà: A → D → I → J → K → G → C → E → B → F → H Giả thiếtcác đỉnh trong danh sách kề của đỉnh v(ke(v)) được sắp xếp theo thứ tựtăng dần của chỉ số

Với cây thể hiện quá trình đệ quy DFS ở trên, ta thấy nếu dây chuyền đệquy là: DF S(S) → DF S(u1) → DF S(u2) → thì thủ tục DFS nàogọi cuối dây chuyền sẽ được thoát ra đầu tiên, thủ tục DF S(S) gọi đầudây chuyền sẽ được thoát cuối cùng, từ đây ta có ý tưởng mô phỏng dâychuyền đệ quy bằng một ngăn xếp (Stack)

Thuật toán tìm kiếm theo chiều sâu trên đồ thị vô hướng trình bày ở trên

Trang 27

Hình 2.3: Thuật toán DF S mô phỏng bằng ngăn xếp (Stack).

dễ dàng có thể mô tả lại cho đồ thị có hướng Trong trường hợp đồ thị cóhướng, thủ tục DF S(v) sẽ cho phép thăm tất cả các đỉnh u nào mà từ v

có đường đi đến u Độ phức tạp tính toán là O(|V| + |E|)

2.2.2 Tìm kiếm theo chiều rộng trên đồ thị

Ý tưởng chính của thuật toán:

Để ý rằng trong thuật toán tìm kiếm theo chiều sâu đỉnh được thăm càngmuộn sẽ càng sớm trở thành đã duyệt xong Điều đó là hệ quả tất yếucủa việc các đỉnh được thăm sẽ được kết nạp vào trong ngăn xếp (Stack).Tìm kiếm theo chiều rộng trên đồ thị, được xây dựng dựa trên cơ sở thaythế ngăn xếp (Stack) bởi hàng đợi (Queue) Với sự cải biên như vậy, đỉnhđược thăm càng sớm sẽ trở thành đã duyệt xong (tức là càng sớm dời khỏihàng đợi) Một đỉnh trở thành đã duyệt xong ngay sau khi ta xét xong tất

cả các đỉnh kề (chưa được thăm) với nó

Giả sử ta có một danh sách chứa những đỉnh đang "chờ" thăm Tại mỗibước, ta thăm một đỉnh đầu danh sách và cho những đỉnh chưa "xếp hàng"

kề với nó xếp hàng thêm vào cuối danh sách Chính vì nguyên tắc đó nêndanh sách chứa những đỉnh đang chờ sẽ được tổ chức dưới dạng hàng đợi(Queue) Khi đó thuật toán được thực hiện theo các bước sau

Bước 1: Khởi tạo Các đỉnh đều ở trạng thái chưa đánh dấu, ngoại trừđỉnh xuất phát S là đã đánh dấu Một hàng đợi(Queue), ban đầu chỉ cómột phần tử là S Hàng đợi dùng để chứa các đỉnh sẽ được duyệt theo thứ

tự ưu tiên chiều rộng

Trang 28

Bước 2: Lặp các bước sau đến khi hàng đợi rỗng Lấy u khỏi hàngđợi, thông báo thăm u (bắt đầu việc duyệt đỉnh u) Xét tất cả những đỉnh

v kề với u mà chưa được đánh dấu, với mỗi đỉnh v đó:

Đánh dấu v;

Ghi nhận vết đường đi từ u tới v(Có thể làm chung với việc đánh dấu);Đẩy v vào hàng đợi (v sẽ chờ được duyệt tại những bước sau);

Bước 3: Truy vết tìm đường đi

Thủ tục tìm kiếm theo chiều rộng xuất phát từ đỉnh v được biểu diễn bởihàm BF S(v) (viết tắt của cụm từ Breadth-First Search)

Procedure BF S(v);

(*Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v;

Các biến Chuaxet, Ke là biến toàn cục*)

for u ∈ Ke(p) do

if Chuaxet[u] thenbegin

đã được thăm

Khi đó, tìm kiếm theo chiều rộng trên đồ thị được thực hiện nhờ thuậttoán sau

Trang 29

Hình 2.4: Thuật toán BFS sử dụng hàng đợi QUEUE.

Thuật toán mô tả tựa pascal

Độ phức tạp của thuật toán BFS

Lập luận tương tự như trong thủ tục tìm kiếm theo chiều sâu, có thể chỉ

ra được rằng lệnh gọi BF S(v) sẽ cho phép đến thăm tất cả các đỉnh thuộccùng thành phần liên thông với đỉnh v, và mỗi đỉnh của đồ thị sẽ đượcthăm đúng một lần Độ phức tạp tính toán của thuật toán làO(|E| + |V|).Quá trình tìm kiếm trên đồ thị bắt đầu từ một đỉnh có thể thăm tất cảcác đỉnh còn lại, khi đó cách biểu diễn đồ thị có ảnh hưởng lớn tới chi phí

về thời gian thực hiện thuật toán

Trong trường hợp ta biểu diễn đồ thị bằng danh sách kề, cả hai thuật toánBFS và DFS đều có độ phức tạp tính toán là O(|V| + |E|) Đây là cáchcài đặt tốt nhất

Ví dụ 2.2.3 Xét đồ thị trong Hình 2.5 Thứ tự thăm đỉnh của đồ thị nàytheo thuật toán BFS được ghi trong ngoặc, đường đi là nét in đậm

Thứ tự các đỉnh được thăm theo BFS là A → B → C → D → E → F →

G → H → I → J → K

Trang 30

Hình 2.5: Thuật toán BFS

Bài toán 2.2.4 Vận dụng thuật toán DFS và BFS Một nhóm gồm

n sinh viên đi thám hiểm, mỗi người được trang bị một máy liên lạc Mỗimáy có một mã số là một chuỗi sáu chữ số Máy A liên lạc trực tiếp vớimáy B nếu hai số cuối của máy A trùng với hai số đầu của máy B Máy Aliên lạc được với máy B nếu có dãy A = A1, , An = B sao cho Ai liênlạc trực tiếp với Ai+1 Hãy cho biết với hai bạn bất kì X, Y trong nhóm cóthể liên lạc được với nhau hay không?

Bài giải: Mỗi sinh viên được trang bị một máy liên lạc có một mã số cốđịnh là chuỗi sáu chữ số Khi đó, mỗi mã số liên lạc là một đỉnh của đồthị Máy A liên lạc trực tiếp với B thì có một cung đi từ A đến B Khi đótồn tại một đồ thị (G) gồm n đỉnh, có hướng biểu diễn sự liên lạc của cácđối tượng trong nhóm Cần xem máy X và máy Y trong nhóm có liên lạcđược với nhau hay không?

Để trả lời câu hỏi đó ta thực hiện thuật toán BFS trên đồ thị(G)có hướng,bắt đầu từ đỉnh X cho đến khi thấy được đỉnh Y thì kết luận hai bạn X

và Y có thể liên lạc được với nhau Ngược lại kết luận X và Y không liênlạc được với nhau

Ví dụ 2.2.5 Input: Nhóm gồm 9 sinh viên với 9 máy liên lạc được gắn

mã số là mã số của 9 đỉnh đồ thị như sau

A: 12 87 56 B: 56 43 23 C: 23 48 43

S: 56 21 23 D: 23 45 12 E: 43 16 12

H: 78 61 43 T: 43 89 65 F: 65 71 23

Trang 31

được minh họa bởi đồ thị hình 2.6.

Hình 2.6: Vận dụng thuật toán BFS.

Output: a) Máy A có liên lạc được với máy T không?

b) Máy A có liên lạc được với máy H không?

Bài giải: Vận dụng thuật toán duyệt đồ thị BFS với đồ thị có hướng trênhình 2.6 đỉnh xuất phát là A, thứ tự duyệt các đỉnh là:A, B, S, C, D, E, T, F.a) Có đường đi từ A đến T Máy A có liên lạc được với máy T

b) Không có đường đi từ A đến H Máy A không liên lạc được với máy H

2.3 Bài toán đường đi ngắn nhất

Trong phần này chúng ta chỉ xét đồ thị có hướng G = (V,E), |V| = n,

|E| = m với các cung được gán trọng số, nghĩa là, mỗi cung (u, v) ∈ Ecủa nó được đặt tương ứng với một số thực a(u, v) gọi là trọng số của nó.Chúng ta sẽ đặt a(u, v) = ∞, nếu (u, v) /∈ E.

Nếu dãy v0, v1, , vp là một đường đi trên G, thì độ dài của nó được địnhnghĩa là tổng sau

p

X

i=1

a(vi−1, vi),

tức là, độ dài của đường đi chính là tổng các trọng số trên các cung của

nó (Chú ý rằng nếu chúng ta gán trọng số cho tất cả các cung đều bằng 1,thì ta thu được định nghĩa độ dài của đường đi như là số cung của đường

đi trên đồ thị)

Trang 32

Bài toán tìm đường đi ngắn nhất trên đồ thị dưới dạng tổng quát có thểphát biểu như sau: Tìm đường đi có độ dài nhỏ nhất từ một đỉnh xuấtphát s ∈ V đến đỉnh cuối (đích) t ∈ V Đường đi như vậy ta sẽ gọi làđường đi ngắn nhất từ s đến t còn độ dài của nó ta sẽ ký hiệu là d(s, t)

và còn gọi là khoảng cách từ s đến t (khoảng cách định nghĩa như vậy cóthể là số âm) Nếu như không tồn tại đường đi từ s đến t thì ta sẽ đặtd(s, t) = ∞ Rõ ràng, nếu như mỗi chu trình trên đồ thị đều có độ dàidương, thì trong đường đi ngắn nhất không có đỉnh nào bị lặp lại (đường

đi không có đỉnh lặp lại sẽ được gọi là đường đi cơ bản) Mặt khác, nếutrên đồ thị có chu trình với độ dài âm (chu trình như vậy gọi là chu trìnhâm) thì khoảng cách giữa một số cặp đỉnh nào đó của đồ thị có thể làkhông xác định, bởi vì bằng cách đi vòng theo chu trình này một số đủlớn lần, ta có thể chỉ ra đường đi giữa các đỉnh này có độ dài nhỏ hơn bất

cứ một số thực nào cho trước Trong những trường hợp như vậy, có thểđặt vấn đề tìm đường đi cơ bản ngắn nhất, tuy nhiên bài toán đặt ra sẽtrở nên phức tạp hơn rất nhiều Ta chú ý rằng nếu biết khoảng cách từ sđến t, thì đường đi ngắn nhất từ s đến t, trong trường hợp trọng số không

âm, có thể tìm được một cách dễ dàng Để tìm đường đi, chỉ cần để ý làđối với cặp đỉnh s, t ∈ V tuỳ ý (s 6= t) luôn tìm được đỉnh v sao cho,

số dễ dàng suy ra rằng dãy t, v, u, không chứa đỉnh lặp lại và kết thúc

ở đỉnh s Rõ ràng dãy t, v, u, được xác định (nếu lật ngược thứ tự cácđỉnh trong nó) ta có đường đi ngắn nhất từ s đến t Từ đó ta có thủ tụcsau đây để tìm đường đi ngắn nhất từ s đến t khi biết độ dài của nó.Thủ tục tìm đường đi ngắn nhất

Input: d[v] - khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại v ∈ V;

t - đỉnh đích;

a[u, v], u, v ∈ V - ma trận trọng số trên các cung.

Output: STACK chứa dãy đỉnh xác định đường đi ngắn nhất từ s đến t.Procedure Find_Path;

Trang 33

kỹ thuật ghi nhận đường đi như thuật toán tìm kiếm Dùng biến mảng

T ruoc[v], v ∈ V, để ghi nhớ đỉnh đi trước v trong đường đi tìm kiếm.Dưới đây ta sẽ xét một số thuật toán tìm đường đi ngắn nhất từ đỉnh Stới đỉnh F trên đơn đồ thị có hướng G = (V,E) có n đỉnh và m cung.Trong trường hợp đơn đồ thị vô hướng với trọng số không âm, bài toántìm đường đi ngắn nhất có thể dẫn về bài toán trên đồ thị có hướng bằngcách thay mỗi cạnh của nó bằng hai cung có hướng ngược chiều nhau vớicùng trọng số của cạnh tương ứng Lưu ý rằng các thuật toán dưới đây sẽluôn luôn tìm được đường đi ngắn nhất là đường đi cơ bản

2.3.1 Đường đi ngắn nhất xuất phát từ một đỉnh đến các đỉnh còn lại_Thuật

toán Dijkstra

Phần lớn các thuật toán tìm khoảng cách giữa hai đỉnh s và t được xâydựng nhờ đánh giá sau: Từ ma trận trọng số a[u, v], u, v ∈ V Tính cậntrên d[v] của khoảng cách từ s đến tất cả các đỉnh v ∈ V Mỗi khi pháthiện

d[u] + a[u, v] < d[v],thì cận trên d[v] sẽ được làm tốt lên: d[v] := d[u] + a[u, v] Quá trình đó

sẽ kết thúc khi nào chúng ta không làm tốt thêm bất cứ cận trên nào.Khi đó, rõ ràng giá trị của mỗi d[v] sẽ cho ta khoảng cách từ đỉnh s đếnđỉnh v Khi thể hiện kỹ thuật tính toán này trên máy tính, cận trên d[v]

sẽ được gọi là nhãn của đỉnh v, còn việc tính lại các cận trên này sẽ gọi

là phép gán nhãn cho đồ thị gọi là thủ tục gán nhãn Nhận thấy rằng đểtính khoảng cách từ s đến t, ta phải tính khoảng cách từ s đến tất cả các

Ngày đăng: 21/10/2014, 05:39

HÌNH ẢNH LIÊN QUAN

Bảng 1.2 tên gọi một số dạng đánh giá thông dụng. - một số bài toán tối ưu tổ hợp trên đồ thị
Bảng 1.2 tên gọi một số dạng đánh giá thông dụng (Trang 15)
Bảng 1.3 Đánh giá thời gian của thuật toán. - một số bài toán tối ưu tổ hợp trên đồ thị
Bảng 1.3 Đánh giá thời gian của thuật toán (Trang 15)
Hình 2.1: Đường đi trên đồ thị. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.1 Đường đi trên đồ thị (Trang 23)
Hình 2.2: Thuật toán DFS. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.2 Thuật toán DFS (Trang 26)
Hình 2.3: Thuật toán DF S mô phỏng bằng ngăn xếp (Stack). - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.3 Thuật toán DF S mô phỏng bằng ngăn xếp (Stack) (Trang 27)
Hình 2.4: Thuật toán BFS sử dụng hàng đợi QUEUE. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.4 Thuật toán BFS sử dụng hàng đợi QUEUE (Trang 29)
Hình 2.5: Thuật toán BFS - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.5 Thuật toán BFS (Trang 30)
Hình 2.6: Vận dụng thuật toán BFS. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.6 Vận dụng thuật toán BFS (Trang 31)
Hình 2.7: Thuật toán Dijkstra trên đồ thị có hướng. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.7 Thuật toán Dijkstra trên đồ thị có hướng (Trang 37)
Bảng 2.1 kết quả tính toán theo thuật toán Dijkstra. - một số bài toán tối ưu tổ hợp trên đồ thị
Bảng 2.1 kết quả tính toán theo thuật toán Dijkstra (Trang 37)
Hình 2.8: Thuật toán Dijkstra trên đồ thị vô hướng. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.8 Thuật toán Dijkstra trên đồ thị vô hướng (Trang 38)
Bảng 2.2 kết quả tính toán theo thuât toán Dijkstra. - một số bài toán tối ưu tổ hợp trên đồ thị
Bảng 2.2 kết quả tính toán theo thuât toán Dijkstra (Trang 38)
Hình 2.9: Đồ thị vận dụng thuật toán Floyd. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.9 Đồ thị vận dụng thuật toán Floyd (Trang 41)
Hình 2.10: Mạng với ma trận khả năng thông qua tương ứng. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.10 Mạng với ma trận khả năng thông qua tương ứng (Trang 44)
Hình 2.11: Mạng G và luồng f. Đồ thị tăng luồng G f tương ứng. - một số bài toán tối ưu tổ hợp trên đồ thị
Hình 2.11 Mạng G và luồng f. Đồ thị tăng luồng G f tương ứng (Trang 47)

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