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

Báo cáo thuật toán floyd đh CNTTTT

14 979 15

Đ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 14
Dung lượng 488,72 KB

Nội dung

Tìm hiểu về các thuật toán tìm đường đi ngắn nhất trên đồ thị, ứng với ngôn ngữ lập trình C cài đặt thuật toán Floyd BÁO CÁO THỰC TẬP CƠ SỞ TRƯỜNG ĐẠI HOC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN

Trang 1

Tìm hiểu về các thuật toán tìm đường đi

ngắn nhất trên đồ thị, ứng với ngôn ngữ

lập trình C cài đặt thuật toán Floyd

BÁO CÁO THỰC TẬP CƠ SỞ

TRƯỜNG ĐẠI HOC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

Sinh viên thực hiện:

Nguyễn Khương Duy

Trang 2

CÁC MỤC CHÍNH

1

2

3 CHƯƠNG 3 : CHƯƠNG TRÌNH MÔ TẢ THUẬT TOÁN

CHƯƠNG 2 : CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

CHƯƠNG 1 : LÝ THUYẾT VỀ THUẬT TOÁN TÌM

ĐƯỜNG ĐI NGẮN NHẤT

Trang 3

Các thuật ngữ Bậc của đỉnh

Các khái niệm cơ bản

Định nghĩa đồ thị

Chương 1: LÝ THUYẾT VỀ THUẬT TOÁN TÌM

ĐƯỜNG ĐI NGẮN NHẤT

Đường đi, chu trình, đồ

thị liên thông

Phân loại đồ thị

Trang 4

Các thuật toán: Thuật toán

Ford-Bellman

Thuật toán Dijkstra

Thuật

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

Trang 5

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

2.1 Thuật toán Ford-Bellman

Thuật toán tính các đường đi ngắn nhất tới tất cả các đỉnh còn lại trong một đồ thị

có hướng có trọng số (trong đó một số cung có thể có trọng số âm)

Các bước thực hiện:

Bước 1: Với đỉnh xuất phát s Gọi d[v] là khoảng cách từ s tới v với các giá trị khởi tạo là:

™ d[s] = 0

™ d[v] = +∞ nếu v ≠ s

Bước 2: Tối ưu hóa các d[v] như sau : Xét mọi đỉnh u,v của đồ thị, nếu có một cặp đỉnh u,v mà d[v]>d[u]+c[u,v] thì ta đặt lại d[v]=d[u]+c[u,v]

Thuật toán Ford-Bellman có độ phức tạp là O(n3)

Đầu vào: đồ thị có hướng G=(V,E) với n đỉnh s ∈ V là đỉnh xuất phát

d[u,v],u,v ∈ V ma trận trọng số

Đầu ra : khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v],

v ∈Truoc[v],v ∈ V , ghi nhận đỉnh trước v trong đường đi ngắn nhất từ s đến v

Trang 6

Tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị có trọng số Trọng số của cạnh (i,j) là w(i,j) > 0 và đỉnh x sẽ mang nhãn L(x) Khi kết thúc thuật giải L(z)

chính là chiều dài đường đi ngắn nhất từ a đến z

Đầu vào: Đồ thị liên thông G = (V, E) có trọng số w(i, j) > 0 với mọi cạnh (i,j), đỉnh a và đỉnh z

Đầu ra: Chiều dài đường đi ngắn nhất và đường đi ngắn nhất

2.2 Thuật toán Dijkstra

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

Phương pháp:

Bước 1: Gán L(a) := 0 Với mọi đỉnh x ≠ a gán L(x) = ∞ Kí hiệu T := V

Bước 2: Chọn v ∈T sao cho L(v) có giá trị nhỏ nhất Đặt:

T := T – {v}

Bước 3: Nếu z ∉ T → Kết thúc

Trang 7

Bước 4: Với mỗi x ∈ T kề với v gán:

L(x) := min{L(x), L(v) + w(v, x)}

Nếu L(x) này thay đổi thì ghi nhớ đỉnh v cạnh x để sau này xây dựng đường đi ngắn nhất

Quay về bước 2.

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

2.2 Thuật toán Dijkstra

L(z) là đường đi ngắn nhất từ a đến z Từ z lần ngược theo các đỉnh được ghi nhớ

ta có đường đi ngắn nhất Ngược lại sang bước 4

Độ phức tạp của thuật toán Dijkstra là O(n2).

Trang 8

2.3 Thuật toán Critical Path

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

Thuật toán Critical Path tìm đường đi ngắn nhất từ đỉnh nguồn đến tất cả các đỉnh

còn lại trên đồ thị không có chu trình

Đoạn chương trình:

Đầu vào: Đồ thị G=(V,E) trong đó V= { v[1], v[2], , v[n] }

Đối với mỗi cung (v[i],v[j]) E ta có i<j

Đồ thị được cho bởi danh sách kề Ke(v),v V

Đầu ra: Khoảng cách từ v[1] đến tất cả các đỉnh còn lại được ghi trong mảng d[v[i] ], i=1,2, ,n

d[v[1]]:=0;

for j:=2 to n do d[v[j]]:=a[v[1]],v[j]];

for j:=2 to n do

for v Ke[v[j]] do

d [v]:=min (d[v], d[v[j]] + a[v[j]], v );

Độ phức tạp của thuật toán là O(m)., do mỗi cung của đồ thị phải xét qua đúng

một lần

Trang 9

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ố

Đầu vào: Đồ thị liên thông G = (V,E), V= {1, 2, , n}, có trọng số w(i,j) >0 với mọi cung (i,j)

Đầ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 đến j với mọi cặp (i,j)

2.4 Thuật toán Floyd

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

Phương pháp:

Bước 1: Khởi tạo: Ký hiệu D0 là ma trận xuất phát

D0 = [d0(i,j)]

Trong đó:

d0(i,j) = w(i,j) nếu tồn tại cung (i,j)

d0 (i,j) = +∞ nếu không tồn tại cung (i,j) Gán k:=0

(đặc biệt nếu không có khuyên tại i thì d0 (i,i) = +∞)

Trang 10

Bước 2: Kiểm tra kết thúc: Nếu k = n, kết thúc D = Dn là ma trận độ dài đường đi ngắn nhất Ngược lại: k:=k+1

→ Sang bước 3

2.4 Thuật toán Floyd

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

Bước 3: Tính ma trận Dk theo Dk-1 Với mọi cặp (i,j), i=1 n, j=1 n thực hiện:

Nếu dk-1(i,j) > dk-1(i,k) + dk-1(k,j) thì đặt dk (i,j) := dk-1(i,k) + dk-1(k,j)

ngược lại đặt dk(i,j) := dk-1 (i,j)

Quay lại bước 2.

for (k=1; k>=n;k++) for (u=1; u<=n;u++) for (v=1;v<=n ;v++) c[u,v] = min ( c[u,v] , c[u,k] + c[k,v] );

Độ phức tạp của thuật toán Floyd là O(n3)

Đoạn chương trình:

Trang 11

2.4 Thuật toán Floyd

Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI

NGẮN NHẤT

Ứng dụng thuật toán Floyd-Warshall:

•Tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng

•Bài toán tìm bao đóng chuyển tiếp

•Tìm một biểu thức chính quy biểu thị các ngôn ngữ thông thường được chấp nhận bởi một automaton hữu hạn

•Nghịch đảo của các ma trận thực

•Tối ưu định tuyến (Tìm kiếm các con đường với lưu lượng tối đa giữa hai đỉnh)

•Kiểm tra đồ thị hai phía

•Tối đa băng thông

Định lý: Thuật toán Floyd là đúng

Hệ quả

(i) Nếu ma trận kết quả của thuật toán Floyd có phần tử hữu hạn trên đường

chéo chính thì đồ thị chứa chu trình

(ii) Nếu ma trận kết quả chứa phần tử +∞ ngoài đường chéo chính thì đồ thị

không liên thông mạnh

Trang 12

Chương 3: CHƯƠNG TRÌNH MÔ TẢ THUẬT

TOÁN

Giao diện chính của chương trình

1

Công cụ vẽ:

- Vẽ đỉnh

- Vẽ cạnh

- Di chuyển

- Xóa

2

Công cụ chỉnh sửa và hỗ trợ

vẽ đồ thị:

- Xóa cạnh mới nhất

- Xóa cạnh

- Xóa tất cả

- Tùy chọn đồ thị vô hướng

- Xóa đỉnh

- Đổi màu

3

Truy xuất kết quả:

- Từ: Đỉnh ban đầu.

- Đến: Đỉnh kết thúc.

- Bắt đầu: Thực hiện

3.1 Giao diện và chức năng chính:

Trang 13

Chương 3: CHƯƠNG TRÌNH MÔ TẢ THUẬT

TOÁN

3.2 Các bước thực hiện chương trình:

Bước 1

Ban đầu ta cần nhập thông tin

vào cho chương trình bằng

cách sử dụng công cụ vẽ nằm

phía dưới của chương trình để

vẽ đồ thị, các thông tin về

trọng số của 2 đỉnh sẽ không

được nhập trực tiếp mà ta sẽ

thực hiện bằng cách di chuyển

các đỉnh ra xa nhau, chương

trình sẽ tự động tăng trọng số

nếu ta kéo 2 đỉnh ra xa (và

ngược lại).

Bước 2

Sử dụng một số chức năng của chương trình để sửa, xóa, đổi mầu đỉnh đồ thị muốn xét

Ngay khi đưa dữ liệu vào thì chương trình tự động tính toán và đưa ra kết quả

là ma trận có trọng số là đường đi ngắn nhất giữa các đỉnh và hiện trên chương trình cho nhìn ta thấy.

Bước 3

Chọn đỉnh ban đầu và đỉnh kết thúc để chương trình đưa ra kết quả là đường đi ngắn nhất giữa

2 đỉnh đó Đường đi sẽ được hiện màu xanh đoạn gạch đứt và có 1 chấm màu xanh đậm di chuyển

từ điểm đầu đến điểm cuối.

Trang 14

Cảm ơn thầy cô đã lắng nghe!

Ngày đăng: 06/12/2015, 17:36

TỪ KHÓA LIÊN QUAN

w