基于C++实现的面向Agent编程

时间:2022-06-28 06:47:52

基于C++实现的面向Agent编程

摘要:Agent的概念已经在许多领域得到了重视,但面向Agent的编程实践还存在较大的滞后。已有的文献、专著中的例程大部分是通过Java实现的,该文将探讨利用C++实现面向Agent编程的方法,并给出一个简单的例程。

关键词:C++;多线程;面向Agent编程

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)23-5625-03

C++ Implementation of Agent Oriented Programming

CHEN Xi-chun, XI Bo

(Shijiazhuang Mechanized Infantry Academy, Shijiazhuang 050083, China)

Abstract: The concept of agent has been emphasized in many fields, but practice in agent oriented programming lags behind. Samples showed in literatures and text books were implemented mainly in Java. In this paper, we’ll show how to implement an agent in C++, and a simple example will also be given.

Key words: C++; multi thread; agent oriented programming

近年来,面向Agent编程(AOP,agent oriented programming)的理念,是继面向对象编程(OOP,object oriented programming)之后,软件设计界的又一次革命。面向agent的编程主要应用在展示类似人类行为的、进行推理的特殊领域,非常适合于如分布式的商务系统、智能工具和模拟、航空交通管理等领域。

Agent的理论研究已经取得了很大的进展,但应用研究还存在着相当大的滞后。目前,面向Agent的语言还不成熟,因此大部分面向Agent的应用仍然是使用面向对象语言开发的,而其中大部分又是基于Java的。本文将探讨使用C++进行Agent编程的具体方法,并给出一个简单的Agent例子。

1 面向Agent编程的基本概念

文献[1]将Agent定义为一种“基于某种场景,并具有灵活、自主的行为能力,以满足设计目标的计算机系统”。

一个为理论界所接受的Agent需要具有如下若干特征:

自主性(Autonomy)。Agent的运行无需人类或其它Agent的直接干预,并能对其自身行为及内部状态进行某种控制。

社会性(Social Ability)。能通过某种Agent通信语言与其它Agent(也可能是人类)进行交互。交互主要有三种类型:协作(Cooperation)、协调(Coordination)和协商(Negotiation)。

反应性(Reactivity)。能感知它们的环境,并能对环境的变化及时做出反应。

主动性(Pro-activeness)。Agent不但能对环境做出反应,而且它们能够积极主动地做出使其目标得以实现的行为。

2 C++实现面向Agent编程

2.1 面向对象和面向Agent编程的异同

对象和Agent都是对现实世界事物的抽象,面向Agent技术是为了解决复杂的、分布的现实世界问题,可看作是对面向对象方法的继承、进化和发展。从面向对象发展到面向Agent,使得计算机求解问题的方式与人类认识世界的思维方式更接近

具体来说,面向Agent的编程于面向对象的编程有以下不同:

1) 自治程度。对象可以控制自己的内部状态但不能控制自己的行为.也就是说对象不能控制它的方法是否执行。Agent可主动运行,有自己的目标和行为,可由外部激励或内部状态丽启动,执行动作的决定权在接受请求的Agent。

2) 对于灵活性的见解。Agent具有灵活的(反应的、预动的、社会的)行为能力,标准的对象模型根本没有这种行为能力。

3) 多Agent系统本质上是多线程的,其中每个Agent至少假设有一个控制线程。虽然现在有的面向对象的程序设计语言具有一定的并发能力,但只是从计算效率的角度强调多线程,而在面向Agent编程中,多个Agent的并行处理是这种编程范式的内在要求。

2.2 面向Agent编程的几个关键问题

C++是一种面向对象的语言,在面向对象的编程中,类变量、类方法等都是对象的概念,但刻画Agent仅仅靠这些还是不够的。从软件设计角度看,面向Agent的编程还需要解决以下几个问题,

1) Agent对外部世界的感知以及事件处理的能力。Agent作为一种拟人的智能体,必须在自身的线程循环中,,不断地感知世界并做出响应。

2) Agent是多线程并行计算的。在多Agent系统中,各个Agent的地位可能有差别,但它们的存在和运行却是并行的。因此,具体实现过程中,应把Agent类设计成一个多线程类。

3) Agent的智能化。Agent处理事件,做出决策的基础是自己的规则库。在面向Agent的编程中,根据解决问题的不同,所采取的人工智能方法也是情况迥异。编程时应该根据不同的问题,给出相应的解决框架。本文暂不考虑这个问题。

4) Agent之间的通信。Agent不是孤立的,Agent之间通信的语言标准是KQML(知识查询与操纵语言,Knowledge Query and Manipulation Language),在编程实现时,为了使用KQML,就应该有一个类对KQML进行解析,使用Socket或类似手段传递KQML。

2.3 C++多线程类库的设计

从面向对象的角度理解面向Agent,可以认为Agent就是绑定了Thread的Object。基于这种理解,可以设计一个多线程的BaseAgent类,作为其它Agent的基类。

BaseAgent类的主要代码如下:

#include

#include

using std::cin;

using std::cout;

using std::endl;

typedef void *HANDLE;

class BaseAgent

{public:

void start();

virtual void run();

HANDLE getThread();

private:

HANDLE hThread;

static void agent(void *p);

};

void BaseAgent::start()

{hThread=(HANDLE)_beginthread(agent, 0, (void *)this);

}

void BaseAgent::run()

{cout

}

void BaseAgent::agent(void *p)

{Thread *agt = (Thread *)p;

agt->run();

}

HANDLE BaseAgent::getThread()

{return hThread;

}

上述代码中,start()方法通过调用_beginthread()函数来启动Agent线程;agent()方法是_beginthread的参数,用来执行run()方法;run()方法内可以放置Agent的主要执行代码,例如Agent的消息事件循环等。

这个Agent基类仅仅是一个多线程的、展示C++面向Agent编程方法的框架。Agent更重要的功能在于它的“智能”特性,这需要结合特定领域的知识去实现。C++不是为面向Agent编程设计的,另外,面向对象与面向Agent方法在分析问题、解决问题的方式上有比较大的差异,这些在实践中应当注意。

2.4 一个简单的Agent例程

基于上文提出的BaseAgent类,可以实现下述的例程。本例程从BaseAgent类派生了一个DerivedAgent类,这个派生出的Agent只是打印出一句问候,通过重载run()可以达到这个目的。

在测试文件的主函数main()中,新建一个DerivedAgent对象,调用它的start()方法,则会新建这个DerivedAgent对象的线程,进而执行这个DerivedAgent对象的run()方法。

代码如下:

#include "BaseAgent.h"

#include

#include

using std::cin;

using std::cout;

using std::endl;

class DerivedAgent: public BaseAgent

{public:

void run();

};

void DerivedAgent::run()

{cout

}

int main(int argc, char *argv[])

{DerivedAgent *da = new

DerivedAgent ();

da->start();

WaitForSingleObject(dt->getThread(),

INFINITE);

}

如果新建多个DerivedAgent对象,那么就可以建立一个多Agent应用程序;如果从BaseAgent派生出不同的子类,就可以控制Agent的不同行为。

3 结论和展望

本文分析了面向Agent编程与面向对象编程的主要差异,然后通过设计一个Agent基类,结合一个简单的例程,展示了C++实现面向Agent编程的方法。

需要指出的是,Agent的编程理念强调分布式、并行式计算,近年来伴随这一理念出现了一些优秀的函数库,例如微软公司VS2010中的异步库(Asynchronous Agents Library),利用这些库进行Agent的开发,将会大大地提高开发效率,降低开发难度。

参考文献:

[1] Jennings N R,Sycara K,Wooldridge M.A Roadmap of Agent Research and Development[J].Autonomous Agent and Multi-Agent Systems,1998(1):275-306.

[2] Bigus J P,Bigus J.Constructing Intelligent Agents With Java[M].New York:John Wiley & Sons Inc,1997.

[3] 异步库[EB/OL]./zh-cn/library/dd492627.aspx.

[4] 程显毅,聂文惠,谢军.面向agent开发环境JACK的实践[M].北京:科学出版社,2009.

[5] 姚政,高文.面向Agent的程序设计[J].软件学报,1997(11):824-831.

[6] 蒋云良,徐从富.智能Agent与多Agent系统的研究[J].计算机应用研究,2003(4):31-34.

上一篇:基于ASP.NET 3.5的SQL注入攻击分析及防范措施 下一篇:基于JSP的灌区管理信息系统的设计与实现