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.. Trong các đóng góp
Trang 1ĐỀ 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
Trang 2I 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à
Trang 3self-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ề
Trang 4khoa 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
Trang 5VI.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
Trang 6trướ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
Trang 7-4 - - 3,4* -
Mãng P có giá trị như sau :
từ kết quả trên ta có thể suy ra rằng đường đi ngắn nhất từ đỉnh 13 là từ 143 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]<MIN)and(not t[i])then
begin
u:=i;
min:=d[u]
end;
Trang 8t[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
1 Họp nhóm:
• Chọn dề tài
• Phân tích nội dung đề tài
• Phân tích thuật toán
hoàn thành
2 Tìm tài liệu tham khảo hoàn thành
3 Thực hiện code:
• Đóng góp ý kiến về code
• Làm report tổng kết
hoàn thành (họp nhóm trên trên TV
trường)
4 Họp nhóm bàn về bài báo cáo: hoàn thành
Trang 9• 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
5 Phối hợp với nhóm hoàn thành bài thuyết trình
hoàn thành
6 Báo cáo hoàn tất nộp cho giáo viên hướng dẫn
hoàn thành
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
Trang 10NHẬN XÉT CỦA GIÁO VIÊN
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………