Tải bản đầy đủ (.docx) (26 trang)

Bài tập lớn mạng máy tính xây DỰNG CHƯƠNG TRÌNH mô PHỎNG THUẬT TOÁN tìm ĐƯỜNG đi NGẮN NHẤT

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 (404.12 KB, 26 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
----------

BÁO CÁO MẠNG MÁY TÍNH
Nhóm 10
Đề tài 9:

XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG
THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT

1


MỤC LỤC

2


3


DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ

4


LỜI NÓI ĐẦU
Sự phát triển của Internet cũng đồng nghĩa với việc tăng trưởng về quy mô
và công nghệ nhiều loại mạng LAN, WAN … Và đặc biệt là lưu lượng thông tin
trên mạng tăng đáng kể. Chính điều đó đã làm cho vấn đề chia sẻ thông tin trên


mạng hay là vấn đề định tuyến trở nên quan trọng hơn bao giờ hết. Trong việc
thiết kế mạng và lựa chọn giao thức định tuyến sao cho phù hợp với chi phí, tài
nguyên của tổ chức là đặc biệt quan trọng.
Internet phát triển càng mạnh, lượng người truy nhập càng tăng yêu cầu
định tuyến càng phải tin cậy, tốc độ chuyển mạch nhanh và không gây ra lặp trên
mạng. Hơn nữa khi nhiều tổ chức tham gia vào mạng thì nhiều giao thức được
đưa vào sử dụng dẫn đến sự phức tạp về định tuyến cũng gia tăng, và số lượng
các giao thức để phục vụ cho việc định tuyến cũng có rất nhiều. Việc hiểu biết
và thiết kế các mạng thông tin cỡ lớn có sử dụng các thiết bị định tuyến đang trở
thành một nhu cầu vô cùng cấp thiết trong thực tế. Nó đòi hỏi người thiết kế
mạng phải có sự hiểu biết sâu về giao thức sẽ sử dụng cho việc thiết kế mạng
cũng như các loại giao thức định tuyến khác.
Trong giới hạn của bài tập lớn chúng em xin được chọn đề tài “Lập trình
mô phỏng mô hình định tuyến sử dụng thuật toán tìm đường ngắn nhất –
Shortest path routing".
Trong quá trình thực hiện đề tài này, chúng em đã rất cố gắng để hoàn
thành tốt nhưng có lẽ do vốn kiến thức còn hạn hẹp cũng như những yếu tố
khách quan khác mà không tránh khỏi những thiếu sót. Chúng em rất mong sự
đóng góp ý kiến, phê bình và hướng dẫn thêm của thầy cũng như bạn đọc.
Cuối cùng chúng em xin gửi lời cảm ơn chân thành nhất tới thầy TS. đã
hướng dẫn chúng em hoàn thành bài tập lớn này.
Chúng em xin chân thành cảm ơn!

5


1.1. CƠ SỞ LÝ THUYẾT
1.2. Tìm hiểu các khái niệm cơ bản trong định tuyến mạng thông tin
1.2.1. Định tuyến (Routing)
Định tuyến là quá trình chọn lựa các đường trên một mạng máy tính để giử

dữ liệu qua đó. Việc định tuyến được thực hiện cho nhiều loại mạng, trong đó có
mạng điện thoại, liên mạng, Internet, mạng giao thông.
Định tuyến chỉ ra hướng, sự di chuyển của các gói (dữ liệu) được đánh địa
chỉ từ mạng nguồn của chúng, hướng đến đích cuối thông qua các node trung
gian. Thiết bị phần cứng chuyên dùng được gọi là router (bộ định tuyến). Tiến
trình định tuyến thường chỉ hướng đi dựa vào bảng định tuyến, đó là bảng chứa
những lộ trình tốt nhất đến các đích khác nhau trên mạng. Vì vậy, việc xây dựng
bảng định tuyến, được tổ chức trong bộ nhớ của router, trở nên vô cùng quan
trọng cho việc định tuyến hiệu quả.
Routing khác với bridging (bắc cầu) trong nhiệm vụ nó thì các cấu trúc địa
chỉ gợi lên sự gần gũi của các địa chỉ tương tự trong mạng, qua đó cho phép
nhập liệu một bảng định tuyến đơn để mô tả lộ trình đến một nhóm các địa chỉ.
Vì thế, routing làm việc tốt hơn bridging trong những mạng lớn, và nó trở thành
dạng chiếm ưu thế của việc tìm đường trên mạng internet.
1.2.2. Các lớp thuật toán định tuyến
Thuật toán vector (distance – vector routing protocol):
Thuật toán này dùng thuật toán Bellman-Ford. Nó chỉ định một con số, gọi
là trọng số cho mỗi một liên kết giữa các node trong mạng. Các node sẽ gửi
thông tin từ điểm A đến điểm B qua đường đi mang lại tổng trọng số thấp nhất
(là tổng trọng số của các kết nối giữa các node được dùng).
Thuật toán hoạt động với những hành động đơn giản. Khi một node khởi
động lần đầu, nó chỉ biết các node kề trực tiếp với nó, và trọng số trực tiếp để đi
đến đó (thông tin, danh sách của các đích, tổng trọng số của từng node và bước
6


kế tiếp để gửi dữ liệu đến đó tạo nên bảng định tuyến, hay bảng khoảng cách).
Mỗi node, trong một tiến trình, gửi đến từng "hàng xóm" tổng chi phí của nó để
đi đến các đích mà nó biết. Các node "hàng xóm" phân tích thông tin này và so
sánh với những thông tin mà chúng đang "biết"; bất cứ điều gì cải thiện được

những thông tin chugns đang có sẽ được đưa vào bảng định tuyến. Đến khi kết
thúc, tất cả các node trên mạng sẽ tìm ra bước truyền kế tiếp, tối ưu đến tất cả
mọi đích và tổng chi phí tốt nhất.
Thuật toán trạng thái kết nối (Link-state routing protocols)
Khi áp dụng các thuật toán trạng thái kết nối, mỗi node sử dụng cơ sở dữ
liệu của nó như là một bản đồ của mạng với dạng đồ thị. Để làm điều này, mỗi
node phát đi tới tổng thể mạng những thông tin về các node khác mà nó có thể
kết nối được và từng node góp thông tin một cách độc lập vào bản đồ. Sử dụng
bản đồ này, mỗi router sau đó sẽ quyết định về tuyến đường tốt nhất từ nó đến
mọi node khác.
Các router sẽ trao đổi gói tin LSA với những router khác. Đây là những gói
tin nhỏ, chứa thông tin về các router. Mỗi router sẽ dựa vào LSA này để tìm ra
đường đi. Mỗi router đều xác định được chính xác topology của mạng. Chính vì
vậy router sẽ đưa ra quyết định để đưa packet đến đích tốt hơn. Mỗi router trong
mạng sẽ báo cáo trạng thái của nó, các link nối trực tiếp và trạng thái của mỗi
link. Router sẽ nhân bản thông tin này với tất cả các router mạng. Cuối cùng tất
cả các router trên mạng đều có cái nhìn giống nhau về topology mạng.
Thuật toán làm theo cách này là thuật toán Dijkstra (thuật toán mà ta sẽ tìm
hiểu và ứng dụng), bằng cách xây dựng cấu trúc dữ liệu khác, dạng cây, trong đó
node hiện tại là gốc và chứa mọi node khác trong mạng. Bắt đầu với một cây
ban đầu chỉ chứa chính nó. Sau đó lần lượt tụ tập các node chưa được thêm vào
cây, nó sẽ thêm node có trọng số thấp nhất để đến một node đã có trên cây. Tiếp
tục quá trình đến khi mọi node đều được thêm. Cây này sau đó phục vụ để xây
dựng bảng định tuyến, đưa ra bước truyền kế tiếp tối ưu để từ một node đến kì
node khác trong mạng.
7


Thuật toán định tuyến bằng trạng thái kết nối phản ứng nhanh nhạy hơn và
trong một khoảng thời gian có hạn, đối với sự thay đổi kết nối. Ngoài ra, những

gói được gửi qua mạng trong định tuyến bằng trạng thái kết nối thì nhỏ hơn
những gói dùng trong định tuyến bằng vector.
1.3. Giao thức định tuyến
Giao thức định tuyến được dùng trong khi thi hành thuật toán định tuyến để
thuận tiện cho việc trao đổi thông tin giữa các mạng, cho phép các router xây
dựng bảng định tuyến một cách linh hoạt. Trong một số trường hợp, giao thức
định tuyến có thể tự chạy đè lên giao thức đã được định tuyến.
Giao thức định tuyến gồm các dạng sau đấy:
Giao thức định tuyến trong:
- Router Information Protocol (RIP).
- Open Shortest Path First (OSPF).
- Intermedicate System to Intermedicate System (IS-IS).
- Interior Gateway Routing Protocol (IGRP)
- Enhanced IGRP (EIGRP)
Giao thức định tuyến ngoài:
- Exterior Gateway Protocol (EGP).
- Border Gateway Protocol (BGP).
- Constrained Shortest Path First (CSPF).
1.4. Lý thuyết Graph
Một Graph G, được định nghĩa bởi tập các đỉnh V và tập các cạnh E. Các
đỉnh thường được gọi là các nút (node) và chúng biểu diễn vị trí (ví dụ một điểm
chứa lưu lượng hoặc một khu vực chứa thiết bị truyền thông). Các cạnh được
gọi là liên kết và chúng biểu diễn phương tiện truyền thông. Graph có thể được
biểu diễn như sau:
G = (V, E)
8


Hình 1 là một ví dụ của một Graph


Hình 1: Một graph đơn giản

Theo lý thuyết, V có thể là tập hợp rỗng hoặc không có xác định nhưng thực
tế, V là tập hợp xác định khác rỗng, nghĩa là có thể biểu diễn:
V = {vi |i = 1, 2, ..., N}
Trong đó N là số lượng nút. Tương tự E được biểu diễn:
E = {ej |j = 1, 2, ..., M}
Một liên kết ej tương ứng với một kết nối giữa một cặp nút. Có thể biểu diễn
liên kết ej giữa nút i và k bởi:
ej = (vi, vk) hoặc ej = (i,k).
Một liên kết gọi là đi tới một nút nếu đó là một trong hai điểm cuối của liên
kết. Nút i và k gọi là kề nhau nếu tồn tại một liên kết (i,k) giữa chúng. Những
nút như vậy được xem là các nút "hàng xóm". Bậc của nút là số lượng liên kết đi
tới nút hay là số lượng nút hàng xóm.
Một liên kết có thể có hai hướng. Khi đó thứ tự của các nút là không có ý
nghĩa. Ngược lại, thứ tự các nút có ý nghĩa. Trong trường hợp thứ tự các nút có
ý nghĩa, một liên kết có thể xem như là một cung và được định nghĩa:
aj = [vi, vk] hoặc aj = [i, k].

9


k được gọi là cận kề hướng ra đối với i nếu một cung [i,k] tồn tại và bậc
hướng ra của i là số lượng các cung như vậy.
Một graph gọi là một mạng nếu các liên kết và các nút có mặt trong liên kết
chứa các thuộc tính như độ dài, dung lượng, loại, .... Các mạng được sử dụng để
mô hình các vấn đề cần quan tâm trong truyền thông, các thuộc tính riêng biệt
của các nút và liên kết thì liên quan đến các vấn đề cụ thể trong truyền thông.
Một graph có các liên kết gọi là graph vô hướng, còn một graph có các cung
gọi là graph hữu hướng. Một graph hữu hướng có thể có các liên kết vô hướng.

Thông thường, các graph được giả sử là vô hướng hoặc sự phân biệt đó là không
có ý nghĩa.
Có thể có khả năng xảy ra hiện tượng xuất hiện nhiều hơn một liên kết giữa
cùng một cặp nút. Những liên kết như vậy gọi là các liên kết song song. Một
graph có liên kết song song gọi là một multigraph.
Cũng có khả năng xuất hiện các liên kết giữa một nút nào đó hoặc giữa
chính nút đó. Những liên kết đó gọi là các self loop. Một graph không có các
liên kết song song hoặc self loop gọi là một graph đơn giản. Một graph phức tạp
được trình bày như trong Hình 2, trong đó, nút B và nút C có self loop, liên kết
[A, D], [A, B] là các liên kết song song.

Hình 2. Một graph phức tạp

10


1.5. Định tuyến đường đi ngắn nhất (Shortest Path Routing)
Định tuyến đường đi ngắn nhất là một mô hình định tuyến rất thông dụng,
phổ biến trong định tuyến mạng thông tin. Bài toán tìm đường đi ngắn nhất là
một bài toán quan trọng trong quá trình thiết kế và phân tích mạng. Hầu hết các
bài toán định tuyến có thể giải quyết như giải quyết bài toán tìm đường đi ngắn
nhất khi một "độ dài" thích hợp được gắn vào mỗi cạnh (hoặc cung) trong mạng.
Các thuật toán thiết kế cố gắng tìm kiếm cách tạo ra các mạng thỏa mãn tiêu
chuẩn độ dài đường đi.
Bài toán đơn giản nhất của loại bài toán này là tìm đường đi ngắn nhất giữa
hai nút cho trước. Loại bài toán này có thể là bài toán tìm đường đi ngắn nhất từ
một nút tới tất cả các nút còn lại, tương đương bài toán tìm đường đi ngắn nhất
từ tất cả các điểm đến một điểm. Đôi khi đòi hỏi phải tìm đường đi ngắn nhất
giữa tất cả các cặp nút. Các đường đi đôi khi có những giới hạn nhất định (chẳng
hạn như giới hạn số lượng các cạnh trong đường đi).

Chúng ta xét các graph hữu hướng và giả sử rằng đã biết độ dài của một
cung giữa mỗi cặp nút i và j là l ij. Các độ dài này không cần phải đối xứng. Khi
một cung không tồn tại thì độ dài l ij được giả sử là rất lớn. Chú ý rằng có thể áp
dụng quá trình này cho các mạng vô hướng bằng cách thay mỗi cạnh bằng hai
cung có cùng độ dài. Ban đầu giả sử rằng, l ij là dương hoàn toàn, sau đó giả thiết
này có thể được thay đổi.
Đối với mô hình định tuyến đường đi ngắn nhất, có nhiều thuật toán để giải
quyết bài toán này. Trong đề tài này sẽ giới thiệu hai thuật toán điển hình nhất
giải quyết vấn đề này là thuật toán Dijkstra và Bellman - Ford
1.5.1. Thuật toán Dijkstra
Các thuật toán đường đi ngắn nhất đều dựa trên nhận xét về việc lồng nhau
giữa các đường đi ngắn nhất: một nút k thuộc một đường đi ngắn nhất từ i tới j
thì đường đi ngắn nhất từ i tới j sẽ bằng đường đi ngắn nhất từ i tới k kết hợp với

11


đường đi ngắn nhất từ j tới k. Vì thế, chúng ta có thể tìm đường đi ngắn nhất
bằng công thức đệ quy:

Hình 3. Các đường đi ngắn nhất lồng nhau

Dxy là độ dài của đường đi ngắn nhất từ x tới y. Vấn đề đặt ra là phải có một
cách khởi động đệ quy nào đó, vì chúng ta không thể khởi động với tất cả các
giá trị bất kỳ ở vế phải của phương trình trên.
Thuật toán Dijkstra phù hợp cho việc tìm đường đi ngắn nhất từ một nút I tới
tất cả các nút khác. Bắt đầu bằng việc thiết lập:
dii = 0 và dij = ∞

∀i≠j


Sau đó thiết lập
dij  min (dik, dij + ljk)
Tại mỗi giai đoạn của quá trình, giá trị d ik là giá trị ước lượng hiện có của
đường đi ngắn nhất từ i tới k và thực ra là độ dài đương đi ngắn nhất đã được
tìm cho tới thời điểm đó. Xem d jk như là nhãn trên nút k. Quá trình sử dụng một
nút để triển khai các nhãn cho các nút khác gọi là quá trình quét nút.
Thực hiện tương tự, tiếp tục tìm các nút chưa được quét có nhãn bé nhất và
quét nó. Chú ý rằng, vì giả thiết tất cả các ljk đều dương, do đó một nút không
thể gán cho nút khác một nhãn bé hơn chính nhãn của nút đó. Vì vậy, khi một
nút được quét thì việc quét lại nó nhất thiết không bao giờ xảy ra. Nếu nhãn trên
một nút thay đổi, nút đó phải được quét lại.
Ví dụ : xét mạng như hình sau, trên mỗi đường ghép nối các trọng số tương
ứng với chi phí của từng đường, để đơn giản ta coi các trọng số này theo cả hai
chiều là như nhau, mặc dù trên thực tế chúng có thể khác nhau về giá trị. Để
12


chọn được đường dẫn ngắn nhất từ một nguồn tới tất cả các nút trong mạng, đòi
hỏi phải có kiến thức về cấu hình tổng thể của mạng (danh sách các nút và các
ghép nối giữa chúng) cũng như chi phí của từng đường nối. Điều đó dẫn tới việc
tính toán tập trung dựa trên thông tin đầy đủ lưu trong các cơ sở dữ liệu trung
tâm (Central Database).

Hình 4. Ví dụ một mạng

Thuật toán được thực hiện theo từng bước, xây dựng mô hình cây đường
ngắn nhất (Shortest Path Tree) có gốc tại nút nguồn (nút 1). Các đường dẫn ngắn
nhất tới k nút khác được tính toán trong k bước, chúng được tập hợp lại trong
tập N.

Coi D(v) là khoảng cách (tổng của các trọng số đường nối dọc theo đường
dẫn) từ nút nguồn 1 tới nút v. Coi l(i, j) là chi phí đã cho giữa hai nút i và j.
Thuật toán gồm 2 bước:
1) Bước khởi đầu
Đặt N = {1} (tập N ban đầu chỉ gồm duy nhất 1 nút), với mỗi nút v

N đặt

D(v) = 1(1,v), với các nút không nối trực tiếp với nút 1 ta coi chi phí bằng ∞.
2) Bước lặp
Tìm nút w không thuộc N sao cho D(w) là tối thiểu và bổ sung w vào tập N.
Sau đó thay D(v) cho toàn bộ các nút không thuộc N còn lại bằng cách tính:
D(v)  min[D(v), D(w) + l(w,v)]
13


Bước này được lặp lại cho đến khi tất cả các nút đều có trong N.
Sau khi thực hiện, ta lần lượt có được các bước mô tả bởi Bảng 1:
Bảng 1. Mô tả các bước thực hiện trong thuật toán Dijkstra

Bước
0
1
2
3
4
5

Tập N
{1}

{1,2}
{1,2,3}
{1,2,3,6}
{1,2,3,6,4}
{1,2,3,6,4,5

D(2)
2
2
2
2
2

D(3)

3
3
3
3

D(4)


4
4
4

D(5)



5
5
5

D(6)
5
3
3
3
3

2
3
4
5
3
}
Mô hình cây đường đi ngắn nhất nếu lấy nút 1 làm nút nguồn có thể mô tả

như Hình 5:

Hình 5. Mô hình đường đi ngắn nhất

Từ đó, ta có bảng định tuyến cho nút 1 như trong Bảng 2:
Bảng 2. Bảng chọn tuyến cho nút 1

Đích
2
3
4

5
6

Nút tiếp theo
2
3
4
5
3
14


Với thuật toán này ta có thể tính được các tuyến đường cho đường dẫn ngắn
nhất cho từng nút, cụ thể ta coi nút đó là nút nguồn rồi thực hiện các bước giải
thuật kể trên. Trong trường hợp chọn tuyến theo phương thức tập trung, NMC sẽ
gửi các bảng chọn tuyến cho từng nút một sau khi đã thiết lập xong, còn nếu
mạng sử dụng phương thức phân bố thì từng nút phải tính lấy bảng định tuyến,
cùng sử dụng các thông tin tổng thể như trên (được cung cấp bởi các nút lân cận
hoặc bởi NMC) và chọn ra cây đường dẫn cho riêng nó.
1.5.2. Thuật toán Bellman Ford
Thuật toán Bellman Ford là một thuật toán khác của dạng thuật toán
Dijkstra, dựa vào việc quét các nút theo thứ tự mà chúng được đánh nhãn. Việc
đó loại trừ việc phải tìm nhãn nhỏ nhất, một nút có thể cần quét nhiều hơn một
lần.
Trong dạng đơn giản nhất, thuật toán Bellman Ford duy trì một hàng đợi các
nút để quét. Khi một nút được đánh nhãn, nó được thêm vào hàng đợi trừ khi nó
đã tồn tại trong hàng đợi. Hàng đợi được quản lý theo quy tắc vào trước, ra trước
(FIFO). Vì thế các nút được quét theo thứ tự mà chúng được đánh nhãn. Nếu
một nút được đánh nhãn lại sau khi nút đó được quét thì nó được thêm vào sau
hàng đợi và được quét lần nữa.

Cho graph liên thông G = {V, E}, cần tìm khoảng cách ngắn nhất và đường
đi từ một nút s đến tất cả nút khác. Thuật toán được mô tả theo các bước sau:
1) Thiết lập hàm xác định nút tiền bối của s là π(s) = s và các chi phí d(v)
bằng:
• ∞ với v ≠ u0
• 0 với v = u0
Nếu |V| = 1 thì kết thúc.
Tạo hàng đợi FIFO Q của các nút quét. Đưa s vào Q.
2) Lấy ra đỉnh đầu tiên trong hàng đợi h, kiểm tra chi phí của các nút lân cận
u, nếu d(u) > d(h) + d(hu) thì đưa u vào hàng đợi và gán:
15


d(u) = d(h) + d(hu)
π(u) = h
3) Lặp lại B2 cho đến khi Q = {∅}

Hình 6. Một graph đơn giản

Ví dụ minh họa cho một graph đơn giản như trong Hình 6. Yêu cầu đặt ra là
tìm quãng đường ngắn nhất từ B đến D. Theo các bước trong giải thuật đã nêu,
ta có Bảng 3 minh họa rõ hơn cách thực hiện thuật toán Bellman Ford.
Bảng 3. Chi tiết các bước giải

Bước
A
B
C
D


0

1

2

3

4


0



2
0
6


2
0
5
8

2
0
5
7


2
0
5
7

Kết quả đường đi ngắn nhất từ B đến D được giải theo giải thuật Bellman
Ford là: B  A  C  D với tổng chi phí là: 7.

16


Ngoài thuật toán Bellman Ford và Dijkstra, trong bài toán tìm đường ngắn
nhất còn có một số giải thuật khác như Floyd và các thuật toán mở rộng khác.
Dựa theo tính chất của bài toán cụ thể, ta sẽ lựa chọn giải thuật sao cho phù hợp.
Những cơ sở lý thuyết này rất quan trọng và hỗ trợ nhiều trong việc lập trình
phần mềm mô phỏng sẽ được đề cập đến chương tiếp theo.

17


1.6. XÂY DỰNG PHẦN MỀM MÔ PHỎNG TÌM ĐƯỜNG ĐI NGẮN
NHẤT (SHORTEST PATH ROUTING) BẰNG THUẬT TOÁN
DIJKSTRA
1.7. Phương pháp thực hiện
Trong đề tài này, nhóm em sử dụng ngôn ngữ Java để viết chương trình trên
trình biên dịch NetBeans.
Lưu đồ thuật toán của chương trình:

Hình 7. Lưu đồ thuật toán chương trình


18


Dựa theo cơ sở lý thuyết về giải thuật Dijkstra, chúng em đã xây dựng lưu
đồ thuật toán được thể hiện theo Hình 7.
1.8. Kết quả thu được

Hình 8. Giao diện phần mềm

Ta có thể sử dụng phần mềm mô phỏng thuật toán Dijkstra bằng 2 cách:
- Sử dụng đồ thị ngẫu nhiên : File -> Đồ thị ngẫu nhiên (Ctrl + R).
- Tạo một đồ thị: File -> Mở đồ thị (Ctrl + O). File nhập vào là một file .txt
với hàng đầu tiên lưu giá trị của số node, node nguồn, node đích. Các giá
trị tiếp theo lưu giá của các node với nhau.
Ví dụ :
848
03520000
30107000
51040100
20400360
19


07000203
00132046
00060405
00003650
1
44 224
125 99

140 222
111 334
356 99
271 198
341 331
407 213
Đây là một đồ thị gồm có 8 node, ta áp dụng thuật toán Dijkstra để tìm
đường đi ngắn nhât tự node 4 đến node 8, các trọng số được lưu tiếp theo,
w[i][j] là giá của node i đến node j, nếu w[i][j] = 0 là node i không nối với
node j. Giá trị cuối cùng là cờ flag, nếu flag = 0 thì ta nhập xong đồ thị và tọa
độ của các node sẽ là ngẫu nhiên, nếu flag = 1 thì ta tiến hành đọc các giá trị
tọa độ của các node: dòng đầu tiên sẽ lưu giá trị tung độ và hoành độ của
node[1], tương tự các dòng tiếp theo.
1.8.1. Đồ thị ngẫu nhiên
Ta vào File -> Đồ thị ngẫu nhiên

20


Hình 9. Giao diện mở đồ thị ngẫu nhiên

21


Giao diện sau khi chạy:

Hình 10. Kết quả sau khi chạy

1.8.2. Đồ thị nhập vào
Ta nhập vào một đồ thị như sau:

848
03520000
30107000
51040100
20400360
07000203
00132046
00060405
00003650
1
22


44 224
125 99
140 222
111 334
356 99
271 198
341 331
407 213

Hình 11. Đồ thị nhập vào.

23


Kết quả sau khi chạy:

Hình 12. Kết quả sau khi chạy.


24


1.9. KẾT LUẬN
Đề tài đã trình bày và giải quyết được một số vấn đề sau:
- Trình bày một cách tổng quan về lý thuyết đồ thị và thuật toán giải bài
toán tìm đường đi ngắn nhất có trọng số xác định. và áp dụng giải bài toán
mẫu theo giải thuật dijkstra.
- Xây dựng thuật toán xây dựng thuật toán giải bài toán tìm đường đi ngắn
nhất
Các bài toán đường đi ngắn nhất được chia thành 3 dạng chính:
- Tìm đường đi ngắn nhất từ một nút nguồn đến một nút đích
- Tìm đường đi ngắn nhất từ một nút nguồn đến tất cả các nút đích
- Tìm đường đi ngắn nhất giữa hai nút bất kỳ.
Bài toán được đề cập đến ở đây là bài toán ở dạng thứ nhất: tìm đường đi
ngắn nhất từ một nút nguồn đến một nút đích cho trước.

25


×