Một số hàm và thủ tục trong chương trình

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán dijkstra fibonacci heap, thuật toán ACO tìm đường đi tối ưu và ứng dụng (Trang 57 - 61)

Thủ tục Enter: Thủ tục này có nhiệm vụ đọc dữ liệu từ tệp input, sau khi thực hiện thủ tục này số đỉnh của đồ thị được lưu trong biến n, số cung

lưu trong biến m. Đồ thị được lưu trữ dưới dạng danh sách kề như sau:

Với mỗi đỉnh i thì các đỉnh kề với i được xác định thông qua head[i],

nếu h[i] = k  0 thì adj[k]. v là đỉnh kề thứ nhất của i. Địa chỉ của đỉnh kề tiếp

theo của i là adj[k].link: Nếu adj[k].link = k1 0 thì đỉnh kề thứ 2 của i là

adj[k1].v. Quá trình tìm đỉnh kề với i kết thúc khi địa chỉ tìm được bằng 0.

Như vậy nếu ngay từ đầu head[i] = 0 thì danh sách kề của i bằng rỗng, nghĩa là từ i không có cung nối tới bất kỳ đỉnh nào cả.

Thủ tục INSERT(var x, minH:tro): Thủ tục này chèn một nút mới được trỏ bởi con trỏ x vào Fibonacci heap được trỏ bởi minH. Trong thủ tục này x

minH đều là các tham số hình thức (khi gọi thủ tục thì tham số hình thức

phải thay bằng các biến tương ứng).

Thủ tục FIB_HEAP_LINK(var y, x:tro): Biến gốc y (được trỏ bởi con trỏ y) làm con của gốc x (y và x đều là các tham số hình thức).

Thủ tục CUT(var minH, x, y : tro): Đưa nút x ra khỏi danh sách con

của nút y, biến x thành một gốc. MinH, x, y đều là các tham số hình thức. Thủ tục CASCADING_CUT(var minH, y : tro): Thủ tục cắt liên hoàn như đã trình bày ở chương 1.

Thủ tục FIB_HEAP_DECREASE_KEY(var minH, x: tro; k: longint): Thủ tục này sẽ thay x^.key bằng một giá trị mới nhỏ hơn là k, nếu k nhỏ hơn khóa của nút y là cha của x thì sẽ cắt nhánh cây gốc x bằng thủ tục CUT(x, y).

Thủ tục Consolidate(var minH : tro): Thủ tục này sẽ thống nhất danh sách gốc, nghĩa là sẽ ghép hai gốc có cùng số con thành một gốc, việc này sẽ được lặp cho đến khi không tồn tại hai gốc có số nút con bằng nhau.

Thủ tục FIB_HEAP_EXTRACT_MIN(var z : tro): Thủ tục này thực hiện xóa nút cực tiểu ra khỏi H, đồng thời thực hiện việc thống nhất các gốc đã bị trì hoãn ở các phép toán khác. Đoạn mã nguồn sau mô tả thủ tục FIB_HEAP_EXTRACT_MIN

procedure FIB_HEAP_EXTRACT_MIN(var z : tro); // input: Fibonacci heap H.

//output: Nút có khóa cực tiểu của H. var x, tam, tt, tam2 : tro;

i: longint; begin z := minH; if z <> NIL then begin nH := nH - 1; x:= z^.child;

if x <> nil then // biến các con của z thành gốc begin

tam := x;tam^.parent := nil; while tam^.right <> x do begin tam := tam^.right; tam^.parent := nil; end; x^.left^.right := minH^.right;

minH^.right^.left := x^.left; minH^.right := x;

x^.left := minH; end;

z^.right^.left := z^.left; // gỡ z khỏi danh sách gốc z^.left^.right := Z^.right;

if z = z^.right then // Fibonacci heap chỉ có duy nhất mình nút z minH := NIL

else minH := z^.right;

if (minH <> nil) and (minH <> minH^.right) then Consolidate(minH);

end

else writeln('dong rong'); end;

Hàm Relax(u, v: longint; w: longint): Hàm này trả lại giá trị true nếu nhãn khoảng cách từ s đến v lớn hơn khoảng cách từ s đến u cộng với khoảng cách trực tiếp từ u đến v. Ngoài ra khi hàm có giá trị là true thì đỉnh u được ghi nhận là đỉnh đứng ngay trước v trên đường đi ngắn nhất từ s đến t.

Thủ tục Dijkstra Fibonacci heap có thể viết lại như sau:

Procedure Dijkstra; // input: Đồ thị có hướng G, s, t. // output: Khoảng cách từ s đến t. var j, i: longint; tt, tam, ta : tro; begin repeat u:= nil; FIB_HEAP_EXTRACT_MIN(u);

if (u = nil) or (u^.sohieu = t) then Break;

i := head[u^.sohieu]; while i <> 0 do begin

if Relax(u^.sohieu, adj[i].v, adj[i].w) then

FIB_HEAP_DECREASE_KEY(minH,d[adj[i].v], d[u^.sohieu]^.key +adj[i].w); i := adj[i].link;

end;

until (u = nil) or (nh = 0); end;

Thủ tục Init: Thủ tục này tạo ra một Fibonacci heap gồm N nút, được quản lý bởi biến toàn cục minH.

Thủ tục PrintResult: Đưa ra output.

3.1.6.Sơ đồ thuật toán

Sơ đồ thuật toán giải bài toán tìm đường đi ngắn nhất có dạng sau:

// input: Đồ thị có hướng G, s, t.

// output: Khoảng cách và đường đi từ s đến t. BEGIN Enter; Init; dijkstra; PrintResult; END.

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán dijkstra fibonacci heap, thuật toán ACO tìm đường đi tối ưu và ứng dụng (Trang 57 - 61)

Tải bản đầy đủ (PDF)

(74 trang)