Thuật tốn quay lui (Back Tracking)

Một phần của tài liệu Giáo trình kỹ thuật lập trình 2 (Trang 45 - 47)

Thuật tốn quay lui dùng để giải quyết các bài tốn liệt kê các cấu hình. Phương pháp sinh trong phần trước cũng được giải quyết cho các bài tốn liệt kê khi nhận biết được cấu hình đầu tiên của bài tốn.

Tuy nhiên, khơng phải bất cứ cấu hình sinh kế tiếp nào cũng cĩ thể sinh một cách đơn giản từ cấu hình hiện tại. Do đĩ thuật tốn sinh kế tiếp chỉ giải quyết được cái bài tốn liệt kê đơn giản. Để giải quyết những bài tốn tổ hợp phức tạp, người ta dùng thuật tốn quay lui.

Nội dung chính của thuật tốn quay lui:

Xây dựng dần dần các thành phần của cấu hình bằng cách thử tất cả các khả năng cĩ thể xảy ra. Giả sử cấu hình cần liệt kê cĩ dạng x = (x1, x2,..,xn) khi đĩ thuật tốn quay lui thực hiện qua các bước:

1. Xét tất cả những giá trị cĩ thể cĩ của x1, thử cho x1 nhận lần lượt các giá trị đĩ. Với mỗi giá trị thử gán cho x1 ta sẽ làm tiếp như sau:

2. Xét tất 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ị x2 ta lại xét lần lượt những giá trị của x3... cứ tiếp tục như vậy cho đến bước n.

3. Xét giá trị cĩ thể nhận cho xn, thử cho xn lần lượt nhận những giá trị đĩ, thơng báo những cấu hình tìm được như (x1, x2,..., xn).

Tĩm lại thuật tốn quay lui liệt kê các cấu hình n phần tử dạng x = (x1, x2,.., xn) bằng cách thử cho x1 nhận lần lượt các giá trị cĩ thể được. Với mỗi giá trị thử gán cho x1 thì bài tốn trở thành liệt kê tiếp cấu hình n-1 phần tử x = (x2, x3,.., xn).

Khả năng chọn x2 với x

1 đã chọn

Khả năng chọn x3 với x1

Hình 3.1: Liệt kê các lời giải theo thuật tốn quay lui.

Mơ hình chung của thuật tốn quay lui xác định thành phần thứ i được mơ tả tổng quát như sau: (thuật tốn này thử cho xi nhận lần lượt những giá trị mà nĩ cĩ thể nhận).

void Try(int i) {

for <mọi giá trị v cĩ thể gán cho x[i]> do {

<Thử cho x[i] bằng giá trị v>

if <x[i] là phần tử cuối cùng trong cấu hình hoặc i==n> then <Thơng báo cấu hình tìm được>

else {

<Ghi nhận việc cho x[i] nhận giá trị v (nếu cần thiết)>

Try(i+1); // gọi đệ quy cho tiếp chi x[i+1].

<Nếu cần thì bỏ ghi nhận việc thử x[i]:= v để thử giá trị khác> }

} }

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

Gốc Khả năng chọn x1 Khả năng chọn x 2 với x1 đã chọn Khả năng chọn x 3 với x 1 và x2 đã chọn

Một phần của tài liệu Giáo trình kỹ thuật lập trình 2 (Trang 45 - 47)