这一篇是学习关于Beliefs的使用。
1.Beliefs的简单说明
一个Agent的Belief集是表示这个Agent对这个世界环境的了解。跟人类一样,知识积累的越多,越会处理世界上发生事情,换句话来说,就是你的适应性很强。当然,Agent就是Intelligent的,这样研究的东西才会对人类有所贡献。
Beliefs不仅能够初始化goals或者Plans,从而使agent执行相应的action,而且能够控制正在执行的行为。
Beliefs的表示方法:
作为类的一个成员来使用。这是比较常见的一种方式,并且把这个成员作为这个agent的belief。这个成员可以使任意类型的
Getter/Setter的方法对。为了满足更多的逻辑要求,增加了这两个pair。
未实现的Getter和Setter方法对。
一句话点破Belief的功能:就是让Agent知道这些beliefs的改变。换句话来说,就是一个人肯定知道自己知道什么和不知道什么,当你学了点新东西的时候,肯定会提醒自己的大脑。当belief被重新赋值,那么Agent就能够发现这点变化然后做出相应的动作。
2. Belief触发Plan
和普通的Plan区别就是在@Plan之后增加了相应的信息。
package a1;
import java.util.HashMap;
import java.util.Map;
import jadex.bdiv3.BDIAgent;
import jadex.bdiv3.annotation.Belief;
import jadex.bdiv3.annotation.Plan;
import jadex.bdiv3.annotation.Trigger;
import jadex.micro.annotation.Agent;
import jadex.micro.annotation.AgentCreated;
import jadex.micro.annotation.Description;
@Agent
@Description("<h1>Translate English to Chinese</h1>")
// @Plans(@Plan(body=@Body(TranslatePlan.class)))
public class TranslateEngChBDI {
@Agent
protected BDIAgent translateAgent;
protected int i = 1;
@Belief
protected Map<String, String> wordTable;
@AgentCreated
public void init() {
this.wordTable = new HashMap<String, String>();
// add some examples of word pairs
wordTable.put("milk", "牛奶");
wordTable.put("banana", "香蕉");
wordTable.put("school", "学校");
wordTable.put("teacher", "老师");
wordTable.put("science", "科学");
}
@Plan(trigger = @Trigger(factaddeds = "wordTable"))
public void checkMacPlan() {
// directly show the automatically triggered.
System.out.println("Beliefs have been added " + i++ + " elements");
}
}
这个例子是关于静态的Belief的使用,而有些时候,一个Belief依赖于其他的Beliefs,并且任何时候其他Beliefs的其中一个改变时,都会自动被重新评估。下面就是关于动态Belief的例子。
3. 动态的Beliefs
开启动态Beliefs的方法比较简单,相当于一个开关,把Dynamic设置成true即可。
4. Getter and Setter Belief
为了能够进一步动态获取和设定Beliefs,那么需要使用Getter和Setter的方法。当然,这个也不是很确切的说法。用一个简单的例子来说明一下。
package a1;
import java.text.SimpleDateFormat;
import jadex.bdiv3.BDIAgent;
import jadex.bdiv3.annotation.Belief;
import jadex.bdiv3.annotation.Plan;
import jadex.bdiv3.annotation.Trigger;
import jadex.micro.annotation.Agent;
import jadex.micro.annotation.AgentBody;
import jadex.micro.annotation.Description;
@Agent
@Description("Print the time")
public class ClockBDI {
@Agent
public BDIAgent clockAgent;
protected long time;
@AgentBody
public void body() {
setTime();
}
protected SimpleDateFormat formatData = new SimpleDateFormat(
"yyyy.MM.dd HH:mm:ss");
@Belief
public long getTime() {
return System.currentTimeMillis();
}
@Belief
public void setTime() {
// TODO Auto-generated method stub
}
@Plan(trigger = @Trigger(factchangeds = "time"))
public void printTime() {
System.out.println("Now, the time is: " + formatData.format(getTime()));
}
}
5. 动态更新的Belief
动态更新就是说,Belief能够每个一定的时间间隔进行更新。
例子是关于打印时间的程序:
package a1;
import java.text.SimpleDateFormat;
import jadex.bdiv3.BDIAgent;
import jadex.bdiv3.annotation.Belief;
import jadex.bdiv3.annotation.Plan;
import jadex.bdiv3.annotation.Trigger;
import jadex.micro.annotation.Agent;
import jadex.micro.annotation.AgentBody;
import jadex.micro.annotation.Description;
@Agent
@Description("Print the time")
public class ClockBDI {
@Agent
public BDIAgent clockAgent;
protected long time;
@AgentBody
public void body() {
setTime();
}
protected SimpleDateFormat formatData = new SimpleDateFormat(
"yyyy.MM.dd HH:mm:ss");
@Belief
public long getTime() {
return System.currentTimeMillis();
}
@Belief(updaterate=1000)
public void setTime() {
// TODO Auto-generated method stub
}
@Plan(trigger = @Trigger(factchangeds = "time"))
public void printTime() {
System.out.println("Now, the time is: " + formatData.format(getTime()));
}
}
在setTime的函数上,添加updaterate就可以实现动态的更新。
总结:对于Belief的使用,方法有两种1,使用类的成员;2,使用getter和setter方法。但是在实际的应用中,第一种方法用的还是会比较多一些。
另外关于Belief的使用,就是动态更新检测。但是这种定时的更新检测,还是会消耗一定的资源。具体的应用还是根据自己的使用情况来定。