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

Báo cáo bài tập lớn thuật toán floyd wrashall

20 3 0

Đ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

Nội dung

Trong khoa h c máy tính và trong toán h c, thuọ ọ ật toán tìm đường đi ngắn nhất trong đồ thị là một bài toán thường được vận dụng trong các ứng dụng tin học.. GIỚI THI U CHUNG: Ệ SƠ LƯỢ

Trang 1

ĐẠI H C QU C GIA TPHCM ỌỐ

TRƯỜNG ĐẠI H C BÁCH KHOA Ọ 

KHOA CƠ KHÍ

NHÓM NGÀNH: K THU T HỸẬỆ THỐNG CÔNG NGHI P,

LOGISTICS VÀ QU N LÝ CHU I CUNG ẢỖỨNG

Môn học:ĐẠI S TUY N TÍNH ỐẾ

BÁO CÁO BÀI T P L N ẬỚ

Trang 2

2

Danh sách thành viên

Trang 3

MỤC L C

Danh sách thành viên……… Trang 2 Lời m ở đầu ……… Trang 4

I GIỚI THI U CHUNG: Ệ

Sơ lược về thu t toán Folyd Warshall, Lậ ịch s ử ………… Trang 5 Tác dụng , Ưu điểm, Nhược điểm ………Trang 6 II Ý TƯỞNG VÀ CÁCH GI I THUẬT TOÁN: Ả

Ý tưởng, cách giải ……….Trang 7 Giải thuật toán trong matlab ……….Trang 8

III ỨNG DỤNG:

IV CÁC THUẬT TOÁN KHÁC:

Thuật toán Dijkstra ……… Trang 12 Thuật toán Bellman – Ford ……… …Trang 15 Thuật toán Johnson………Trang 17 V TÀI LI U THAM KHỆ ẢO: ……… Trang 19 VI TỔNG KẾT:……… Trang 19 VII NHẬN XÉT CỦA GIÁO VIÊN: ……… Trang 19

Trang 4

4

Lời mở đầu

Với sự ra đờ ủi c a Internet, tất c ả các trường h c hiọ ện nay đều đã áp dụng các kiến thức, kĩ năng và hiểu biế ềt v công nghệ thông tin trong các môn học nhằm nâng cao hi u qu d y và hệ ả ạ ọc.

Trong khoa h c máy tính và trong toán h c, thuọ ọ ật toán tìm đường đi ngắn nhất trong đồ thị là một bài toán thường được vận dụng trong các ứng dụng tin học Trong các ng d ng th c tứ ụ ự ế, bài toán tìm đường đi ngắn nh t giấ ữa hai đỉnh của một đồ thị có một ý nghĩa to lớn Ví dụ, bài toán chọn một hành trình tiết kiệm nhất ( v tiêu chu n kho ng cách, th i gian ho c chi phí) trên một mề ẩ ả ờ ặ ạng lưới giao thông đường bộ, đường thủy,…Hiện nay có rất nhiều các phương pháp để giải các bài toán như vậy Thế nhưng thông thường, các thuật toán được xây dựng dựa trên cơ sở lý thuyết đồ thị là hiệu quả cao nhất Sau đây chúng ta sẽ xét đến một số thuật toán như vậy

Mong th y và các b n theo dõi, góp ý ầ ạ để chủ đề ủa chúng em đượ c c hoàn thiện hơn

Trang 5

I GIỚI THI U CHUNG:

SƠ LƯỢC VỀ THUẬT TOÁN FLOYD-WARSHALL:

Khi nhắc đến thuật toán để tìm đường đi ngắn nhất trong đồ thị, người ta sẽ thường nghĩ tới những thuật toán dễ tiếp cận và có thể chạy trong giới hạn cho

-toán trên đều chỉ có thể tìm được đường đi ngắn nhất từ một đỉnh nguồn nhất định đến các đỉnh khác và do đó, trong một số trường hợp cụ thể cần chỉ ra đường đi ngắn nhất của mọi cặp đỉnh trong đồ thị, các thuật toán này sẽ hoạt động chưa hiệu quả khi phải chạy lặp đi lặp lại khá nhiều thao tác.

Floyd-Warshall chính là công cụ có thể giúp ta giải quyết vấn đề này chỉ trong một lần chạy duy nhất Hơn thế nữa, cách tiếp cận và cài đặt của nó cũng khá đơn giản và quen thuộc

LỊCH SỬ:

Thuật toán Folyd Wardshall được Robert Folyd đưa ra và được công nhận vào năm 1962 Nó cơ bản giống với các thuật toán được đưa ra bởi Bernard Roy vào năm 1959 cũng như Stephen Wardshall năm 1962

Trang 6

6

TÁC DỤNG:

Floyd-Warshall được sử dụng để tính toán đường đi ngắn nhất giữa mọi cặp điểm trong đồ thị có hướng

đường đi ngắn nhất giữa các cặp cạnh, ta tiếp tục chạy thuật toán một lần nữa, và nếu đường đi được xem là đường đi ngắn nhất tiếp tục cập nhật ngắn hơn thì có nghĩa rằng tồn tại một đường đi âm trong đồ thị

ƯU ĐIỂM SO VỚI CÁC THUẬT TOÁN KHÁC:

Tìm được đường đi ngắn nhất giữa tất cả các điểm trong đồ thị với trọng số âm hoặc dương, trong đồ thị có hướng hoặc vô hướng.

Chỉ với một lần chạy thuật toán sẽ cho ta kết quả Phát hiện được chu trình âm trong đồ thị

NHƯỢC ĐIỂM:

Trong đồ thị không được có vòng (cycle) nào có tổng các cạnh là âm, nếu có vòng như vậy ta không thể tìm được đường đi ngắn nhất (mỗi lần đi qua vòng này độ dài quãng đường lại giảm, nên ta có thể đi vô hạn lần)

Trang 7

II Ý TƯỞNG VÀ CÁCH GIẢI THUẬT TOÁN:

1 Ý tưởng:

Từ bài toán đã cho, chuyển các số liệu về ma trận trọng số D Sau bước lặp thứ k, D[i,j] chứa độ dài đường đi ngắn nhất từ đỉnh i đến đỉnh j (có thể đi qua đỉnh khác rồi đến j), các đỉnh nó đi qua có chỉ số không vượt quá k

2 Cách giải:

Bước 1: Sử dụng ma trận A để lưu độ dài đường đi ngắn nhất giữa mọi cặp đỉnh

Bước 2: Ta đặt A[i, j] = C[i, j] (có nghĩa A ban đầu chứa độ dài đường đi trực tiếp các đỉnh x đến y thuộc đồ thị mà không đi qua đỉnh nào cả.) Bước 3: Sau đó, ta thực hiện n lần lặp Sau lần lặp thứ k, ma trận A sẽ chứa

độ dài các đường đi ngắn nhất chỉ đi qua các đỉnh thuộc {1, 2, …, k} Bước 4: Kí hiệu Ak là ma trận A sau lần lặp thứ k, khi đó Ak[i, j] được tính

theo công thức sau: A [i, j] = min(A [i, j], A [i, k] + A [k, j] ) kk-1k-1k-1

Bước 5: Do đó, sau n lần lặp ta nhận được ma trận A chứa độ dài các đường đi ngắn nhất

Trang 8

8

3 Giải thu t toán trong matlab:

Trang 9

4 Ví dụ:

Hình nh mô t thu t toán ả ả ậ

Floyd – Warshall trong đồ thịvô hướng

Và đây là kết qu cả ủa đoạn code cho thu t toán trên: ậ

Trang 10

10 Dưới đây là một ví dụ khác về thuật toán Floyd-Warshall trong đồ thị có hướng:

Và đây là kết quả:

Trang 11

III NG D NG: ỨỤ

Việc nghiên c u thuứ ật toán Floyd để áp dụng vào trong th c t là r t quan trọng ự ế ấ với nhi u ti n lề ệ ợi cho con ngườ ả ề ậi c v v t ch t, cấ ủa c i l n th i gian Giúp ích rả ẫ ờ ất nhiều cho con người trong việc nâng cao hiệu quả làm việc và làm tăng năng suất lao động, tăng thu nhập cho doanh nghiệp

tối ưu hóa đường đi ở các thành phố lớn

Tối ưu hóa mặt bằng trong doanh nghiệp hay các tổ chức, cắt giảm thời gian di chuyển giữa các đơn vị, giữa các tr m, t ạ ừ đó nâng cao năng suấ ủt c a cả mạng lưới Tìm được con đường vận chuyển nhanh nhất giữa các vùng lân cận hoặc giữa các quốc gia v i nhau,l a chớ ự ọn để đưa ra phương án cực ti u chi phí v n chuy n hàng ể ậ ể hóa, d ch v ị ụ

Trang 12

Thuật toán Dijkstra là m t trong nhộ ững thuật toán cơ bản dùng để tìm đường đi ngắn nh t t mấ ừ ột điểm tới một điểm nào đó, và mở ộng ra là tìm đường đi ngắn r nhất từ 1 điểm tới mọi điểm còn lại của đồ thị, với điều ki n các tr ng s cệ ọ ố ủa đồ thị đó không âm

b) Các bước giải thuật toán:

Bước 1: Ta xây d ng mự ột m ng 1D chả ứa đường đi ngắn nh t giấ ữa đỉnh đang xét tới t t cấ ả các đỉnh còn l i, giá trạ ị ngầm định bằng +INF

Bước 2: Chọn một điểm b t kấ ỳ chưa đư c duyợ ệt và có đường đi ngắn nh t t ấ ừ điểm gốc t i nó là nhớ ỏ nhất

Bước 3: T ừ điểm đó, loang đường đi ra tất cả các đỉnh kề cận, và cập nhật lại đường đi ngắn nhất tới các đỉnh đó nếu đường đi mớ ối ưu hơn.i t

Bước 4: Nếu còn điểm chưa được duy t (hoệ ặc chưa tìm được điểm đích, tùy yêu cầu đề bài), ta trở lại bước 1

Ta xét đồ thị vô hướng sau (số màu đỏ là đường đi ngắn nhất xuất phát từ đỉnh 1 tới đỉnh được xét):

Đầu tiên, ta xét đỉnh 1 (vì đường đi ngắn nhất từ 1 tới 1 hiển nhiên có độ dài 0) Sau quá trình c p nh t, ta có các giá tr ậ ậ ị đường đi ngắn nh t m i: ấ ớ

Trang 13

Tiếp theo, ta duyệt đỉnh 5 (đường đi ngắn nhấ ừt t 1 tới 5 có độ dài 1) Sau c p nhậ ật, ta thu được các giá tr m ị ới:

Tiếp theo, ta duyệt đỉnh 4 (đường đi ngắn nhấ ừt t 1 tới 4 có độ dài 3) Sau c p nhậ ật, ta thu được các giá tr m ị ới:

Cứ tiếp tục như vậy cho tới khi duyệt hết đỉnh, ta sẽ thu được các giá trị hoàn chỉnh:

Trang 14

14 Sở dĩ phương pháp này đúng bởi, ta đã ngầm định đặt ra điều kiện trước: các trọng s c a các c nh ph i là các s không âm ố ủ ạ ả ố Do đó, việc duy t liên t c t ệ ụ ừ các đỉnh có độ dài đường đi ngắn nhất là cực tiểu sẽ luôn được đảm bảo tính chính xác: ta không th ể xuất phát t b t k nh nào khác qua m t giá tr trung ừ ấ ỳ đỉ ộ ị gian mà thu được đường đi nhỏ nhất từ đỉnh gốc tới đỉnh cực tiểu ta đang xét thậm chí còn nh ỏ hơn nữa được.

Tuy nhiên, với trường h p tr ng s âm, l p lu n này b bác bợ ọ ố ậ ậ ị ỏ Xét đồ thị sau:

Bằng mắt thường, ta có thể thấ ằng: đường đi ngắy r n nhất từ đỉnh 1 tới đỉnh 4 sẽ là đoạn đường 1->3->4

Tuy nhiên, áp dụng tư duy thuật toán Dijkstra, ta có:

 Khở ại t o: s_path[1] = 0, s_path[2] = INF, s_path[3] = INF, s_path[4] = INF  Xuất phát t nh 1 C p nh t: s_path[2] = 2, s_path[3] = 6 ừ đỉ ậ ậ

 Xuất phát t nh 2 C p nh t: s_path[4] = 5 ừ đỉ ậ ậ

 Xuất phát t đỉnh 4 Do đây là đỉnh đích nên ng ng thu t toán, k t lu n ans ừ ừ ậ ế ậ = 5

Rõ ràng, do phương pháp không tính đến trường hợp độ dài đường đi nhỏ nhất có thể giảm, nên nhánh xu t phát t nh 3 bị ại bỏ, dẫn đến kết quả sai ấ ừ đỉ lo

Trang 15

2 Thuật toán Bellman-Ford:

a Giới thiệu:

Thuật toán Bellman Ford là một trong những thuật toán dùng để tìm đường đi ngắn -nhất (chỉ áp dụng cho đồ thị có hướng) từ một điểm tới một điểm nào đó, và mở rộng ra là tìm đường đi ngắn nhất từ 1 điểm tới mọi điểm còn lại của đồ thị, với điều kiện đồ thị không được phép có chu trình âm

b Các bước giải thuật toán:

Bước 1: Chọn một đỉnh gốc Ta xây dựng một mảng chứa đường đi ngắn nhất giữa đỉnh đang xét tới tất cả các đỉnh còn lại, giá trị ngầm định bằng +INF Bước 2: Xét chiều dài đường đi từ đỉnh đang xét đến các đỉnh lân cận, cập nhật đường đi

Bước 3: Từ mỗi điểm lân cận với điểm gốc, xét chiều dài đường đi đến các đỉnh khác lân cận chưa được duyệt, cập nhật lại chiều dài từ đỉnh gốc đến đó là tổng chiều dài từ đỉnh gốc đến đỉnh kề trước và chiều dài từ đỉnh kề trước đến đỉnh đang xét nếu chiều dài đường đi tính được ngắn hơn lần duyệt trước

Bước 4: Tiếp tục duyệt cho đến khi không còn đường đi tối ưu từ đỉnh gốc đến các đỉnh còn lại hoặc cho đến khi số lần duyệt bằng số đỉnh trừ đi 2

Ta xét ví dụ với đồ thị có hướng sau (giả định các đường đi là một chiều, chỉ đi từ đỉnh có số thứ tự thấp hơn tới đỉnh có số thứ tự cao hơn, số có màu đỏ cạnh mỗi đỉnh là độ dài đường đi ngắn nhất từ gốc tới đỉnh đó, và đỉnh gốc là đỉnh 1):

Thực hiện lần duyệt đầu tiên, ta cập nhật được đường đi ngắn nhất thông qua các cạnh (1, 2); (1, 3); (1, 4):

Trang 16

Tới lần duyệt thứ 4, ta thấy không còn cạnh nào có thể tối ưu hóa bất kỳ đường đi ngắn nhất nào nữa Tới đây, ta hoàn toàn có thể dừng duyệt (vì chắc chắn việc không còn cạnh có thể tối ưu cũng đồng nghĩa với việc không có chu trình âm trong đồ thị)

Trang 17

3 Thuật toán Johnson:

a) Giới thi u:

Thuật toán này tương tự thuật toán Floyd-Warshall nhưng cho đồ thị có trọng số b t k và không có chu trình âm ấ ỳ

Ý tưởng bài toán: Từ đồ thị đã cho, tìm cách chuyển nó thành đồ thị có trọng số không âm r i dùng thu t toán Dijkstra áp d ng cho tồ ậ ụ ừng đỉnh

Hình (a) là đồ thị có hướng mà ta muốn tìm đường đi ngắn nhất Hình (b) là đồ thị thu được sau khi ta thêm S và các cung (có màu đỏ) có

hướng t S từ ới các đỉnh khác với trọng s 0 ố

Hình (c) là cây đường đi ngắn nhất gốc tại S sau khi áp dụng thuật toán Bellman-Ford Các s trong ô vuông chính là kho ng cách t S tố ả ừ ới đỉnh tương ứng Kí hiệu tại mỗi đỉnh v là h(v) Với h(v) là kết quả đi từ S tới v tính b ng thu t toán trên ằ ậ

Trang 18

18 Hình (d) là đồ thị mới thu được sau khi hiệu chỉnh trọng số của đồ thị cũ

theo công thức: w'(u, v) = w (u, v) + h(u) - h(v) (Trong đó: w'(u, v) là trọng số mới ứng với đường đi từ u t i v; w (u, v) là tr ng s ớ ọ ố cũ; h(u) có ý nghĩa như h(v) ứng với đỉnh u, v)

b) Các bước giải thuật toán:

Bước 1: Đặt một đỉnh ph ụ S có đường đi đế ấ ản t t c các đỉnh trong đồ thị đều bằng 0

Bước 2: Áp ụ d ng thu t toán Dijkstra cho tậ ừng đỉnh để tìm đường đi ngắn nhất

Trang 19

V MỘT S TÀI LI U THAM KH O: ỐỆẢ Wikipedia

Một s nố ội dung được d ch sang tiị ếng Việt t sách ừ Competitive Programming’s Handbook c a Antti Laaksonen, CSES, Ph n Lan ủ ầ

Sau khi làm bài t p l n mậ ớ ọi người có thêm nhi u b n m ề ạ ới Có thêm kinh nghiệm về cách làm vi c theo nhóm ệ

Tuy nhiên, các thành viên xa nhau nên còn gở ặp khó khăn trong việc gặp

Trang 20

20

Ngày đăng: 09/04/2024, 16:18

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN