Giải thuật cải tiến tạo giả thiết tối thiểu

Một phần của tài liệu Tối ưu việc sinh giả thiết bằng giải thuật học L cho kiểm chứng từng phần phần mềm dựa trên thành phần (Trang 33)

Xét hệ thống gồm 2 thành phần là M1 và M2. Mục tiêu của chúng ta là kiểm tra

xem hệ thống này có thỏa mãn thuộc tính yêu cầu p không mà không cần phải ghép

nối M1 với M2? Để làm việc này phương pháp sinh giả thiết tối thiểu trong [9, 10] đã sinh một giả thiết tối thiểu thỏa mãn luật đảm bảo giả thiết bằng cách sử dụng chiến lược tìm kiếm theo chiều rộng. Giải thuật này sử dụng cấu dữ liệu hàng đợi để lưu trữ

toàn bộ các bảng quan sát với thứ tự “first-in first-out”. Tuy nhiên kích thước của hàng

đợi này sẽ phải lưu trữ số lượng các bảng quan sát được tăng lên với hàm mũ vì giải thuật cố gắng tìm kiếm tất các các giả thiết ứng cử viên có thể. Điều này dẫn đến giải thuật khó áp dụng được cho các hệ thống lớn trong thực tế. Để giảm chi phí tính toán cho việc sinh giả thiết thay vì việc sử dụng chiến lược tìm kiếm theo chiều rộng chúng tôi sử dụng chiến lược tìm kiếm theo chiều sâu lặp. IDDFS kết hợp tính hiệu quả không gian bộ nhớ của tìm kiếm theo chiều sâu và tính trọn vẹn của chiến lược tìm kiếm theo chiều rộng. Đó là chiến lược tìm kiếm không gian trạng thái trong đó tìm kiếm theo chiều sâu giới hạn (depth-limited search – DLS) được chạy lặp đi lặp lại nhiều lần, tăng độ sâu giới hạn ở mỗi lần lặp cho đến khi đạt được giả thiết thực tế hoặc một phản ví dụ chỉ ra rằng CBS vi phạm thuộc tính, độ sâu của mục tiêu gần nhất. Ở mỗi bước lặp, IDDFS thăm bảng quan sát trên cây tìm kiếm theo đúng thứ tự của tìm kiếm theo chiều sâu, nhưng thứ tự duyệt tích lũy trong đó các bảng quan sát được thăm đầu tiên, giả sử như không có nhánh cân, thì hiệu quả như tìm kiếm theo chiêu rộng. Tuy nhiên, chiến lược tìm kiếm này có cùng độ phức tạp về thời gian như tìm kiếm theo chiều rộng. Chỉ đường đi từ gốc của cây tìm kiếm (tức là bảng quan sát khởi tạo OT0) tới bảng quan sát hiện hành là được lưu trữ trong bộ nhớ. Đường đi này được thể hiện bằng một cấu trúc dữ liệu ngăn xếp s. Gải thuật 3 thể hiện giải thuật có tên IDDFS cho việc sinh giả thiết tối thiểu bằng cách sử dụng tìm kiếm theo chiều sâu lặp. Giải thuật 4 chỉ ra giải thuật có tên DLS cho việc áp dụng tìm kiếm theo chiều sâu giới hạn. DLS(d) trả ra một giả thiết A(p) với một kích thước nhỏ hơn (nhở hơn kích thước của giả thiết được sinh ra trong [4] nếu M1||M2 thỏa mãn p. Nó sẽ trả ra phản ví

dụ cex nếu M1||M2 vi phạm p. Ngược lại, nó sẽ trả ra giá trị “Không tìm thấy” để chỉ ra rằng DLS(d) không tìm giả thiết ở độ sâu d trong không gian tìm kiếm. Giải thuật

IDDFS gọi DLS với độ sâu gới hạn tăng dần.

Giải thuật 3 IDDFS(M1, M2, p, max)

Input: M1, M2, p, max: hai mô hình thành phần M1 và M2, thuộc tính được yêu cầu p, và độ sâu tối ta max.

Output: Am(p) hoặc cex: một giả thiết Am(p) với kích thước nhỏ nhất nếu M1||M2 thoả

mãn p hoặc một phản ví dụ nếu không thỏa mãn hoặc thông báo Không tìm thấy. 1: for i = 0 to max do

2: DLS(i) {Áp dụng tìm kiếm theo chiều sâu giới hạn với độ sâu giới hạn i}

3: if DLS(i) trả ra một giả thiết A(p) then

5: else

6: if DLS(i) trả ra một phản ví dụ cex then

7: return cex

8: end if

9: end if

10: end for

11: return Không tìm thấy

Trong giải thuật được chỉ ra trong Giải thuật 4, chúng tôi sử dụng cấu trúc dữ

liệu ngăn xếp để lưu trữ các bảng quan sát được sinh ra theo thứ tự “last-in first-out”

cho việc cài đặt chiến lược tìm kiếm theo chiều sâu giới hạn. Các bảng quan sát này được sử dụng cho việc sinh các giả thiết ứng cử viên. Chỉ đường đi từ gốc của cây tìm kiếm (tức là bảng quan sát khởi tạo OT0) tới bảng hiện hành là được lưu trữ trong ngăn xếp s. Vì vậy giải thuật cải tiến này sử dụng lượng bộ nhớ thấp hơn so với phương

pháp sinh giả thiết tối thiểu trong [9, 10]. Giải thuật DLS(max) trả ra một giả thiết A(p) với kích thước nhỏ hơn kích thước của giả thiết sinh ra trong [4] nếu M1||M2 thỏa mãn p. Nó trả ra một phản ví dụ cex nếu M1||M2 không thỏa mãn p. Ngược lại, nó trả

lại một giá trị là “Không tìm thấy” chỉ ra rằng DLS(max) không thể tìm thấy bất kỳ

một giả thiết nào trong trong không gian tìm kiếm giới hạn đó. Trong trường hợp này, cách tiếp cận đảm bảo giả thiết là không hiệu quả cho việc kiểm chứng hệ thống.

Bắt đầu giải thuật, ngăn xếp s được khởi tạo giá trị rỗng (dòng 1). Giải thuật sau đó đẩy bảng quan sát khởi tạo OT0 = (S0, E0, T0) vào đỉnh của ngăn xếp s như là gốc của không gian tìm kiếm bao gồm toàn bộ các bảng quan sát với S0 = E0 = {} ( thể hiện cho một chuỗi rỗng) (dòng 2). Giải thuật lặp đi lặp lại toàn bộ tiến trình tìm một giả thiết bằng vòng lặp từ dòng 3 tới dòng 36 đến tận khi ngăn xếp s là rỗng hoặc một giả thiết được sinh ra hoặc một phản ví dụ chứng minh cho sự vi phạm của hệ thống được tìm thấy. Ở đầu vòng lặp, giải thuật lấy một bảng quan sát OTi từ đỉnh của ngăn xếp s (dòng 4). Kích thước của OTi được tính bằng cách gọi hàm có tên size(OTi). Hàm này trả ra kích thước của Si với OTi = (Si, Ei, Ti). Nếu kích thước của OTi được tính là nhỏ hơn hoặc bằng max, giải thuật sẽ kiểm tra xem OTi có chứa giá trị chưa biết “?” (dòng 6). Nếu chứa giá trị “?”, chúng ta sẽ thu được tất cả các bảng quan sát con của bảng quan sát OTi bằng cách thay thế tất cả các giá trị “?” trong bảng OTi

bằng giá trị true và false (dòng 7). Các bảng thu được bằng cách thay thế này được

xem như là con của bảng OTi và chúng có cùng kích thước với bảng OTi. Đẩy lần lượt các bảng này vào đỉnh của ngăn xếp s (dòng 8). Trong trường hợp bảng quan sát OTi không chứa giá trị “?” (dòng 10). Nếu OTi chưa là bảng đóng (dòng 11) thì OTi sẽ được cập nhật để trở thành bảng đóng bằng cách gọi thủ tục make_closed(OTi) (dòng 12). Kích thước của bảng đóng thu được OT tăng kích thước của OTi và OT sau đó được đẩy vào đỉnh của ngăn xếp s (dòng 13). Nếu bảng OTi được lấy từ đỉnh của ngăn

xếp s (tại dòng 4) là bảng đóng (dòng 14) thì một ứng cử viên giả thiết Ai được sinh ra từ bảng đóng OTi này (dòng 15). Trong trường hợp này, chúng ta kiểm tra xem Ai được sinh ra có thỏa mãn luật đảm bảo giả thiết. Để thực hiện điều này bước 1 được áp dụng bằng cách gọi thủ tục Step1(Ai) để kiểm tra xem Ai có đủ mạnh cho M1 thỏa mãn

p bằng cách tính công thức Ai M1 p. Nếu Step1(Ai) trả ra kết quả false với một phản ví dụ cex (dòng 16) thì Ai quá yếu cho M1 thỏa mãn p. Như vậy, Ai phải được

làm mạnh thêm bằng cách thêm hậu tố e của cex để chứng minh sự khác nhau giữa

L(Ai) và ngôn ngữ của giả thiết được học vào Ei của bảng OTi (dòng 17). Kết quả của nhiệm vụ này là bảng OTi phải được cập nhật bằng cách gọi thủ tục tên là update(OTi) (dòng 18). Bảng sau khi cật nhập OT có cùng kích thước với OTi và OT sau đó được đẩy vào đỉnh của ngăn xếp s (dòng 19). Trong trường hợp Step1(Ai) trả ra giá trị true

(dòng 20), Ai là đủ mạnh để M1 thỏa mãn thuộc tính yêu cầu p. Bước 2 sau đó được

áp dụng để kiểm tra Ai có đủ yếu để được thỏa mãn bởi M2 bằng cách tính công thức true M2 Ai. Nếu Step2(Ai) trả ra giá trị false với một phản ví dụ cex (dòng 21), ta cần phần tích thêm p có thực sự bị vi phạm trong hệ thống ghép nối M1||M2 hoặc Ai là quá mạnh để được thỏa mãn bởi M2. Việc phân tích này dựa trên phản ví dụ thu được

cex. Nếu cex chứng minh sự vi phạm của p trong hệ thống M1||M2 thì giải thuật dừng

và trả ra cex như một phản ví dụ để chứng minh sự vi phạm của hệ thống (dòng 23).

Ngược lại, Ai là quá mạnh để được thỏa mãn bởi M2 (dòng 24). Trong trường hợp này, giả thiết ứng cử viên Ai cần được làm yếu đi bằng cách thêm hậu tốt e của cex vào Ei của bảng OTi (dòng 25). Sau đó bảng OTi phải được cập nhật bằng cách gọi thủ tục update(OTi) (dòng 26). Bảng sau khi cật nhật OT có cùng kích thước với OTi và bảng này được đẩy vào đỉnh của ngăn xếp s (dòng 27). Trong trường hợp Step2(Ai) trả giá

trị true (dòng 29), giải thuật sẽ dừng và trả Ai là giả thiết được sinh ra (dòng 30).

Trong trường hợp ngăn xếp rỗng, giải thuật sẽ thoát khỏi vòng lặp, trả ra giá trị “không

tìm thấy” và kết thúc giải thuật (dòng 37). Giá trị “không tìm thấy” có nghĩa là chúng

ta không tìm được một giả thiết trong giới hạn của không gian tìm kiếm chứa các giả

thiết ứng cử viên với kích thước nhỏ hơn hoặc bằng max. Giải thuật 4 DLS(max)

Input: max: kích thước tối đa của giả thiết được sinh ra.

Output: A(p) hoặc cex hoặc Không tìm thấy: một giả thiết A(p) nếu M1||M2 thoả mãn

p hoặc một phản ví dụ nếu không thỏa mãn hoặc thông báo Không tìm thấy. 1: Khởi tạo, s = empty {s là một ngăn xếp rỗng }

2: s.push(OT0) {Đẩy OT0 vào đỉnh của ngăn xếp s, với OT0 = (S0, E0, T0), S0 = E0 = {λ}, trong đó λ là một chuỗi rỗng}

3: while s <> empty do

4: OTi = s.pop() {Lấy OTi từ đỉnh của ngăn xếp s} 5: if size(OTi) ≤ max then

7: for mỗi bảng con OT của OTi do

8: s.push(OT) {Đẩy OT vào đỉnh của ngăn xếp s}

9: end for

10: else

11: if OTi chưa đóng then

12: OT = make_closed(OTi)

13: s.push(OT) {Đẩy OT vào đỉnh của ngăn xếp s}

14: else

15: Xây dựng DFA Ai từ bảng đóng OTi

16: if Step1(Ai) lỗi với cex then

17: Thêm hậu tố e của cex vào tập Ei.

18: OT = update(OTi)

19: s.push(OT) {Đẩy OT vào đỉnh của ngăn xếp s}

20: else

21: if Step2(Ai) lỗi với cex then

22: If cex chỉ ra hệ thống vi phạm p then

23: return cex

24: else

25: Thêm hậu tố e của cex vào tập Ei

26: OT = update(OTi)

27: s.push(OT) {Đẩy OT vào đỉnh của ngăn xếp

s} 28: end if 29: else 30: return Ai 31: end if 32: end if 33: end if 34: end if 35: end if 36: end while

37: return Không tìm thấy

Một phần của tài liệu Tối ưu việc sinh giả thiết bằng giải thuật học L cho kiểm chứng từng phần phần mềm dựa trên thành phần (Trang 33)

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

(58 trang)