当前位置:
文档之家› 基于C++实现的面向Agent编程
基于C++实现的面向Agent编程
收 稿 日 期 :2011-05-19 作者简介:陈喜春,男,河南新乡人,讲师,硕士,主要研究方向为仿真、嵌入式技术;锡泊,男,讲师,硕士,主要研究方向为仿真。
本栏目责任编辑:谢媛媛
软件设计开发 5625
Computer Knowledge and Technology 电脑知识与技术
第 7 卷第 23 期 (2011 年 8 月)
Agent 的理论研究已经取得了很大的进展,但应用研究还存在着相当大的滞后。 目前,面向 Agent 的语言还不成熟,因此大部分 面向 Agent 的应用仍然是使用面向对象语言开发的,而其中大部分又是基于 Java 的。 本文将探讨使用 C++进行 Agent 编程的具体方 法,并给出一个简单的 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)
并做出响应。 2) Agent 是多线程并行计算的。在多 Agent 系统中,各个 Agent 的地位可能有差别,但它们的存在和运行却是并行的。因此,具体
实现过程中,应把 Agent 类设计成一个多线程类。 3) Agent 的智能化。 Agent 处理事件,做出决策的基础是自己的规则库。 在面向 Agent 的编程中,根据解决问题的不同,所采取的
Abstract: The cபைடு நூலகம்ncept 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.
2.2 面向 Agent 编程的几个关键问题
C++是一种面向对象的语言,在面向对象的编程中,类 变 量 、类 方 法 等 都 是 对 象 的 概 念 ,但 刻 画 Agent 仅 仅 靠 这 些 还 是 不 够 的 。 从软件设计角度看,面向 Agent 的编程还需要解决以下几个问题,
1) Agent 对外部世界的感知以及事件处理的能力。 Agent 作为一种拟人的智能体,必须在自身的线程循环中,,不断地感知世界
人工智能方法也是情况迥异。 编程时应该根据不同的问题,给出相应的解决框架。 本文暂不考虑这个问题。 4) Agent 之 间 的 通 信 。 Agent 不 是 孤 立 的 ,Agent 之 间 通 信 的 语 言 标 准 是 KQML (知 识 查 询 与 操 纵 语 言 ,Knowledge Query and
Tel:+86-551-5690963 5690964
基于 C++实现的面向 Agent 编程
陈喜春,锡泊
(石家庄机械化步兵学院 军事模拟训练中心,河北 石家庄 050083)
摘要:Agent 的概念已经在许多领域得到了重视,但面向 Agent 的编程实践还存在较大的滞后。 已有的文献、专著中的例程大部分是 通过 Java 实现的,该文将探讨利用 C++实现面向 Agent 编程的方法,并给出一个简单的例程。
3 结论和展望
本文分析了面向 Agent 编程与面向对象编程的主要差异,然 后 通 过 设 计 一 个 Agent 基 类 ,结 合 一 个 简 单 的 例 程 ,展 示 了 C++实 现面向 Agent 编程的方法。
需要指出的是,Agent 的编程理念强调分布式、 并行式计 算 , 近 年 来 伴 随 这 一 理 念 出 现 了 一 些 优 秀 的 函 数 库 , 例 如 微 软 公 司 VS2010 中的异步代理库(Asynchronous Agents Library),利用这些库进行 Agent 的开发,将会大大地提高开发效率,降低开发难度。
Manipulation Language),在编程实现时,为了使用 KQML,就应该有一个类对 KQML 进行解析,使用 Socket 或类似手段传递 KQML。
2.3 C++多线程类库的设计
从 面 向 对 象 的 角 度 理 解 面 向 Agent, 可 以 认 为 Agent 就 是 绑 定 了 Thread 的 Object。 基 于 这 种 理 解 , 可 以 设 计 一 个 多 线 程 的 BaseAgent 类,作为其它 Agent 的基类。
2 C++实现面向 Agent 编程
2.1 面向对象和面向 Agent 编程的异同
对象和 Agent 都是对现实世界事物的抽象,面向 Agent 技术是为了解决复杂的 、分 布 的 现 实 世 界 问 题 ,可 看 作 是 对 面 向 对 象 方 法的继承、进化和发展。 从面向对象发展到面向 Agent,使得计算机求解问题的方式与人类认识世界的思维方式更接近
Key words: C++; multi thread; agent oriented programming
近年来,面向 Agent 编程(AOP,agent oriented programming)的理念,是继面向对象编程(OOP,object oriented programming)之后 , 软件设计界的又一次革命。 面向 agent 的编程主要应用在展示类似人类行为的、进行推理的特殊领域,非常适合于如分布式的商务 系统、智能工具和模拟、航空交通管理等领域。
ISSN 1009-3044 第Com7p卷ute第r K2no3w期ledge(a2n0d1T1ec年hno8lo月gy)电脑知识与技术
Vol.7, No.23, August 2011.
E-mail: xsjl@ Computer Knowledge and Techhnttoplo:/g/yw电ww脑.d知nz识s.n与e技t.c术n
代码如下: #include "BaseAgent.h" #include <windows.h> #include <iostream> using std::cin; using std::cout; using std::endl; class DerivedAgent: public BaseAgent {public:
2.4 一个简单的 Agent 例程
基于上文提出的 BaseAgent 类,可以实现下述的例程。 本例程从 BaseAgent 类派生了一个 DerivedAgent 类,这个派生出的 Agent 只是打印出一句问候,通过重载 run()可以达到这个目的。
在测试文件的主函数 main()中 ,新 建 一 个 DerivedAgent 对 象 ,调 用 它 的 start()方 法 ,则 会 新 建 这 个 DerivedAgent 对 象 的 线 程 ,进 而执行这个 DerivedAgent 对象的 run()方法。
1 面向 Agent 编程的基本概念
文献[1]将 Agent 定义为一种“基于某种场景,并具有灵活、自主的行为能力,以满足设计目标的计算机系统”。 一个为理论界所接受的 Agent 需要具有如下若干特征: 自主性(Autonomy)。 Agent 的运行无需人类或其它 Agent 的直接干预,并能对其自身行为及内部状态进行某种控制。 社会性(Social Ability)。 能通过某种 Agent 通信语言与其它 Agent(也 可 能 是 人 类)进 行 交 互 。 交 互 主 要 有 三 种 类 型 :协 作(Cooperation)、 协 调 (Coordination) 和 协 商 (Negotiation) 。 反应性(Reactivity)。 能感知它们的环境,并能对环境的变化及时做出反应。 主动性(Pro-activeness)。 Agent 不但能对环境做出反应,而且它们能够积极主动地做出使其目标得以实现的行为。
5626 软件设计开发
本栏目责任编辑:谢媛媛
第 7 卷第 23 期 (2011 年 8 月)
Computer Knowledge and Technology 电脑知识与技术
void run(); }; void DerivedAgent::run() {cout<<"Hello, Derived Thread! "<<endl; } int main(int argc, char *argv[]) {DerivedAgent *da = new DerivedAgent (); da->start(); WaitForSingleObject(dt->getThread(), INFINITE); } 如 果 新 建 多 个 DerivedAgent 对 象 ,那 么 就 可 以 建 立 一 个 多 Agent 应 用 程 序 ;如 果 从 BaseAgent 派 生 出 不 同 的 子 类 ,就 可 以 控 制 Agent 的不同行为。
BaseAgent 类的主要代码如下: #include <process.h> #include <iostream> 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 << "This is Base Thread! " << endl; } 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 方法在分析问题、解决问题的方式上 有比较大的差异,这些在实践中应当注意。