Skip to main content

Thuật toán quay lui

1. Khái niệm

Thuật toán quay lui dùng để giải bài toán liệt kê các cấu hình. Mỗi cấu hình được xây dựng bằng cách xây dựng từng phần tử, mỗi phần tử được chọn bằng cách thử tất cả các khả năng.

ba-state-space-tree.png

2. Phương pháp thực hiện

Giả thiết cấu hình cần liệt kê có dạng (x1, x2,…, xn). Khi đó thuật toán quay lui thực hiện qua các bước sau:

Bước 1: Xét tất cả các giá trị x1 có thể nhận, thử cho x1 nhận lần lượt các giá trị đó. Với mỗi giá trị thử gán cho x1 sẽ thực hiện bước tiếp theo.

Bước 2: Xét tất cả các giá trị x2 có thể nhận, lại thử cho x2 nhận lần lượt các giá trị đó. Với mỗi giá trị thử gán cho x2 lại xét tiếp các khả năng chọn x3 … cứ tiếp tục như vậy đến bước n.

Bước n: Xét tất cả các giá trị xn có thể nhận, thử cho xn nhận lần lượt các giá trị đó, thông báo cấu hình tìm được (x1, x2, …, xn).

Trên phương diện quy nạp, có thể nói rằng thuật toán quay lui liệt kê các cấu hình n phần tử dạng (x1, x2, .., xn) bằng cách thử cho x1 nhận lần lượt các giá trị có thể. Với mỗi giá trị thử gán cho x1 lại liệt kê tiếp cấu hình n - 1 phần tử (x2, x3, …, xn).

3. Cài đặt thuật toán

Thuật toán quay lui sẽ bắt đầu bằng lời gọi Try(1)

{Thủ tục này thử cho xi nhận lần lượt các giá trị mà nó có thể nhận}
procedure Try(i: Integer);
begin
	for (mọi giá trị V có thể gán cho xi) do
		begin
			<Thử cho xi := V>;
			if (xi là phần tử cuối cùng trong cấu hình) then
				<Thông báo cấu hình tìm được>
			else
			begin
				<Ghi nhận việc cho xi nhận giá trị V (Nếu cần)>;
				Try(i + 1); {Gọi đệ quy để chọn tiếp xi+1}
				<Nếu cần, bỏ ghi nhận việc thử xi := V, để thử giá trị khác>;
			end;
		end;
end;