Thuật toán quay lui đơn giản

Một phần của tài liệu (LUẬN văn THẠC sĩ) lập trình ràng buộc với bài toán về hỗ trợ phân luồng giao thông (Trang 26 - 27)

Thuật toán cơ bản để tìm kiếm nghiệm là thuật toán quay lui đơn giản, nó chính là một chiến lược tìm kiếm tổng quát và được dùng rộng rãi trong việc giải các bài toán ràng buộc. Trong trường hợp cụ thể của CSPs, thao tác cơ bản là chọn một biến tại một thời điểm và xét một giá trị cho nó, đảm bảo rằng nhãn được chọn đó sẽ phù hợp với tất cả các nhãn trong tương lai. Việc gán một giá trị vào một biến gọi là labelling. Nếu labelling biến hiện tại với giá trị được chọn không phù hợp với một ràng buộc nào đó, thì một giá trị khác có sẵn sẽ được chọn. Nếu tất cả các biến được gán nhãn, khi đó bài toán được giải.

Bởi vì thuật toán quay lui (Back Tracking- BT) luôn luôn quay lui tại điểm quyết định cuối cùng khi quá trình kết thúc, nên nó cũng được gọi là quay lui theo một trình tự (Chronological Backtracking). Chúng ta có đoạn mã sau:

19

PROCEDURE Chronological_Backtracking(Z,D,C); BEGIN

BT-1(Z,{},D,C); END

PROCEDURE BT-1(UNLABELLED, COMPOUND_LABEL, D, C); /* UNLABELLED is a set or variables to be labelled; */

/* COMPOUND_LABEL is a set of labels already committed to */ BEGIN

IF (UNLABELLED={}) THEN return(COMPOUND_LABEL) ELSE BEGIN

Pick one variable x from UNLABELLED; REPEAT

Pick one value v from Dx; Delete v from Dx;

I F COMPOUND_LABEL + {<x,v>} violates no constraints THEN

BEGIN

Result

BT-1(UNLABELLED-{x}, COMPOUND_LABEL+{<x,v>}, D, C};

IF (Result ≠ NIL) THEN return(Result); END

UNTIL (DX={});

Return(NIL); /* signifying no solution */ END /* of ELSE*/

END /* of BT-1*/

Nếu số biến là n, số ràng buộc là e, số miền là a cho mỗi biến trong CSP. Khi đó có thể có an khả năng cho bộ nghiệm, và độ phức tạp thời gian cho việc kiểm tra toàn bộ ràng buộc là O(ane).

Độ phức tạp bộ nhớ của bài toán là O(na). Thuật toán BT không đòi hỏi bộ nhớ tạm thời nhiều hơn O(n) để lưu trữ nhãn kết hợp. Vì vậy, độ phức tạp không gian lưu trữ cho Chronological_Backtracking là O(na).

Chú ý rằng độ phức tạp thời gian ở trên chỉ ra rằng thuật toán sẽ hiệu quả hơn nếu ta giảm được a. Điều này có thể đạt được bằng các kỹ thuật rút gọn bài toán.

Một phần của tài liệu (LUẬN văn THẠC sĩ) lập trình ràng buộc với bài toán về hỗ trợ phân luồng giao thông (Trang 26 - 27)

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

(77 trang)