Tải bản đầy đủ (.doc) (63 trang)

Giải thuật DiJkstra cho Sortest path Routing

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 (614.95 KB, 63 trang )

Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
PHẦN 2:
TRÌNH BÀY ĐỀ TÀI NGHIÊN CỨU
ỨNG DỤNG THUẬT TOÁN DIJKSTRA
TRONG SHORTEST PATH ROUTING
Mô tả đề tài và vấn đề liên quan
Định tuyến trong mạng thông tin:
Định tuyến (routing):
Định tuyến là quá trình chọn lựa các đường đi trên một mạng máy tính để gửi
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) ở chỗ trong nhiệm vụ của nó thì các cấu
trúc địa chỉ gợi nê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.
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à
chi phí (hay 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 chi phí thấp nhất (là tổng
các chi phí 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à chi phí trực tiếp để đi đến đó (thông
tin, danh sách của các đích, tổng chi phí của từng node, và bước kế tiếp để gửi dữ liệu
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
đế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 kì điều gì cải thiện được những thông tin chúng đang có sẽ được đưa
vào các 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 để 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 LSAs này để tạo ra topological
database, sử dụng giải thuật SPF (Short Path First) để 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 tới tất cả
các router trên 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, trng đó 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ó
chi phí 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 bất kì node khác trên mạng.
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.
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
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.
Danh sách các giao thức định tuyến:
Giao thức định tuyến trong:
Router Information Protocol (RIP).
Open Shortest Path First (OSPF).
Intermediate System to Intermediate System (IS-IS).
Interior Gateway Routing Protocol (IGRP) (thuộc sở hữu của Cisco).
Enhanced IGRP (EIGRP) (thuộc sở hữu của Cisco).
Giao thức định tuyến ngoài:
Exterior Gateway Protocol (EGP).
Border Gateway Protocol (BGP).
Constrained Shortest Path First (CSPF).
Lý thuyết Graph:
Một Graph G, được định nghĩa bởi tập các đỉnh V và tập hợ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à các liên
kết và chúng diễn biến phương tiện truyền thông. Graph có thể được biểu diễn như sau:
G=(V,E)

Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing

Hình 1.Một Graph đơn giản.
Mặc dù 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ông thường V là tập hợp xác định khác rỗng, nghĩa là có thể biểu diễn
V={v |i=1,2,…,N}
Trong đó N là số lượng nút. Tương tự E được biểu diễn :
E={e |i=1,2,…,M}
Một liên kết, e 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 e giữa nút i và k bởi :
e=(v,v) hoặc e=(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 hya 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ể được xem như là một cung và được định nghĩa :
a=[v,v] hoặc a=[i,k].
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 goi 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 có
các thuộc tính (chẳng hạn 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.
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
Một graph có các liên kết gọi là graph vô hướng, tuy nhiên một graph vô
hướng, tuy nhiê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á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 đó và chính nút đó.
Những liên kết đó được gọi là các self loop. Một graph không có các liên kết song song
hoặc các self loop gọi là một graph đơn giản.
Lý thuyết nghiên cứu
Định tuyến đường dẫn ngắn nhất (Shortest Path Routing):
Bài toán tìm đường đi ngắn nhất là một bài toán khá 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. Trong khi các thuật toán thiết kế thì cố gắng tìm kiếm
cách tạo ra các mạng thỏa mãn tiêu chẩn độ dài đường đi.
Bài toán đơn giản nhất của loạ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.
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. 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 được giả sử là rất lớn (chẳng hạn lớn gấp n lần độ dài cung lớn nhất
trong mạng). 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 là dương hoàn
toàn; sau đó giả thiết này có thể được thay đổi.
Phần lớn các mạng chuyển mạch gói sử dụng các thuật toán khác nhau của
phương pháp chọn tuyến đường ngắn nhất do lớp mạng thực hiện. Một số mạng chọn
tuyến theo cách thức tập trung, thiết lập đường dẫn giữa nút nguồn và nút đích ở trung
tâm điều hành mạng NMC (Network Management Center) hay trung tâm điều khiển
Ứng dụng thuật toán Dijkstra

trong Shortest Path Routing
chọn tuyến RCC (Routing Control Center) rồi sau đó phân phối các thông tin chọn
tuyến đến tất cả các nút chuyển mạch trong mạng. Các nút mạng khác sử dụng cách
thức phi tập trung hay còn gọi là cách thức phân bố, từng nút trao đổi thông tin chọn
tuyến và giá thành với các nút khác trong mạng trên cơ sở tương tác cho đến khi các
bảng định tuyến đáp ứng được yêu cầu định tuyến ngắn nhất.
Thuật toán Dijkstra:
Tất cả các thuật toán tìm đường đi ngắn nhất đều dựa vào việc lồng nhau giữa
các đường đi ngắn nhất nghĩa là 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 đườ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 sau:
d = (d + d)

Hình 2. 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. Khó khăn của cách tiếp cận
này 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
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 cách thiết lập
d = 0 và d = ∞ ∀ i ≠ j
Sau đó thiết lập
d ← l ∀ j là nút kề cận của i
Sau đó tìm nút j có d là bé nhất. Tiếp đó lấy chính nút j vừa chọn để khai triển
các khoảng cách các nút khác, nghĩa là bằng cách thiết lập
d ← min(d, d + l)
Tại mỗi giai đoạn của quá trình, giá trị của d 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 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.

Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
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 l đề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ác trọng số tương
ứng với giá thành 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ị. Để 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ư giá thành 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 3. 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à giá thành đã cho giữa 2 nút i và j. Thuật toán gồm
2 bước:
1.Bước khởi đầu
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
Đặ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)=l(l,v), với các nút không nối trực tiếp với nút l ta coi giá thành 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)]

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 thống kê sau:
Bước Tập N D(2) D(3) D(4) D(5) D(6)
0 {1} 2
∞ ∞ ∞
5
1 {1,2} 2 3
∞ ∞
3
2 {1,2,3} 2 3 4 5 3
3 {1,2,3,6} 2 3 4 5 3
4 {1,2,3,6,4} 2 3 4 5 3
5 {1,2,3,6,4,5} 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 vẽ sau:
Hình 4.Mô hình đường dẫn ngắn nhất.
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
Đích Nút tiếp theo
2 2
3 3
4 4
5 5
6 3
Hình 5.Bảng chọn tuyến cho nút 1.
Với thuật toán này ta có thể tính được các tuyến đường có đườ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ó.
Xây dựng và thiết kế chương trình minh họa thuật
toán Dijkstra
Xây dựng c hương trình cơ bản tìm đường đi ngắn nhất bằng
thuật toán Dijkstra:
Viết bằng ngôn nữa C:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define filein “Dijkstra.inp”
#define fileout “Dijkstra.out”
#define NMAX 100
#define MAX 1000
int n,s,t;
int c[NMAX][NMAX];
int Previous[NMAX];
bool Free[NMAX];
int d[NMAX];
void Input_data(){
int i,j;
FILE *fp;
fp=fopen(filein,”r”);
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
fscanf(fp,”%d%d%d”,&n,&s,&t);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
fscanf(fp,”%d”,&c[i][j]);
if(c[i][j]==0) c[i][j]=MAX;

}
}
fclose(fp);
}
void Init(){
int v;
for(v=1;v<=n;v++){
d[v]=c[s][v]; //Khởi tạo giá trị đầu minpath từ s đến v là v=c[s][v]
//Đánh dấu
Previous[v]=s;
//Tất cả các đỉnh đều ở trạng thái tự do
Free[v]=true;
}
//cố định s
Previous[s]=0;
d[s]=0;
Free[s]=false;
}
void Dijkstra(){
int u,v,minp;
//thực hiện trong khi t còn tự do
While(Free[t]){
minp=MAX;
//Tìm trong tập T ra đỉnh u có d[u] min. Chú ý T là tập hợp các đỉnh chưa
//có đính nhãn
for(v=1;v<=n;v++){
if(Free[v]&&(minp>d[v])){
minp=d[v];
u=v;
}

}
//Sau khi tìm được đỉnh u thì ta cố định đỉnh u
Free[u]=false;
//Dùng đỉnh u để tối ưu hóa các đỉnh trong T
if(Free[t]){
for( v=1;v<=n;v++){
if(Free[v]&&(d[u]+c[u][v]<d[v])){
//Sửa lại nhãn của v
d[v]=d[u]+c[u][v];
//Lưu vết
Previous[v]=u;
}
}
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
}
}
}
Void Output_data(){
Int i;
FILE *fp;
fp=fopen(fileout,”w”);
fprintf(fp,”+Duong di ngan nhat tu %d den %d la: \n”,s,t);
fprintf(fp,”%d<=”,t);
i=Previous[t];
while(i!=s){
fprintf(fp,”%d<=”,i);
i=Previous[i];
}
fprintf(fp,”%d”,s);

fprintf(fp,”\n+Do dai duong di ngan nhat la: %d”,d[t]);
fclose(fp);
}
Thiết kế phần mềm minh họa thuật toán Dijkstra:
Sử dụng bộ công cụ Eclipse lập trình với Java.
Class Options:
Class Options chứa các Button để thực hiện việc vẽ các đỉnh, các cạnh (chi phí),
sửa, xóa, chạy thực thi thuật toán Dijkstra.
package Dijkstra3;
import java.awt.Button;
import java.awt.Event;
import java.awt.GridLayout;
import java.awt.Panel;
class Options extends Panel {
/**
*
*/
private static final long serialVersionUID = 1L;
// Dat cac Options ben trai man hinh ung dung
Button b1 = new Button("Clear");
Button b2 = new Button("Run");
Button b3 = new Button("Step");
Button b4 = new Button("Reset");
Button b5 = new Button("Example");
Button b6 = new Button("Exit");
Button b7 = new Button("About");
GraphAlgorithm parent;
boolean Locked=false;

Ứng dụng thuật toán Dijkstra

trong Shortest Path Routing
Options(GraphAlgorithm myparent) {
parent = myparent;
setLayout(new GridLayout(7, 1, 0, 10));
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b7);
add(b6);
}
public boolean action(Event evt, Object arg) {
if (evt.target instanceof Button) {
//Neu la JButton "Step" va Unlock thi thuc hien buoc dau tien
va hien thi "Nextstep" len JButton,
//nguoc lai thi khong thuc hien
if (((String)arg).equals("Step")) {
if (!Locked) {
b3.setLabel("Next step");
parent.graphcanvas.stepalg();
}
else parent.documentation.doctext.showline("locked");
}

//Neu la JButton "Nextstep" thi thuc hien buoc tiep thep
if (((String)arg).equals("Next step")){
parent.graphcanvas.nextstep();
}


//Neu la JButton "Reset" thi thuc hien reset
if (((String)arg).equals("Reset")) {
parent.graphcanvas.reset();
b3.setLabel("Step");
parent.documentation.doctext.showline("all items");
}

//Neu la JButton "Clear" thi xoa graphics
if (((String)arg).equals("Clear")) {
parent.graphcanvas.clear();
b3.setLabel("Step");
parent.documentation.doctext.showline("all items");
}

//Neu la JButton "Run" va Unlock thi thuc hien tung buoc mac
dinh
//nguoc lai thi khong thuc hien
if (((String)arg).equals("Run")) {
if (!Locked)
parent.graphcanvas.runalg();
else parent.documentation.doctext.showline("locked");
}

//Neu la JButton "Example" va Unlock thi thuc hien default
graphics
//nguoc lai thi khong thuc hien
if (((String)arg).equals("Example")) {
if (!Locked)
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing

parent.graphcanvas.showexample();
else parent.documentation.doctext.showline("locked");
}

//Neu la JButton "About" thi hien thi dialog About
if(((String)arg).equals("About")){
dialog dig = new dialog();
}

//Neu la JButton "Exit" thi thoat khoi chuong trinh
if (((String)arg).equals("Exit")) {
System.exit(0);
}
}
return true;
}

public void lock() {
Locked=true;
}
public void unlock() {
Locked=false;
b3.setLabel("Step");
}
}
Class Documentation:
Class Documentation chứa document hướng dẫn sử dụng chương trình và các
chỉ dẫn cùng với việc minh họa chi phí giữa các đỉnh trong quá trình chạy thực hiện
giải thuật Dijkstra.
package Dijkstra3;

import java.awt.BorderLayout;
import java.awt.Choice;
import java.awt.Event;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
class Documentation extends Panel {
// Documentaion huong dan o phia tren man hinh ung dung
DocOptions docopt = new DocOptions(this);
DocText doctext = new DocText();
Documentation() {
setLayout(new BorderLayout(10, 10));
add("West", docopt);
add("Center", doctext);
}
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
}
class DocOptions extends Panel {
//Tao Choice huong dan ben trai man hinh ung dung
Choice doc = new Choice();
Documentation parent;

DocOptions(Documentation myparent) {
setLayout(new GridLayout(2, 1, 5, 0));
parent = myparent;
add(new Label("DOCUMENTATION:"));
doc.addItem("draw nodes");
doc.addItem("remove nodes");

doc.addItem("move nodes");
doc.addItem("the startnode");
doc.addItem("draw arrows");
doc.addItem("change weights");
doc.addItem("remove arrows");
doc.addItem("clear / reset");
doc.addItem("run algorithm");
doc.addItem("step through");
doc.addItem("example");
doc.addItem("about");
doc.addItem("exit");
doc.addItem("all items");
add(doc);
}

public boolean action(Event evt, Object arg) {
//Ham xu ly Choice
if (evt.target instanceof Choice) {
String str=new String(doc.getSelectedItem());
parent.doctext.showline(str);
}
return true;
}
}
class DocText extends TextArea {
//TextDocumentation huong dan cho cac Choice va JButton
final String drawnodes = new String("DRAWING NODES:\n"+
"Draw a node by clicking the mouse on the screen
application.\n\n");


final String rmvnodes = new String("REMOVE NODES:\n"+
"To remove a node press <ctrl> and click on the node.\n"+
"You can not remove the startnode.\n"+
"Select another startnode, then you can remove the node.\n\n");

final String mvnodes = new String("MOVING NODES\n"+
"To move a node press <Shift>, click on the node,\nand drag it
to"+
" its new position.\n\n");

final String startnode = new String("STARTNODE:\n"+
"The startnode is blue, other nodes are grey.\n"+
Ứng dụng thuật toán Dijkstra
trong Shortest Path Routing
"The first node you draw on the screen will be the startnode.\n"+
"To select another startnode press <ctrl>, click on the
startnode,\n"+
"and drag the mouse to another node.\n"+
"To delete the startnode, first select another startnode, and
then"+
"\nremove the node the usual way.\n\n");

final String drawarrows = new String("DRAWING ARROWS:\n"+
"To draw an arrow click mouse in a node,"+
"and drag it to another node.\n\n");

final String weight = new String("CHANGING WEIGHTS:\n"+
"To change the weight of an arrow, click on the arrowhead and
drag\n"+
"it along the arrow.\n\n");


final String rmvarrows = new String("REMOVE ARROWS:\n"+
"To remove an arrow, change its weight to 0.\n\n");

final String clrreset = new String("<CLEAR> BUTTON: "+
"Remove the current graph from the screen.\n"+
"<RESET> BUTTON: "+
"Remove the results of the algorithm from the graph,\n"+
" and unlock screen.\n\n");

final String runalg = new String("<RUN> BUTTON: "+
"Run the algorithm on the graph, there will be a time\n" +
"delay of +/- 1 second between steps.\n"+
"To run the algorithm slower, use <STEP>.\n");

final String step = new String("<STEP> BUTTON: " +
"An opportunity to step through the algorithm.\n");

final String example = new String("<EXAMPLE> BUTTON: "+
"Displays a default graph on the screen for you.\n"+
"You can then use <STEP> or <RUN>\n");

final String exitbutton = new String("<EXIT> BUTTON: " +
"Only works if applet is run with appletviewer.\n");

final String aboutbutton = new String("<ABOUT> BUTTON: " +
"Show about Dijkstra program information.\n");

final String toclose = new String("ERROR: "+
"This position is to close to another node/arrow.\n");


final String done = new String("Algorithm has finished, " +
"follow green arrows from startnode to any node "+
"to get\nthe shortest path to " +
"the node. The length of the path is written in the node.\n" +
"press <RESET> to reset the graph, and unlock the screen.");

final String some = new String("Algorithm has finished, " +
"follow green arrows from startnode to any node "+
"to get\nthe shortest path to " +
"the node. The length of the path is written in the node.\n" +
"There are no paths from the startnode to any gray node.\n" +
"press <RESET> to reset the graph, and unlock the screen.");

×