Lớp FsmBehaviour

Một phần của tài liệu Phát triển phần mềm hướng Agent (Trang 104 - 106)

Lớp FSMBehaviour cài đặt một hành vi gộp trong đó các hành vi con được lập lịch theo một máy hữu hạn trạng thái (FSM). Lớp FSMBehaviour cung cấp 2 phương thức để đăng ký các hành vi con làm các trạng thái của máy hữu hạn trạng thái và để đăng ký sự di chuyển giữa các trạng thái. Tương tự như hành vi chuỗi, một hành vi FSM cũng chứa con trỏ chỏ tới hành vi con hiện thời. Sau khi hoàn thành (phương thức done() tả về true), hành vi FSM kiểm tra bảng chuyển dịch, trên cơ sở đó chọn ra hành vi con mới để thực hiện tiếp.

Hình 4.7: Một máy hữu hạn trạng thái đơn giản

Các chuyển dịch trong hành vi FSM được đánh dấu bằng một nhãn là một số nguyên. Khi hành vi con hiện thời hoàn thành nhiệm vụ, giá trị trả về của phương thức onEnd() được lấy làm giá trị thoát và được so sánh với nhãn của các chuyển dịch đang thoát ra từ trạng thái con hiện thời. Chuyển dịch đầu tiên có nhãn trùng với giá trị thoát sẽ được thực hiện và trạng thái đích của nó sẽ là trạng thái con hiện thời mới. Phương thức registerState() dùng để thêm trạng thái và

FSMBehaviour sẽ được thực thi trong trạng thái đó. Phương thức registerTransition(), dùng để thêm chuyển dịch vào FSMBehaviour, chấp nhận 3 tham số: hai tham số có kiểu String định nghĩa trạng thái nguồn và trạng thái đích của chuyển dịch và một giá trị kiểu int định nghĩa nhãn đánh dấu chuyển dịch đó. Các phương thức registerFirstState() và registerLastState() cho phép đăng ký trạng thái bắt đầu và trạng thái kết thúc. Tuy nhiên, cần chú ý rằng, chỉ có một trạng thái bắt đầu nhưng chỉ có một trạng thái kết thúc. Toàn bộ hành vi FSM sẽ kết thúc khi đạt được trạng thái kết thúc và đã thực thi đầy đủ. Ví dụ, minh họa code của một hành vi FSM trong hình 4.7: FSMBehaviour sampleFSM = new FSMBehaviour(anAgent);

sampleFSM.registerFirstState(new OneShotBehaviour(anAgent) { public void action() {

// Perform operation X }

public int onEnd() {

return (operation X successful ? 1 : 0); }

}, "X");

sampleFSM.registerLastState(new OneShotBehaviour(anAgent) { public void action() {

// Perform operation Y }

}, "Y");

sampleFSM.registerState(new OneShotBehaviour(anAgent) { public void action() {

// Perform operation Z }

}, "Z");

sampleFSM.registerTransition("X", "Y", 1); sampleFSM.registerTransition("X", "Z", 0);

sampleFSM.registerDefaultTransition("Z", "X", new String[]{"X", "Z"});

Phương thức registerDefaultTransition() của lớp FSMBehaviour cho phép định nghĩa một chuyển dịch mặc định giữa hai trạng thái. Một chuyển dịch mặc định không được đánh dấu bằng nhãn và xảy ra khi và chỉ khi các chuyển dịch khác (nếu có) đang thoát khỏi cùng trạng thái đó không xảy ra. Cả hai phương thức registerTransition() và registerDefaultTransition() đều lấy tham số là String[] với các phiên bản nạp chồng nhau. Tham số này xác định một tập các trạng thái FSM mà phải được thiết lập lại khi xảy ra trạng thái đã đăng ký. Điều này rất hữu ích khi đăng ký các trạng thái backward, cụ thể là các chuyển dịch mà dẫn đến các trạng thái mà đã từng xảy ra. Thực tế, như đã giải thích trong phần 3.2.3, một đối tượng Behaviour một khi đã được thực thi thì phải được thiết lập lại bằng các gọi phương thức reset trước khi nó lại được thực thi. Ví dụ, trong hình 4.7, nếu chuyển dịch từ Z đến X xảy ra, trạng thái X và có thể là cả trạng thái Z sẽ được thực thi lần nữa. Trước khi điều này xảy ra, chúng phải được reset để tránh những tác động không mong muốn.

Một phần của tài liệu Phát triển phần mềm hướng Agent (Trang 104 - 106)

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

(166 trang)