You are on page 1of 8

VÍ DỤ BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT SỬ DỤNG

THUẬT TOÁN FLOYD WARSHALL

Bài Toán: Người ta muốn xây dựng một bệnh viện tại 1 trong 7 phường, xã (Vĩnh
Phú, Lái Thiêu, Bình Nhâm, Hưng Định, An Thạnh, Thuận Giao, An Sơn) của
thành phố Thuận An, Bình Dương để người dân thuận tiện đến khám chữa bệnh,
chọn phường, xã nào để đặt bệnh viện cho phù hợp (Tổng khoảng cách người dân
đến bệnh viện là ngắn nhất).

Để giải bài toán này ta xem mỗi phường, xã là 1 đỉnh của đồ thị, mỗi cạnh biểu thị
đường đi từ phường, xã này đến phường, xã kia, trên mỗi cạnh ta điền khoảng cách
đi lại của người dân từ phường, xã này đến phường, xã liền kề. Giả sử vị trí các
phường xã được mô hình hóa thành đồ thị sau:

An Sơn (F)

5 (km)

4 (km) 3 (km) 3 (km) 2 (km)

Lái Thiêu (B) Bình Nhâm (C) Hưng Định (D) An Thạnh (E)
Vĩnh Phú (A)

6 (km)
Thuận Giao (G)
1/ Giải bài toán theo lý thuyết

Áp dụng thuật toán Floyd để tìm đường đi ngắn nhất giữa các cặp đỉnh của đồ thị
trên.

Ma trận khoảng cách xuất phát (Ma trận kề) là:

Đỉnh A B C D E F G

A 0 4 ∞ ∞ ∞ ∞ ∞

B 4 0 3 ∞ ∞ ∞ ∞

C ∞ 3 0 3 ∞ ∞ ∞

D ∞ ∞ 3 0 2 5 6

E ∞ ∞ ∞ 2 0 ∞ ∞

F ∞ ∞ ∞ 5 ∞ 0 ∞

G ∞ ∞ ∞ 6 ∞ ∞ 0
Ma trận khoảng cách ngắn nhất giữa các đỉnh là:

Đỉnh A B C D E F G

A 0 4 7 10 12 15 16

B 4 0 3 6 8 11 12

C 7 3 0 3 5 8 9

D 10 6 3 0 2 5 6

E 12 8 5 2 0 7 8

F 15 11 8 5 7 0 11

G 16 12 9 6 8 11 0

Độ lệch tâm của các đỉnh tương ứng là:

A-16; B-12; C-9; D-10; E-12; F-15; G-16

Như vậy ta có thể kết luận độ lệch tâm của đỉnh C là nhỏ nhất, tâm đồ thị nằm gần
C nhất. Do đó nơi thích hợp nhất để xây bệnh viện trong 7 phường, xã để thuận
tiện cho việc người dân đi lại là Bình Nhâm.
*Tìm một chu trình Euler và Hamilton của đồ thị:

Điều kiện đầu tiên để có được chu trình Euler và cả Hamilton của đồ thị chính là
đồ thị phải liên thông (Có ít nhất một đường đi giữa mọi cặp đỉnh trong đồ thị.

Quan sát đồ thị ta có thể kết luận, đồ thị của bài toán trên không tồn tại chu trình
Euler hay Hamilton.
2/ Giải bài toán bằng MATLAB

a/ Các lệnh được sử dụng trong đoạn code MATLAB

Tên Lệnh Ý Nghĩa

clear Xoá mọi giá trị, dữ liệu, biến ban đầu

input Nhập dữ liệu đầu vào

Tìm giá trị nhỏ nhất trong một mảng hoặc trong các phần tử
min
của ma trận

length Xác định kích thước của ma trận

ones Tạo ma trận chứa các giá trị bằng 1

Được sử dụng để tạo vòng lặp, cho phép thực hiện một khối
for
mã lệnh lặp đi lặp lại một số lần xác định
Được sử dụng để thực hiện điều kiện rẽ nhánh trong chương
trình. Nó cho phép bạn thực hiện một khối mã lệnh nếu một
If – else - end
điều kiện được đáp ứng và một khối mã lệnh khác nếu điều
kiện không được đáp ứng.

fprintf Hiển thị nội dung trên màn hình

disp Xuất kết quả


b/ Đoạn code được sử dụng

clc % Xóa màn hình command window


clear all % Xóa các dữ liệu ban đầu
T0=input("nhap ma tran A"); % Nhập ma trận đầu vào A (Ma trận kề)
N=min(length(T0)); % Tính kích thước của ma trận A
T1=-1*ones(N,N); % Tạo ma trận T1 kích thước NxN
T=T0; % Tạo bản sao T0 gán cho T
for k=1:N % Bắt đầu vòng lặp với biến k từ 1 đến N
for i=1:N % Bắt đầu vòng lặp với biến i từ 1 đến N
for j=1:N % Bắt đầu vòng lặp với biến j từ 1 đến N
if T(i,k)==inf
continue;
end
if T(k,j)==inf
% Kiểm tra các phần tử của ma trận T có vô cùng không, nếu có bắt đầu vòng lặp tiếp
theo với i,j
continue;
end
if T(i,j)>T(i,k)+T(k,j)
% Kiểm tra xem khoảng cách từ i-j có nhỏ hơn tổng khoảng cách từ i-k và từ k-j không.
Nếu có, vòng lặp sẽ cập nhật giá trị của ma trận T và ma trận T1 tương ứng
if T1(i,k)==-1
% Kiểm tra xem các phần tử của ma trận T1 có bằng -1 không
T1(i,j)=k;
% Nếu có, giá trị của T1 được cập nhật thành giá trị của k
else
T1(i,j)=T1(i,k);
% Nếu không, giá trị của T1(i,j) được cập nhật thành giá trị của T1(i,k)
end
T(i,j)=T(i,k)+T(k,j);
% Cập nhật giá trị của T(i,j) thành tổng của T(i,k) và T(k,j)
end
end
end
end
fprintf('Ma tran khoang cach ngan nhat la\n'); % Hiển thị nội dung trên command
window
disp(T); % Xuất kết quả ra ma trận T
c/ Kết Quả
Sau khi chạy đoạn code trên phần mềm MATLAB ta thu được kết quả:

Từ Ma Trận Đường đi ngắn nhất ta tìm được độ lệch tâm của đỉnh C là bé nhất.
Qua đó cho thấy nơi thích hợp xây bệnh viện nhất là Bình Nhâm

You might also like