Thuật toán tổng quát giải bài toá n2

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 64 - 67)

Thuật toán tổng quát giải bài toán 2 gồm hai bước cơ bản sau:

Bước 1: Xây dựng đồ thị G1 = (V1, E1) như sau:

V1 gồm k +1 đỉnh của đồ thị đã cho là s và k đỉnh cố định phải đi qua

theo yêu cầu của bài toán.

E1 được xây dựng như sau: Hai đỉnh i, j thuộc E1 thì trọng số của cung (i, j) là C(i,j) = D(i,j), trong đó D(i,j) là khoảng cách từ i đến j trên đồ thị G đã cho.

Để cha ̣y được với N, M lớn ta sẽ dùng Dijkstra Fibonacci heap để tính D(i, j).

Bước 2: Dùng thuật toán ACO (MMAS) tìm chu trình xuất phát từ s đi

qua mỗi đỉnh đúng một lần trên đồ thị G1 (việc làm này chính là giải bài toán người chào hàng trên đồ thị G1).

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

Chương trình sử dụng thuật toán Dijkstra Fibonacci heap nên các thủ tục thực hiện các thao tác đối với Fibonacci heap như đã trình bày trong mục

3.1.5 cũng được sử dụng trong chương trình giải bài toán 2. Ngoài ra chương trình còn sử dụng thêm một số thủ tục sau:

Thủ tục Make_graph: Xây dựng đồ thị G1. Thủ tục này hoạt động

như sau: Từ mỗi đỉnh u trên đồ thị G1 ta dùng thủ tục Dijkstra Fibonacci heap tìm khoảng cách từ đỉnh đó đến tất cả các đỉnh còn lại trên đồ thị G, từ đó ta cũng tính được khoảng cách từ u đến các đỉnh trên G1.

Đoạn mã chương trình dưới đây mô tả thủ tục Make_graph:

procedure make_graph;

// input: Đồ thị G. Output: đồ thị G1. var i:integer;

begin

for i:= 1 to k1 + 1 do

for j := 1 to k1 + 1 do c[i,j] := vocung; for i := 1 to k1+1 do begin init(tendinh[i]); dijkstra(tendinh[i]); for j:= 1 to k1 + 1 do if i = j then c[i,j] := vocung

else c[i,j] := d[tendinh[j]]^.key; end;

end;

Thủ tục tkcb: Thủ tục này dùng để tìm một chu trình trong G1 bằng

Thủ tục lotteryweel(k : longint): Thủ tục này chính là Thủ tục chọn

ngẫu nhiên đã trình bày ở chương 2, thủ tục này cho phép xác định đỉnh kế

tiếp sẽ đi khi một con kiến đang ở đỉnh k.

Thủ tục pheromoneupdat: Cập nhật lại vết mùi như đã trình bày ở chương 2.

Thủ tục init1: Khởi tạo vết mùi và giá trị ban đầu cho một số đại lượng.

Thủ tục MMAS_cycle: Thủ tục này dùng để tìm chu trình ngắn nhất trong G1, xuất phát từ s thỏa mãn yêu cầu của bài toán. Đoạn mã nguồn dưới đây mô tả thủ tục MMAS_cycle:

procedure MMAS_cycle; var l: int64;d : longint; s:real; Begin init1; repeat inc(buoclap); for i:= 1 to m do begin libest := vocung; w[1] :=1; fillchar(daxet,sizeof(daxet),false); fillchar(p,sizeof(p),0); daxet[1] := true; l:= 0; for j:= 2 to n do begin lotteryWheel(j);

l := l + c[w[j-1],w[j]]; end; l := l + c[w[n],1]; if l< libest then begin libest := l; ibest := w; end; end;

if libest < lgbest then begin lgbest := libest; gbest := ibest; tmax:= m/lgbest; tmin:= tmax/10; end; pheromoneupdat; until (buoclap >= N_C); 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 64 - 67)

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

(74 trang)