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

Tìm đường đi ngắn nhất thuật toán dijkstra

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 (500.25 KB, 10 trang )

TRƯỜNG CAO ĐẲNG KỸ THUẬT LÝ TỰ TRỌNG
KHOA CÔNG NGHỆ THÔNG TIN

ĐỀ TÀI
.

Tìm đường đi ngắn nhất thuật toán Dijkstra
GIÁO VIÊN HƯỚNG DẪN: Vũ Thái Linh

SINH VIÊN THỰC HIỆN:
Cao Hoàng Hà
Huỳnh Văn ngọc
Nguyễn Đại Tây
LỚP: 11CĐ-TP1


2

TOÁN ỨNG DỤNG 2

GVHD: Vũ Thị Thái Linh

I. Tiểu Sử Edsger Dijkstra

Tiểu sử: Edsger Dijkstra
1.Sinh 11 / 5 /1930 tại Rotterdam, Hà Lan . Mất: 6 /8 / 2002 (72 tuổi) tại
Nuenen, Hà Lan
2.Edsger Wybe Dijkstra :là nhà khoa học máy tính Hà Lan. Ông được nhận giải
thưởng Turing cho các đóng góp có tính chất nền tảng trong lĩnh vực ngôn ngữ
lập trình. Không lâu trước khi chết, ông đã được nhận giải Bài báo ảnh hưởng
lớn trong lĩnh vực tính toán phân tán của ACM dành cho bài báo đã khởi đầu


cho ngành con Tự ổn định. Sau khi ông qua đời, giải thưởng thường niên này đã
được đổi tên thành giải thưởng ACM Edsger W. Dijkstra.
Dijkstra học vật lý lý thuyết tại Đại học Leiden, nhưng ông đã nhanh chóng nhận ra
rằng ông quan tâm đến lập trình hơn.
Thời kỳ đầu, ông làm việc tại Trung tâm toán học, Viện nghiên cứu quốc gia về toán
học và khoa học máy tính tại Amsterdam, ông còn giữ chức vị giáo sư tại Đại học Kỹ
thuật Eindhoven, Hà Lan. Đầu thập kỷ 1970, ông làm cộng tác nghiên cứu tại
Burroughs Corporation, sau đó giữ vị trí Schlumberger Centennial Chair ngành Khoa
học máy tính tại Đại học Texas tại Austin, Mỹ. Ông nghỉ hưu năm 2000.
Trong các đóng góp của ông cho ngành khoa học máy tính có thuật toán đường đi
ngắn nhất, còn được biết với tên Thuật toán Dijkstra, hệ điều hành THE và cấu trúc
semaphore để phối hợp hoạt động của nhiều bộ vi xử lý và nhiều chương trình. Một
khái niệm khác trong lĩnh vực tính toán phân tán đã được khởi đầu nhờ Dijkstra là


3

TOÁN ỨNG DỤNG 2

GVHD: Vũ Thị Thái Linh

self-stabilization - một cách khác để đảm bảo tính đáng tin cậy của hệ thống. Thuật
toán Dijkstra được sử dụng trong SPF, Shortest Path First, dùng trong giao thức định
tuyến OSPF, Open Shortest Path First.
Ông còn nổi tiếng với đánh giá thấp về lệnh GOTO trong lập trình máy tính. Bài báo
năm 1968 "A Case against the GO TO Statement" (EWD215) được xem là một bước
quan trọng tiến tới việc lệnh GOTO bị thay thế dần trên quy mô lớn bởi các cấu trúc
lập trình chẳng hạn như vòng lặp while. Phương pháp này còn được gọi là Lập trình
có cấu trúc. Dijkstra đã rất hâm mộ ngôn ngữ lập trình ALGOL 60, và đã làm việc
trong nhóm cài đặt trình biên dịch đầu tiên cho ngôn ngữ này.

Từ những năm 1970, mối quan tâm chính của Dijkstra là kiểm định hình thức (formal
verification). Quan niệm phổ biến thời đó là người ta nên đưa ra một chứng minh toán
học về tính đúng đắn của chương trình sau khi đã viết chương trình đó. Dijkstra đã
phản đối rằng các chứng minh thu được rất dài và nặng nề, và rằng chứng minh đó
không đem lại hiểu biết về việc chương trình đã được phát triển như thế nào. Một
phương pháp khác là dẫn xuất chương trình (program derivation), để "phát triển
chứng minh và chương trình một cách đồng thời". Người ta bắt đầu bằng một đặc tả
toán học về những gì mà một chương trình cần phải thực hiện, sau đó áp dụng các
biến đổi toán học đối với đặc tả đó cho đến khi nó được chuyển thành một chương
trình chạy được. Chương trình thu được khi đó được gọi là "đúng đắn theo cách xây
dựng" (correct by construction).
Dijkstra còn nổi tiếng với các bài luận của ông về lập trình; ông là người đầu tiên
tuyên bố rằng việc lập trình có đặc điểm cố hữu là khó khăn và phức tạp đến mức các
lập trình viên cần phải khai thác mọi kỹ thuật và các phương pháp trừu tượng hóa có
thể để hy vọng có thể quản lý được độ phức tạp của nó một cách thành công. Ông còn
nổi tiếng với thói quen viết tay cẩn thận các bản thảo bằng bút máy. Các bản thảo này
được gọi là EWD, do Dijkstra đánh số chúng bằng tiết đầu tố EWD. Ông thường phân
phát các bản phô-tô của bản EWD mới cho các đồng nghiệp của mình; những người
nhận được lại phô-tô và tiếp tục phân phát các bản sao, bằng cách đó các bản EWD
được phát tán khắp cộng đồng khoa học máy tính quốc tế. Các chủ đề chính là về


4

TOÁN ỨNG DỤNG 2

GVHD: Vũ Thị Thái Linh

khoa học máy tính và toán học, ngoài ra còn có các báo cáo công tác, thư và các bài
phát biểu. Hơn 1300 bài EWD đã được quét thành ảnh, số lượng được chuyển thành

dạng điện tử để phục vụ nghiên cứu ngày càng tăng, chúng được lưu trữ và cung cấp
trực tuyến tại Đại học Texas[2].
Dijkstra đã là một trong những người tiên phong trong nghiên cứu về tính toán phân
tán. Có người còn cho là một số bài báo của ông đã thiết lập ngành nghiên cứu này.
Cụ thể, bài báo "Self-stabilizing Systems in Spite of Distributed Control" của ông đã
khởi đầu ngành con Self-stabilization.
Dijkstra còn được ghi nhận là cả đời chỉ sở hữu duy nhất một chiếc máy tính (vào
cuối đời) và họa hoằn mới thực sự sử dụng nó [3], để đi đôi với quan niệm của ông
rằng khoa học máy tính trừu tượng hơn chứ không chỉ là lập trình, quan niệm này
được thể hiện trong nhiều câu nói nổi tiếng chẳng hạn như "Khoa học máy tính đối
với máy tính cũng như thiên văn học đối với kính thiên văn" (Computer Science is no
more about computers than astronomy is about telescopes.)[4]
Ông qua đời tại Nuenen, Hà Lan vào ngày 6 tháng 8, năm 2002 sau một thời gian dài
bị ung thư. Năm sau, giải thưởng PODC Influential Paper Award in distributed
computing (bài báo ảnh hưởng trong lĩnh vực tính toán phân tán) của tổ chức ACM
(Association for Computing Machinery) đã được đổi tên thành Giải thưởng Dijkstra
để vinh danh ông.

III. Định nghĩa Dijkstra
Thuật toán Dijkstra( mang tên của nhà khoa học máy tính người Hà Lan Edsger
Dijkstra vào năm 1956 và ấn bản năm 1959[1]) là một thuật toán giải quyết bài toán
đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng không có cạnh mang trọng
số âm. Thuật toán thường được sử dụng trong định tuyến với một chương trình con
trong các thuật toán đồ thị hay trong công nghệ Hệ thống định


5

TOÁN ỨNG DỤNG 2


GVHD: Vũ Thị Thái Linh

VI.Bài Toán Dijkstra
Cho đồ thị G với tập đỉnh V và tập các cạnh E (đồ thị có hướng hoặc vô hướng). Mỗi cạnh
của đồ thị được gán một nhãn (giá trị không âm), nhãn này còn được gọi là giá trị của cạnh.
Cho trước một đỉnh xác định v, gọi là đỉnh nguồn. Tìm đường đi ngắn nhất từ đỉnh v đến các
đỉnh còn lại của G. (Tức là tìm đường đi từ v đến các đỉnh còn lại với tổng các giá của các
cạnh trên đường đi là nhỏ nhất). Nếu như đồ thị có hướng thì đường đi này là đường đi có
hướng.

V.Thuật Toán Dijkstra : Ta có thể giải bài toán bằng cách xác định một tập
`V }. Sau đó tại mỗi bước ta sẽ thêm vào S các đỉnh mà khoảng cách từ nó đến v là ngắn nhất.
Với giả thiết rằng mỗi cung có một giá trị không âm thì ta luôn luôn tìm được một đường đi ngắn
nhất như vậy mà chỉ đi qua các đỉnh đã tồn tại trong S. Ðể dễ dàng chi tiết hóa giải thuật, giả sử
G có n đỉnh và nhãn trên mỗi cung được lưu trong mảng C, tức là C[i, j] bằng giá trị(có thể xem
là độ dài) của cung (i, j). Nếu i và j không có cung nối thì ta cho C[i, j] =Ġ. Ta sẽ dùng một mảng
D có n phần tử để lưu độ dài của đường đi ngắn nhất từ v đến mỗi đỉnh của đồ thị. Khởi đầu thì
giá trị này chính là độ dài cạnh (v, i), tức D[i] = C[v, i]. Tại mỗi bước của giải thuật thì D[i] sẽ
lưu độ dài đường đi ngắn nhất từ đỉnh v đến đỉnh i, đường đi này chỉ đi qua các đỉnh đã có trong
S.
Ðể cài đặt giải thuật dễ dàng, ta giả sử các đỉnh của đồ thị được đánh số từ 1 đến n và đỉnh nguồn
là đỉnh1.Dưới đây là giải thuật Dijkstra để giải bài toán trên :
procedure Dijkstra;
begin
S := [1] ; { S chỉ chứa đỉnh nguồn }
for i:=2 to n do
D[i] := C[1, i] ; { Khởi đầu các giá trị cho D }
for i:=1 to n - 1 do
begin
Lấy đỉnh w trong V - S sao cho D[w] là nhỏ nhất ;

Thêm w vào S ;
for mỗi đỉnh u thuộc V - S do
D[u] := Min (D[u], D[w] + C[w, u]) ;
end;
end;
Nếu muốn lưu trữ lại các đỉnh trên đường đi ngắn nhất để có thể xây dựng lại đường đi này từ
đỉnh nguồn đến các đỉnh khác, ta dùng một mảng P. Mảng này sẽ lưu P[u] = w với đỉnh u là đỉnh


6

TOÁN ỨNG DỤNG 2

GVHD: Vũ Thị Thái Linh

trước của đỉnh w trên đường đi ngắn nhất. Lúc khởi đầu ta cho P[u] = 1, với mọi u khác 1.
Giải thuật Dijkstra ở trên sẽ được viết lại như sau :
procedure Dijkstra ;
begin
S := [1] ; { S chỉ chứa đỉnh nguồn }
for i:=2 to n do
begin
D[i] := C[1, i] ; { Khởi đầu các giá trị cho D }
P[i] := 1 ; { Khởi đầu các giá trị cho P }
end ;
for i:=1 to n - 1 do
begin
Lấy đỉnh w trong V - S sao cho D[w] là nhỏ nhất ;
Thêm w vào S ;
for mỗi đỉnh u thuộc V - S do

if (D[w] + C[w, u] < D [u]) then
begin
D[u] := D[w] + C[w, u] ; P[u] := w ;
end ;
end;
end;
Ví dụ : Áp dụng giải thuật Dijkstra cho đồ thị hình sau:

Bước lặp

Đỉnh 1

Đỉnh 2

Đỉnh 3

Đỉnh 4

Đỉnh 5

Khởi tạo

O,1*

∞,1

∞,1

∞,1


∞,1

1

-

2,1

∞,1

1,1*

1,1

2

-

2,1

3,4

-

1,1*

3

-


2,1*

3,4

-

-


7

TOÁN ỨNG DỤNG 2

GVHD: Vũ Thị Thái Linh

4

-

-

3,4*

-

-

Viết lại

O,1


2,1

3,4

1,1

1,1

Mãng P có giá trị như sau :
p

1

2

3

4

5

0

2

3

1


1

từ kết quả trên ta có thể suy ra rằng đường đi ngắn nhất từ đỉnh 13 là từ 143 có độ dài
là 3

procedure DijksTra;
begin
t:=false;
t[u0]:=true;
d[i]:=c[u0,i];{Neu khong co duong di thi d[i]=i’}
k:=1;{Da ket nap duoc 1 dinh}
while kdo
begin
{Tim min}
min:=i’;
for i:=1 to n do
if (d[i]begin
u:=i;
min:=d[u]
end;


8

TOÁN ỨNG DỤNG 2

GVHD: Vũ Thị Thái Linh

t[u]:=true;{thêm u vao tập đỉnh}

inc(k);
{Tính lại đường đi}
for i:=1 to n do
if d[i]>d[u]+c[u,i] then
if not((d[i]=i’)and(d[u]=i’)and(c[u,i]=i’)) then
begin
d[i]:=d[u]+c[u,i];
truoc[i]:=u
end
end;
if d[v0]=i’ then
KhongCoDuongDi
else
QuayLaiMangTruocDeTimDuong
end;

Người thực hiện: Huỳnh Văn Ngọc
STT
1

Công việc
Họp nhóm:




Kết quả hoạt động
hoàn thành

Chọn dề tài

Phân tích nội dung đề tài
Phân tích thuật toán

2

Tìm tài liệu tham khảo

hoàn thành

3

Thực hiện code:

hoàn thành




4

Đóng góp ý kiến về code
Làm report tổng kết

Họp nhóm bàn về bài báo cáo:

(họp nhóm trên trên TV
trường)
hoàn thành



9

TOÁN ỨNG DỤNG 2




5

GVHD: Vũ Thị Thái Linh

Xây dựng dàn bài thuyết trình
Thông qua ý kiến của từng thành viên
Thống nhất các phần trong bài thuyết
trình

Phối hợp với nhóm hoàn thành

hoàn thành

bài thuyết trình
6

Báo cáo hoàn tất nộp cho giáo

hoàn thành

viên hướng dẫn

VI . MỤC LỤC

I. Lời Mở Đầu..........................................................................................................4
II. Nội Dung……….………………………………………………………………5


Tiểu Sử Dijkstra..………………………………………………………………..5

III.Định nghĩa Dijkstra…………………………………………7
IV. Bài Toán Dijkstra…………………………………………………………9

V. Thuật toán Dijsktra…………………………………………………….…..10

V.Mục Lục……………………………………………………….12


10

TOÁN ỨNG DỤNG 2

GVHD: Vũ Thị Thái Linh
NHẬN XÉT CỦA GIÁO VIÊN

………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………

………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………



×