我面临的问题是,当运行一组解决一个简单问题的jade代理时,jvm会在90秒内运行堆空间,具体取决于运行的代理数量。代理的目标是在简化的微网格模型中平衡负载和生成,其中多个代理表示负载和另一代。
加载代理在每次迭代行为时使用新值更新生成器,如以下代码所示:
public class House9 extends Agent
{
double load = 50;
boolean offline = false;
boolean valid = true;
int counter = 0;
double cur = 50;
int next;
public void setup()
{
addBehaviour(new SimpleBehaviour(this)
{
public void action()
{
//Adjusting load value
if(counter == 0)
{
load = (int)load;
cur = load;
next = 20+(int)(Math.random()*80);
//System.out.println("current: " + cur + " next " + next);
counter++;
}
else if(counter <= 1000)
{
load = load + ((next - cur)/1000);
//System.out.println("added " + ((next - cur)/1000) +" to load");
counter++;
}
else
{
counter = 0;
}
//System.out.println("counter " + counter);
//Sending result to the generator agent
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
msg.setContent(Double.toString(load));
msg.addReceiver(new AID("gen", AID.ISLOCALNAME));
myAgent.send(msg);
}
public boolean done()
{
return offline;
}
});
}
所有加载代理都与此相同,生成代理如下:
public class Generator extends Agent
{
int output = 100;
long time = System.currentTimeMillis();
int iter = 0;
public void setup()
{
System.out.println("Iterations,Time");
addBehaviour(new CyclicBehaviour(this)
{
public void action()
{
//myAgent.setQueueSize(2);
int temp = output;
ACLMessage reply = receive();
if(reply != null)
{
int load = Integer.parseInt(reply.getContent());
//System.out.println("current state--- output: " + output + " load: " + load);
if(load > output)
{
iter = 0;
while(load > output)
{
output = output + 10;
iter++;
}
//System.out.println((System.currentTimeMillis()-time)+ "," + iter );
}
else if(load < output)
{
iter = 0;
while(load < output)
{
output = output - 10;
iter--;
}
//System.out.println((System.currentTimeMillis()-time)+ "," + iter );
}
System.out.println((System.currentTimeMillis()-time)+ "," + iter + "," + load + "," + temp + "," + myAgent.getCurQueueSize());
}
}
});
}
}
从互联网上的其他帖子关于这种事情,我尝试限制生成代理的消息队列大小,以防占用堆空间,同时清除每个生成器行为结束时的玉消息队列迭代。但是这些似乎都没有任何区别,我尝试添加更多的堆空间,但这只会将内存不足异常延迟一分钟左右。玉石引擎被召唤,玉gu通过netbeans发起。
我是多代理编程和使用jade的新手,所以我可以理解可能有更好,更优化的方式来运行这种系统,而这本身就可以解释这个问题。但是会在这件事上得到一些帮助。
谢谢, Calum
答案 0 :(得分:0)
House9代理内部的行为没有任何终止条件。每次安排行为时,每个代理都会发送一条消息。由于您已覆盖done
方法,因此他们将继续循环发送消息的行为。
你的意思是发送这么多消息吗?消息之间应该有某种停顿吗?您的Generator
代理会尝试处理所有这些消息,但无法跟上队列中的负载。