2015年6月3日星期三

Multi-agent platform 之 Jade 学习笔记 2

这篇是学习完Jade文档JADEProgramming-Tutorial-for-beginners.pdf后的总结。

1. Jade平台
   Jade是用来开发Multi-Agent System的中间件,包括3部分:
   a. 一个运行环境,
   b. 一个Java库
   c. 一套开发图形界面的工具。

一个Jade Multi-Agent系统是由容器(container)和平台(platform)构成的。一个Jade runtime environment的运行实例叫做一个容器。一般来说,一台电脑运行Jade runtime environment后可以视为一个container。因为agent的后缀名字如“@172.18.23.255:1099/JADE”是和电脑地址和端口相关的,所以要想在一台电脑上创建多个container需要其他办法。

多个激活的container就组成了一个平台(platform)。一个平台只有一个Main container,默认情况下,第一个container就自动成为Main container。其他container要加入这个平台,需要知道Main container的地址和端口(host and port),如
java -cp <classpath> jade.Boot -container -host avalon.tilab.com -agents john:myPackage.myClass
就是把当前计算机上的container注册到host为avalon.tilab.com(port默认为1099)的main container上去,并在本地container上创建一个叫做john的myPackage.myClass agent。

Main container区别于其他容器地方,是因为它有两个特殊的agent,一个是AMS(Agent Management System),另一个是DF(Directory Facilitator)。AMS用于提供agent的命名服务和管理agent,DF就像一个黄页本,agent可以通过它查找发现其他agent提供的服务。

Agent间的通讯是灵活的,包括同一个容器内agent间通讯(A2和A3),同一个平台不同容器内agent间通讯(A1和A2),不同平台上agent间通讯(A4和A5)。



2.Agent创建和运行

当一个Agent实例创建后,它首先会调用setup()方法,这个方法一般用来添加agent之后要执行的动作(behaviour),这些添加的动作会按添加顺序排入队列(queue)中(在下图队列被称作pool)。当setup()完成后,agent进入Active状态,也就是循环查看并运行队列中的动作。

当一个队列中的动作b被选出后,就会调用它的b.action()来执行,然后用b.done()来检查这个动作是否完成。

动作种类有多种,如One-shot behaviours, cyclic behaviours 和 generic behaviours,以及定时动作,如WakerBehaviour和TickerBehaviour。

当队列中没有任何动作后,agent还是回持续不断的查看。只有调用了doDelete()方法,agent才会结束。在结束前,agent会调用takeDown(),用来做一些清理工作。


3.Agent间通讯

Agent A1 准备好message,然后发送给agent A2,这时message会压入message队列中,然后通过获取操作,A2从message队列中提取message。

一般来说,接收端的agent要用循环动作CyclicBehaviour来循环检查信箱
public void action() {
MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.INFORM);
ACLMessage msg = myAgent.receive(mt);
if (msg != null) {
System.out.println("Received Message: " + msg.getContent() + " --- from " + msg.getSender().getName());
}
else {
block();
}
}

当没有message时,block()方法就会让接收agent的线程休眠,当新的message被压入message队列后,线程重新激活。

package test;

import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.OneShotBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;

public class MySender extends Agent {
protected void setup() {
addBehaviour(new SendMessage());
}

protected void takeDown() {
System.out.println("MySender-agent "+getAID().getName()+" terminating.");
}

private class SendMessage extends OneShotBehaviour {
public void action() {
ACLMessage info = new ACLMessage(ACLMessage.INFORM);
AID receiver = new AID("receiver",AID.ISLOCALNAME);
info.addReceiver(receiver);
info.setContent("Hello World!");
info.setConversationId("conmmunication");
myAgent.send(info);
myAgent.send(info);
myAgent.send(info);

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

myAgent.send(info);
}
}
}




package test;

import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;

public class MyReceiver extends Agent {
protected void setup() {
addBehaviour(new ReceiveMessage());
}

protected void takeDown() {
System.out.println("MyReceiver-agent "+getAID().getName()+" terminating.");
}

private class ReceiveMessage extends CyclicBehaviour {
public void action() {
MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.INFORM);
ACLMessage msg = myAgent.receive(mt);
if (msg != null) {
System.out.println("Received Message: " + msg.getContent() + " --- from " + msg.getSender().getName());
}
else {
block();
}
}
}
}








2014年3月12日星期三

Simulink 中(embedded)MATLAB Function 设置global 全局变量

有两种方法,参看matlab help

这里只翻译第一种:
1. 在simulink模型中加入MATLAB Function 模块。
2. 双击并编辑模块。
3. 在其中申明全局变量,如 global A;
4. 在simulink library browser中搜索Data Store Momery并在模型中添加此模块。
   a. 双击此模块,在Data store name 中填入全局变量名,如 A。
   b. 在Signal Attributes中选择合适的Data type,不可以选择auto。
   c. 设置Signal type。
   d. 必须填入初始值initial value。
5. 在MATLAB Function中注册全局变量:
   a. 双击MATLAB Function,在Editor选项卡中点击Edit Data。
   b. 点击新增数据Add Data, 变量名为全局变量名,如 A。Scope选择Data Store Memory

2013年12月12日星期四

Python 环境搭建 (numpy, scipy, SymPy , ipython, matplotlib...)

1. 安装python2.7 32位 版本
   http://www.python.org/ftp/python/2.7.6/python- 2.7.6.msi
(很多lib都支持2.7的32位版本,如果安装64位,很多lib安装时都会说在注册表中无法找到python2.7  Python Version 2.7 required which was not found in the registry, 所以最好把python 和 第三方库文件都安装成32位

2. 安装setuptools 2.0
   下载运行ez_setup.py,(把这个文件拷到其他盘上再运行,不要直接在桌面上运
   行)查看D:\Programming\Python27\Scripts 中是否有easy_install.exe, 若有则安装成功,把D:\Programming\Python27\Scripts添加到环境变量path中)。
   之后就可以用easy_install命令安装其他第三方库文件了。

3. 下载安装numpy: numpy-1.8.0-win32-superpack-python2.7.exe

4. 下载安装scipy:scipy-0.13.2-win32-superpack-python2.7.exe

5. 下载安装sympy:sympy-0.7.4.win32.exe (注意:安装时要以管理员身份运行/Run as administrator)

6. 下载安装matplotlib: matplotlib-1.3.1.win32-py2.7.exe
   安装好后测试:
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.ylabel('some numbers')
plt.show()

若报错,到http://www.lfd.uci.edu/~gohlke/pythonlibs/上下载相应的软件包(如dateutilpyparsingsix)

7. 下载安装ipython:ipython-1.1.0.py2-win32.exe


其实也可以直接下载 Anaconda (Anaconda-1.8.0-Windows-x86.exe),一个准商业级的python安装管理软件,该有的科学计算包都有:numpy,sicpy,matplotlib,spyder.....

2013年11月27日星期三

Matlab 把 figure 保存成 pdf (页面大小和图片大小一致)

1. 下载并安装Pdf Creator(免费)http://sourceforge.net/projects/pdfcreator/
   在安装时注意选expert选项,这样可以安装Pdf 打印机
2. 在matlab figure中点击print preview,在其中调整页面大小使得与图片大小一致(刚好    包括图片)。最好把设置保存,以方便下次设置页面。
3. 点击print,在打印机那栏选PDF creator 打印机 就ok啦!

latex 空格

两个quad空格a \qquad ba \qquad b两个m的宽度
quad空格a \quad ba \quad b一个m的宽度
大空格a\ ba\ b1/3m宽度
中等空格a\;ba\;b2/7m宽度
小空格a\,ba\,b1/6m宽度
没有空格abab\,
紧贴a\!ba\!b缩进1/6m宽度

2013年11月20日星期三

双面打印并且一面打印两页内容设置

快速打印设置页面不要改动,


单击 properties,选择Finishing,在页面中勾选Print On Both Sides, Preserve Layout, Pages per Sheet 中选 2 pages per sheet, Orientation 选 Portrait. 最好把设置保存方便下次使用。
点击OK后,在快速打印设置中会自动选择Print on both sides of page 和 flip on short edge.

 (如果快速打印设置中没有Print on both sides of page选项,可以参看http://marstnt.blogspot.fr/2013/11/blog-post.html

2013年11月12日星期二

打印机无法删除打印文件或删除很慢之解决



源地址: http://blog.renren.com/GetEntry.do?id=704022080&owner=161319322






打印PPT时,经常遇到打出了一张很大字的页面问题,浪费很多纸张,赶紧把纸盒抽出,然后选择打开打印机→删除文档,可是删除的时候,总是要等很久,有时候还被迫重启电脑,今天学到了一个好办法,与大家分享。


一 快速删除打印机任务


1 在控制面板→管理工具→服务中,停止Print Spooler服务。


2 在C盘→Windows→System32→spool→Printers,删除两个临时文件。


3 在控制面板→管理工具→服务中,启动Print Spooler服务。


不到10秒钟,任务就被删除得干干净净。


二 每页打印9张幻灯片,且空隙很小


1 点击“打印”;


2 点击打印机名称右侧的“属性”;


3 点击页面上边“完成”;


4 在下面的每张页数选“每张9页”


5 右侧的方向,选择“横向”;


6 点击“确定”。


7 点击打印窗口的“确定”。