6. Tổng quan tài liệu tham khảo
3.1.3 phức tạp của thuật toán
Ta tiến hành tính toán độ phức tạp của bài toán như sau: Thủ tục rút gọn:
i) Khởi tạo : Sum := 0 ; (ii) Rút gọn dòng :
Với mỗi dòng r từ 1 đến n của ma trận C thực hiện : - Tìm phần tử crj = α nhỏ nhất trên dòng.
- Trừ tất cả các phần tử trên dòng đi một lượng α. - Cộng dồn : Sum := Sum + α
(iii) Rút gọn cột :
Với mỗi cột c từ 1 đến n của ma trận C thực hiện : - Tìm phần tử cic = α nhỏ nhất trên cột.
- Trừ tất cả các phần tử trên cột đi một lượng α. - Cộng dồn : Sum := Sum + α
Độ phức tạp tính toán thời gian T1(n): ( ) 2 ( )2 1 1 1 1 1 n n n r j r T n n n O n = = = =∑∑ ∑= = =
Gọi T2(n) là độ phức tạp tính toán thời gian của rút gọn cột. Gọi câu lệnh đặc trưng là tìm phần tử crj = α nhỏ nhất trên cột. Độ phức tạp tính toán thời gian T2(n):
( ) 2 ( )2 1 1 1 1 1 n n n i c i T n n n O n = = = =∑∑ ∑= = =
Gọi T(n) là độ phức tạp tính toán thời gian của Thủ tục rút gọn. Áp dụng công thức Max, ta có:
T(n) = Max(T1(n), T2(n)) = O(n2). Thủ tục chọn cạnh phân nhánh (r,s):
(i) Khởi tạo : α := - ∞;
(ii) Với mỗi cặp (i,j) thoả cij = 0 (i=1,...,k; j=1,...,k) thực hiện - Xác định
minr = min{cih : h ≠ j } mins = min{chj : h ≠ i } - Nếu α < minr + mins , đặt
α := minr + mins; r := i; s := j;
Gọi T(n) là độ phức tạp tính toán thời gian của thủ tục chọn cạnh phân nhánh. Gọi câu lệnh đặc trưng là xác định phần tử nhỏ nhất trên hàng hoặc cột.
Độ phức tạp tính toán thời gian của T(n) là:
( ) 2 3 ( )3 1 1 1 1 1 1 1 n n n n n n i j h i j i T n n n n O n = = = = = = =∑∑∑ ∑∑ ∑= = = =
Thuật toán nhánh cận giải bài toán người du lịch: Edges: Số cạnh trong hành trình bộ phận
A: Ma trận chi phí tương ứng với kích thước N * N Cost: Chi phí hành trình bộ phận
MinCost: chi phí của hành trình tốt nhất đã tìm được Reduce(A, N): Thủ tục rút gọn
BestEdge(A, N, r, c, beta): Thủ tục chọn cạnh phân nhánh Procedure TSP(edges, cost, C)
Begin
Cost := Cost + Reduce(A, N-edges); If Cost < MinCost then
If edges = N – 2 then Begin
<Bổ sung nốt hai cạnh còn lại> MinCost := Cost;
<Ghi nhận hành trình tốt nhất> End
Else Begin
BestEdge(A, N-edges, r, c, beta); LowerBound := Cost + beta;
<Ngăn cấm tạo thành hành trình con> NewA := <A loại bỏ dòng r cột c>
TSP(edges+1, cost, NewA); < Đi theo nhánh trái> <Khôi phục A bằng cách bổ sung lại dòng r cột c> If LowerBound < MinCost then
Begin <Đi theo nhánh phải> A[r, c] := ∞;
End; End;
<Khôi phục ma trận A> End;
Gọi T(n) là độ phức tạp tính toán thời gian của bài toán TSP
Bài toán thực hiện N-2 lệnh gọi TSP. Mỗi TSP có hai thủ tục chính là Reduce và BestEdge.
Vì 2 thủ tục này thực hiện ở nhánh khác nhau. Do vậy, độ phức tạp tính toán thời gian của mỗi TSP là:
Áp dụng công thức max, ta có:
TTSP = Max(TReduce, TBestEdge) = Max(O(n2), O(n3)) = O(n3). Vậy độ phức tạp tính toán thời gian của bài toán TSP là:
O(K * N * N3) K là số lần có thể phân nhánh, 0 <= K <= N2