本篇主要讲解一下capability,也就是Agent的重用。
1. 简单介绍
重用性是软件工程领域一个很重要的特性,一次开发,多处使用。在Jadex中,使用的是BDI capabilities。一个BDI capability表示为一个模块包含beliefs,goals和plans,就像一个正常的agent一样。但是不具备单独行动的能力。
使用方法:类。
capability实现重用,那么就应该理所当然的声明为一个单独的类。然后作为一个完整的模块在agent中使用。
2. 代码实例
首先创建一个capability文件,命名没有要求。但是规范的话,还是在名字之后加上capability,方便区分。
文件名:TranslateCapa.java
package a2;
import java.util.HashMap;
import java.util.Map;
import jadex.bdiv3.annotation.Belief;
import jadex.bdiv3.annotation.Capability;
import jadex.bdiv3.annotation.Goal;
import jadex.bdiv3.annotation.GoalParameter;
import jadex.bdiv3.annotation.GoalResult;
import jadex.bdiv3.annotation.Plan;
import jadex.bdiv3.annotation.Trigger;
@Capability
public class TranslateCapa {
@Belief
protected Map<String, String> wordTable;
public TranslateCapa() {
// TODO Auto-generated constructor stub
this.wordTable = new HashMap<String, String>();
wordTable.put("milk", "牛奶");
wordTable.put("banana", "香蕉");
wordTable.put("school", "学校");
wordTable.put("teacher", "老师");
wordTable.put("science", "科学");
}
@Goal
public class TranslateGoal {
@GoalParameter
protected String eword;
@GoalResult
protected String cnword;
public TranslateGoal(String eword) {
this.eword = eword;
}
}
@Plan(trigger = @Trigger(goals = TranslateGoal.class))
public String translatePlan(String ewordString) {
return wordTable.get(ewordString);
}
}
然后创建一个BDI文件,直接把capability嵌入到Agent的一个成员使用。非常简单方便。
package a2;
import jadex.bdiv3.BDIAgent;
import jadex.bdiv3.annotation.Capability;
import jadex.micro.annotation.Agent;
import jadex.micro.annotation.AgentBody;
import jadex.micro.annotation.Description;
@Agent
@Description("<h1>Using Capability</h1>")
public class TranslateBDI {
@Agent
protected BDIAgent translateAgent;
@Capability
protected TranslateCapa capa = new TranslateCapa();
@AgentBody
public void body(){
String eword = "teacher";
String cnword = (String) translateAgent.dispatchTopLevelGoal(capa.new TranslateGoal(eword)).get();
System.out.println("翻译完成:" + eword + "---->" + cnword);
}
}
总结一下:capability就是一个模块,大家都可以调用来使用。好处减少了开发的资源浪费。但是需要很好的设计基础,才可以使用capability。