Chơng 5 Bài toán “tìm đờng đi ngắn nhất giữa hai đỉnh của đồ

Một phần của tài liệu Luận văn ngôn ngữ lập trình visual basic và bài toán tìm đường đi ngắn nhất (Trang 31 - 34)

ngắn nhất giữa hai đỉnh của đồ thị “

Trong các ứng dụng thực tế, bài toán tìm đờng đi ngắn nhất giữa hai đỉnh của một đồ thị liên thông có một ý nghĩa to lớn. Chúng ta có thể lấy ví dụ nhiều bài toán thực tế quan trọng nh: bài toán chọn một hành trình tiết kiệm nhất (Theo tiêu chuẩn khoảng cách hoặc thời gian hoặc chi phí ) trên một mạng giao thông đờng bộ, đờng thuỷ, thậm chí giao thông đờng hàng không. Bài toán chọn một phơng pháp tiết kiệm nhất để đa một hệ động lực

từ trạng thái xuất phát đến một trạng thái đích, hay bài toán lập lịch thi công các công đoạn trong một công trình thi công lớn. Một bài toán mà ngày nay cũng rất cần giải quyết đó là bài toán lựa chọn đờng truyền tin với chi phí nhỏ nhất trong mạng thông tin …

Nói chung có vô cùng nhiều bài toán thực tế cần phải giải quyết nếu chúng ta áp dụng đợc bài toán tìm đờng đi ngắn nhất thì tiết kiệm đợc rất nhiều thứ nh tiền bạc cũng nh thời gian công sức...

Hiện nay có rất nhiều phơng pháp để giải các bài toán nh vậy. Mặc dầu vậy, thông thờng, các thuật toán đợc xây dựng dựa trên cơ sở lý thuyết đồ thị tỏ ra là các thuật toán có hiệu quả nhất. Trong chơng này chúng ta sẽ nghiên cứu thuật toán Dijkstra.

Trong trờng hợp trọng số trên các cung là không âm thuật toán Dijkstra giải bài toán tìm đờng đi ngắn nhất từ đỉnh S đến các đỉnh còn lại của đồ thị. Thuật toán Dijkstra làm việc hữu hiệu hơn rất nhiều thuật toán khác. Thuật toán đợc xây dựng dựa trên cơ sở gán cho các đỉnh các nhãn tạm thời. Nhãn của mỗi đỉnh cho biết cận trên của độ dài đờng đi ngắn nhất từ S đến nó. Các nhãn này sẽ đợc biến đổi theo một thủ tục lặp, mà ở mỗi một bớc lặp có một nhãn tạm thời trở thành nhãn cố định. Nếu nhãn của một đỉnh nào đó trở thành nhãn cố định thì nó sẽ cho ta không phải là cận trên mà là độ dài của đờng đi ngắn nhất từ đỉnh S đến nó. Thuật toán đợc mô tả cụ thể nh sau:

Procedure Dijkstra;

(*Đầu vào: Đồ thị có hớng G = (V,E) với n đỉnh.

s∈V là đỉnh xuất phát, a[u,v], u, v ∈ V, ma trận trọng số . Giả thiết: a[u,v]≥ 0 ,u, v∈V.

Truoc[v], v∈V, ghi nhận đỉnh đi trớc v trong đờng đi ngắn nhất từ s đến v *) Begin (*khởi tạo*) For v∈V do Begin D[v]:= a[s,v]; Truoc[v]:= s; End; D[s]:= 0; T:= V\{s}; (* T là tập các đỉnh có nhãn tạm thời *) (* Bớc lặp *) While T≠φ do Begin

Tìm đỉnh u ∈ T thoả mãn d[u]= min {d[z] : z∈ T}; T:= T\{u}; (*cố định nhãn của đỉnh u *)

For v∈ T do (*gán các nhãn lại cho các đỉnh trong T*) If d[v] > d[u] +a[u,v] then

Begin D[v] := d[u] + a[u,v]; Truoc[v] := u; End; End; End; Chú ý:

- Nếu chỉ cần tìm đờng đi ngắn nhất từ s đến một đỉnh t nào đó thì có thể kết thúc thuật toán khi đỉnh t trở thành có nhãn cố định .

- Đờng đi ngắn nhất xuất phát từ một đỉnh dễ dàng mô tả lại thuật toán cho trờng hợp đồ thị cho bởi danh sách kề. Để có thể giảm bớt khối l- ợng tính toán trong việc xác định u ở mỗi bớc lặp, có thể sử dụng thuật toán Heapsort để thu đợc thuật toán với độ phức tạp tính toán là O(m log n).

Một phần của tài liệu Luận văn ngôn ngữ lập trình visual basic và bài toán tìm đường đi ngắn nhất (Trang 31 - 34)