Chương 4 Cài đặt thử nghiệm hệ thống đấu giá
4.4. Cấu trúc role agent
4.4.1. Cấu trúc hai tầng của hệ thống
Hệ thống đa Agent của chúng ta được phát triển dựa trên môi trường JADE được phân chia thành hai phần [11]: phần phụ thuộc và phần độc lập tương đối với nền JADE (Hình 4.9). Chúng ta phải thấy rằng khơng thể có một bản cài đặt cơ sở tương tác hoàn toàn độc lập với platform mà chúng ta chỉ có thể cố gắng để giảm bớt các phần phụ thuộc platform. Trong ứng dụng này, chúng tôi phát triển một số lớp Java bao gồm cả những lớp độc lập với nền và các lớp gắn với nền JADE.
Hình 4.11. Cấu trúc phân tầng của hệ đa agent dựa trên role
Với cấu trúc như Hình 4.11, chúng ta càng thấy rõ hơn sự tách biệt giữa role và agent. Role và agent là hai thực thể độc lập tương đối với nhau, có thể được phát triển một cách riêng rẽ. Tuy nhiên, nếu tách hai thành phần này khỏi nhau thì khơng thành phần nào có thể hoạt động được trong hệ thống. Khi chưa đảm nhận một role nào đó thì agent chưa có được bất kỳ khả năng nào liên quan đến thương mại. Ngược lại, khi role chưa được agent đảm nhận, role chỉ là tiềm năng, không thể hoạt động được. Chỉ khi agent đảm nhận một role của hệ thống, chúng ta mới có một thành phần hoạt động thực sự, gọi là role agent. Ví dụ, một agent đảm nhận role Bidder, ta gọi role agent này là Bidder agent.
Theo cách này, một role agent thể hiện hai khía cạnh độc lập khi nhìn theo hai cách hướng khác nhau. Một mặt, role agent là các role, là các subject của hệ thống role, mặt khác là các agent của nền JADE. Như vậy, role agent sẽ gồm hai tầng: tầng subject, biểu diễn chủ thể của hệ thống role độc lập với nền và tầng
Môi trường tương tác cục bộ Wrapper layer Ro le y st e m Subject Layer Role A Ro le Re g is tra ti o n Agent 1 Wrapper layer Ro le y st e m Subject Layer Role B Ro le Re g is tra ti o n Agent 2 Server Agent A CL m e ss a g e Jade P la tfor m H ệ th ống rol e A CL m e ss a g e
wrapper là các JADE agent có nhiệm vụ hỗ trợ tầng subject. Vấn đề đặt ra là kết nối giữa hai tầng này để tạo thành một role agent thống nhất. Kết nối giữa tầng subject và tầng wrapper đạt được nhờ hai đối tượng Java, là thể hiện của hai lớp cài đặt hai giao diện RoleSystem và RoleRegistration.
Giao diện RoleSystem cho phép agent thực hiện các thao tác cơ bản để đảm nhận một role như: tìm kiếm role phù hợp, yêu cầu đăng ký đảm nhận…Vì vậy, giao diện này có các phương thức sau:
reqRegistration: để đăng ký đảm nhận một role nào đó với hệ thống. Khi
đó server agent sẽ ghi nhận agent yêu cầu và trả về một đối tượng cài đặt giao diện RoleRegistration để cho phép agent sử dụng role đã yêu cầu.
SearchForRole, SearchForRoleNoWait: tìm kiếm agent đảm nhận một role,
có hoặc không thời gian chờ nhất định. Nếu là NoWait thì ngay khi tìm thấy một agent đảm nhận role cần tìm hoặc tìm thấy một đăng ký mới phù hợp phương thức sẽ lập tức trả về giá trị. Nếu không sẽ trả về một mảng các đăng ký đảm nhận role của các agent.
Giao diện RoleRegistration cho phép agent thực hiện các thao tác trên hệ thống thông qua một đăng ký cụ thể (tức là sau khi đã đảm nhận thực sự một role nào đó). Giao diện này sẽ có các phương thức sau:
listen, listenNoWait: lắng nghe để nhận biết một sự kiện xảy ra. Đối với
các phương thức khơng có thời gian chờ, chúng sẽ đóng băng (blocking) cho đến khi có một sự kiện xảy ra. Phương thức này sẽ trả về giá trị là một đối tượng của lớp event hoặc null.
doAction: để thực hiện một hành động bất kỳ.
whoAmI: để biết định danh gắn với đăng ký role của chính role Agent đó.
4.4.2. Q trình tương tác giữa các role agent
Trong mỗi role, sự kiện được cài đặt bằng các trường dữ liệu tĩnh cịn hành động bằng phương thức tĩnh (Hình 4.8) Mỗi khi role agent chọn thực hiện một hành động bằng cách gọi phương thức tương ứng của role, một instance RoleAction sẽ được tạo ra. Tuy nhiên, hành động được lựa chọn chỉ có thể thực sự được thực thi khi role agent gọi phương thức doAction của giao diện RoleRegistration. Sau đó,
khi Server agent (agent có nhiệm vụ quản lý các role và role agent) nhận được yêu cầu thực hiện hành động thông qua tầng wrapper, agent này sẽ dịch hành động thành một sự kiện (thuộc lớp RoleEvent).
if (!permissionMatrix.checkPermission(sender.getRole(), addressee.getRole()))
throw new RoleException(RoleException.NOT_ALLOWED);
RoleMsg msgR = new RoleMsg(addresseeID, new RoleEvent(action .getName(), senderID, sender.getRole(),
action.getContent()));
Đầu tiên, Server agent sẽ kiểm tra quyền tương tác giữa role gửi và role nhận. Nếu tương tác không được cho phép, gửi thông báo tương tác không được phép (NOT_ALLOWED) tới role gửi. Ngược lại, tiến hành dịch một hành động thành sự kiện tương ứng bằng đoạn mã dưới đây:
new RoleEvent(action.getName(),senderID,sender.getRole(), action.getContent()));
Cuối cùng, Server agent gửi sự kiện vừa tạo ra tới role agent nhận. Các role agent luôn đợi các sự kiện đến bằng cách gọi thực hiện phương thức listen của giao diện RoleRegistration. Khi sự kiện đến, phương thức listen sẽ trả về một instance của lớp RoleEvent và sau đó agent sẽ đánh giá xem sự kiện này có nằm trong số các sự kiện mà nó có thể nhận biết hay không nhờ phương thức match của lớp
KnownEvent.
public boolean match(RoleEvent event) {
return name.equals(event.getName()) && senderRole.equals(event.getSenderRole()) &&
( (contentClass==null && event.getContent()==null) || (contentClass!=null &&
contentClass.isInstance(event.getContent())) ); }
Phương thức match này so sánh các sự kiện đã biết (thể hiện của lớp
KnowEvent) với sự kiện vừa xảy ra (thể hiện của lớp RoleEvent). Nếu trùng tên, trùng địa chỉ bên gửi và nội dung thơng tin thì sự kiện vừa nhận được thuộc tầm quản lý của role đó. Khi đó, role sẽ lấy thơng tin từ sự kiện để xử lý.