《关于多代理系统的研究》01
来源:互联网 发布:知鱼之乐 编辑:程序博客网 时间:2024/06/05 09:32
1. 简介
在软件工程领域,多代理系统是比较常见的一个研究课题,尤其是在分布式,开放式的网络环境中,多代理系统有很多的优势。所谓多代理系统是指一个由多个自治运行的Agent组成的集体.在开放分布式网络环境中Agent是一个抽象实体.它是自治的可以对自身环境、操作环境和环境变化采取行动,一个系统中一般有多个IntelligentAgent这样的系统就称为多Agent系统.多Agent系统必须找出一种使各个Agent能够协同工作的适当方法。依据这些理论基础建立起来的系统均称为多Agent系统,即MAS.
最近研究的东西就是使用多代理的方法,对在线网络拍卖进行欺诈检测。在线拍卖的一个很重要的特点就是其隐蔽性。每个竞标者可以很轻松的拥有很多的拍卖的账号,进行欺诈性投标,进而达到inflate成交价格的目的。当然了,对于欺诈投标有很多策略,想了解更多关于欺诈投标的特点,方法,可以参考我的一片会议论文A real-time Monitoring Framework for Online Auction Frauds,这是跟我的研究生导师Dr. Samira Sadaoui合作发表的一片论文。
写该系列博客的主要目的是,关于多代理系统(multi-agent)的实现,资料很少,并且,德国人开发的一个框架Jadex学习起来成本很高,可以提供的API很少,并且都是英文的,理解起来有一定的难度。为了能够尽快完成研究生的毕业设计,也为了能够给大家提供一些学习的资源,就把学习Jadex的过程以及部分资料进行翻译,希望会对国内的相同研究方向的学生,学者有一定的帮助。
我所使用的Jadex是Jadex BDI V3,纯Java实现,没有使用XML。后面慢慢会引入一点关于下一篇论文的一些Implementation的核心。
2. 大笔一挥,Helloworld
首先Jadex的启动问题,相信只要能够懂一点Eclipse使用,并且懂一点英文的都可以做到。按照手册《BDI V3 Tutorial》上的步骤,就可以直接启动。
1. 创建第一个Agent,简单来说就是Helloworld
创建Agent的方法很简单,新建一个java文件,然后命名为*BDI.java,注意:命名的结尾要以BDI结束,这表示你的多代理系统能够认识这个文件为BDI Agent,其他的文件命名是不被接受的。接下来,就是键入如下的代码:
package a1;import jadex.bdiv3.BDIAgent;import jadex.micro.annotation.Agent;import jadex.micro.annotation.AgentBody;import jadex.micro.annotation.Description;@Agent@Description("<h1>Hello, Jadex!!!</h1>")public class AucControllerBDI { @Agent protected BDIAgent agent; @AgentBody public void body(){ System.out.println("Hello, Jadex"); }}
启动Agent,你会看见控制台输出:Hello, Jadex. 说明,一切万事大吉,你已经踏入了,Jadex大门了。恭喜恭喜!!!!
3. 使用Plan
在Jadex中,Plans起着很重要的作用,因为Plan封装了很多的状态(下面会介绍)。Plan的使用包括两个方面:@Plan说明了Plan的元信息已经被定义了,从此以后这个就是Plan了,像是宣誓主权一样。那么,这个@Plan就已经定义了很多的属性,比如Plan被激活的条件或者与其他Plan之间的关系。另外一方面就是Plan的body部分,主要包含具体的实现部分。
首先,Plan在Multi-Agent中,有三种形式:可以定义成成员方法,内部类,以及类。关于这三种的优劣势,下面会通过代码进行说明。
如果Plan来驱动events和goals,我们可以在Plan的头部进行说明,进而使这个Agent知道,这个Plan能够处理的events。这样的话,当这个Agent收到来自于其他的Agent的events时候,就可以创建自己的Plan表或者候选Plan来处理该events。
通常情况下,一个Plan会处于等待状态,直到某个状态被执行完毕。这样的话,一个Plan就可以使用Plan API的waitFor()方法。作为一个对象的Plan API能够有两种方法被检索到:1,在Plan的类中,可以使用@PlanAPI的标识,声明一个field。然后Jadex的推理引擎就会自动加入这个plan的实例。请注意,Jadex的方法能够被框架随时调用。推理引擎会自动决定哪些值是所期待的,哪些参数是需要设置的。如果没有找到的话,系统就会返回null。
3.1 Plan作为一个普通的类
一个简单的实例,实现中英文之间的翻译:
使用一个Java的类来定义Plan:
// TranslatePlan.java
package a1;import java.util.HashMap;import java.util.Map;import jadex.bdiv3.annotation.Plan;import jadex.bdiv3.annotation.PlanBody;@Planpublic class TranslatePlan { protected Map<String, String> wordTable; public TranslatePlan() { 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", "科学"); } @PlanBody public void translateEnglishChinese() { // Here we only test one example System.out.println("Translated: teacher to Chinese is " + wordTable.get("teacher")); }}
定义Plan很简单,就是要一个类要实现的功能,然后加上对应的annotation,也就是@Plan和@PlanBody等等。
//TranslateEngChBDI.java
package a1;import jadex.bdiv3.BDIAgent;import jadex.bdiv3.annotation.Body;import jadex.bdiv3.annotation.Plan;import jadex.bdiv3.annotation.Plans;import jadex.micro.annotation.Agent;import jadex.micro.annotation.AgentBody;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; @AgentBody public void body(){ TranslatePlan transPlan = new TranslatePlan(); translateAgent.adoptPlan(transPlan); }}
两点需要主要,首先要在Agent类的开始部分加上可能要使用的Plan,就是@Plans(@Plan(body=@Body(TranslatePlan.class)))这一行。主要了,agent体中得body方法是在启动JCC的时候,自动被调用的。然后adopt这个Plan。
输出:Translated: teacher to Chinese is 老师
3.2 Plan作为一个内部类
package a1;import java.util.HashMap;import java.util.Map;import jadex.bdiv3.BDIAgent;import jadex.bdiv3.annotation.Plan;import jadex.bdiv3.annotation.PlanBody;import jadex.micro.annotation.Agent;import jadex.micro.annotation.AgentBody;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; @Plan public class TranslatePlan { protected Map<String, String> wordTable; public TranslatePlan() { 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", "科学"); } @PlanBody public void translateEnglishChinese() { // Here we only test one example System.out.println("Translated: teacher to Chinese is " + wordTable.get("teacher")); } } @AgentBody public void body() { TranslatePlan transPlan = new TranslatePlan(); translateAgent.adoptPlan(transPlan); }}
不太建议把Plan作为内部类进行使用,懂编程的人,都知道为什么。对吧?可能我的经验不足,还是比较讨厌这种使用方法。
3.3 Plan作为方法使用
package a1;import java.util.HashMap;import java.util.Map;import jadex.bdiv3.BDIAgent;import jadex.bdiv3.annotation.Plan;import jadex.micro.annotation.Agent;import jadex.micro.annotation.AgentBody;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 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 public void translateEngCh() { // Here we only test one example System.out.println("Translated: teacher to Chinese is " + wordTable.get("teacher")); } @AgentBody public void body(){ translateAgent.adoptPlan("translateEngCh"); }}
作为方法使用是,在Agent的body方法中,要使用Plan方法的名字就可以。框架提供了自动检索的方法。
3.4 使用其他Plan的方法
除了已经学习到的使用方法外,下面介绍其他三个Plan的生命周期方法。
1. @PlanPassed Plan顺利执行的
2. @PlanFailed Plan执行失败
3. @PlanAborted Plan被取消,比如当Plan的上下文变得不可用的时候。
演示这个例子的时候,需要用到try-catch块,完成adoptPlan()的调用和等待Plan被执行完成的调用(在调用完成以后,使用get())。get() 是基于future的异步转同步的方法。
package a1;import java.util.HashMap;import java.util.Map;import jadex.bdiv3.BDIAgent;import jadex.bdiv3.annotation.Plan;import jadex.bdiv3.annotation.PlanAborted;import jadex.bdiv3.annotation.PlanBody;import jadex.bdiv3.annotation.PlanFailed;import jadex.bdiv3.annotation.PlanPassed;import jadex.micro.annotation.Agent;import jadex.micro.annotation.AgentBody;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; @Plan public class TranslateEngChPlan { protected Map<String, String> wordTable; public TranslateEngChPlan() { 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", "科学"); } @PlanBody public void translateEngCh() { // Here we only test one example System.out.println("Translated: teacher to Chinese is " + wordTable.get("teacher")); } @PlanPassed public void passed(){ System.out.println("Plan finished successfully!!!"); } @PlanAborted public void aborted(){ System.out.println("Plan Aborted!!!!"); } @PlanFailed public void failed(){ System.out.println("Plan failed"); } } @AgentBody public void body() { try { translateAgent.adoptPlan(new TranslateEngChPlan()).get(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } }}
上面代码的主要功能就是在Plan执行完成之后,其他的Plan方法会相应的根据Plan来执行。如果是成功执行,就执行PlanPassed,不成功就会根据异常的类型执行相应的方法。
3.5 Plan的上下文条件
除了Plan的生命周期方法之外,一个Plan,还有其他的先决条件或者上下文条件的方法。先决条件的方法是在Plan执行之前进行evaluated的。作为对比,上下文条件则是必须在Plan执行的时候来evalued。也就是说,如果在Plan执行的某个时候,上下文条件变成false了,那么该计划就不得不被取消了。
package a1;import java.util.HashMap;import java.util.Map;import jadex.bdi.runtime.IPlan;import jadex.bdiv3.BDIAgent;import jadex.bdiv3.annotation.Belief;import jadex.bdiv3.annotation.Plan;import jadex.bdiv3.annotation.PlanAPI;import jadex.bdiv3.annotation.PlanAborted;import jadex.bdiv3.annotation.PlanBody;import jadex.bdiv3.annotation.PlanContextCondition;import jadex.bdiv3.annotation.PlanFailed;import jadex.bdiv3.annotation.PlanPassed;import jadex.micro.annotation.Agent;import jadex.micro.annotation.AgentBody;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; @Belief protected boolean boolContext = true; @Plan public class TranslateEngChPlan { protected Map<String, String> wordTable; @PlanAPI protected IPlan plan; @PlanContextCondition(beliefs="boolContext") public boolean checkContext(){ return boolContext; } public TranslateEngChPlan() { 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", "科学"); } @PlanBody public void translateEngCh() throws InterruptedException { // Here we only test one example System.out.println("Plan started:"); plan.wait(10000); System.out.println("Plan resumed."); System.out.println("Translated: teacher to Chinese is " + wordTable.get("teacher")); } @PlanPassed public void passed(){ System.out.println("Plan finished successfully!!!"); } @PlanAborted public void aborted(){ System.out.println("Plan Aborted!!!!"); } @PlanFailed public void failed(){ System.out.println("Plan failed"); } } @AgentBody public void body() { try { translateAgent.adoptPlan(new TranslateEngChPlan()); translateAgent.waitForDelay(1000); boolContext = false; System.out.println(""); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } }}
总结:该篇主要介绍了关于Jadex的Agent的创建方法和Plan的使用。Agent在V3中得使用只需要Java文件就可以,并且,在需要设置为Plan的方法或者类上面添加@Plan就可以声明为Plan,在Agent的body中直接调用使用。Plan的定义方法比较多,但是常用的还是每个Plan定义为一个类文件,比较符合常规的系统开发规范。
- 《关于多代理系统的研究》01
- 《关于多代理系统的研究》02
- 《关于多代理系统的研究》03
- 《关于多代理系统的研究》04
- 《关于多代理系统的研究》05(The end)
- 关于动态代理的研究
- 关于排名系统的研究
- 关于分布式系统的研究
- 关于 【通过代理访问】 的研究,【突破 IP ,“无限制”投票】
- 关于嵌入式系统的研究方向
- [经典]关于嵌入式系统的研究方向
- 关于嵌入式系统的研究方向
- 不同的系统下,路径不同,关于路径的研究
- 不同的系统下,路径不同,关于路径的研究
- 关于流通系统的流失特性的研究
- 关于Mathematica系统通讯机制MathLink的研究
- 关于研究生面试系统的探索研究V
- 关于linux系统如何实现fork的研究(一)
- win8改win7笔记
- 数据库小知识
- java--导入包中的类
- hdoj 5240 Exam 【模拟】
- Redis源码分析(二十五)--- zmalloc内存分配实现
- 《关于多代理系统的研究》01
- linux下一个网卡配置多个ip【虚拟ip】
- tomcat管理员密码设置
- 2015多校Solve this interesting problem
- HDU 3669 Cross the Wall (斜率优化DP)
- redis内存管理代码注释
- 在eclipse中打开文件所在的目录
- oracle数据库用户加锁和解锁
- android 截图保存位置不在已选择的“SD卡”中