最近我发现了一个使用repast query() 方法的大问题。我发现它比使用简单的手动迭代方法来获取特定代理集要慢得多。以具有相同“hub_code”的所有集线器的包对象查询为例,我使用查询和手动迭代方法进行了测试:
public void arrival_QueryApproach() {
try {
if (this.getArr_time() == this.getGs().getTick()) {
Query<Object> hub_query = new PropertyEquals<Object>(context, "hub_code", this.getSrc());
for (Object o: hub_query.query()) {
if (o instanceof Hub) {
((Hub)o).getDepature_queue().add(this);
this.setStatus(3);
this.setCurrent_hub(this.getSrc());
break;
}
}
}
}
catch (Exception e) {
System.out.println("No hub identified: " + this.getSrc());
}
}
public void arrival_ManualApproach() {
try {
if (this.getArr_time() == this.getGs().getTick()) {
for (Hub o: gs.getHub_list()) {
if (o.getHub_code().equals(this.getSrc())) {
((Hub)o).getDepature_queue().add(this);
this.setStatus(3);
this.setCurrent_hub(this.getSrc());
break;
}
}
}
}
catch (Exception e) {
System.out.println("No hub identified: " + this.getSrc());
}
}
执行速度有很大不同。我的模型中有 50000 个包和 350 个集线器对象。使用内置查询功能平均需要 1 分 40 秒来运行 1600 个滴答声,而使用手动迭代方法只需要 5 秒。造成这种巨大差异的原因是什么以及为什么查询工作如此缓慢?相反,它在逻辑上应该运行得更快。
与查询方法相关的另一个问题是“PropertyGreaterThanEquals”或“PropertyLessThanEquals”的运行速度比使用“PropertyEquals”方法慢得多。下面是另一个关于查询适合卡车卸货的码头的简单示例。
public void match_dock() {
// Query<Object> pre_fit = new PropertyGreaterThanEquals(context, "unload_speed", 240);
// Query<Object> pre_fit = new PropertyLessThanEquals(context, "unload_speed", 240);
Query<Object> pre_fit = new PropertyEquals(context, "unload_speed", 240);
for (Object o : pre_fit.query()) {
if (o instanceof Dock) {
System.out.println("this dock's id is: " + ((Dock)o).getId());
}
}
}
模型中只有 3 个码头和 17 个卡车对象。如果使用“PropertyEquals”,总共运行 1920 个滴答只需要不到一秒的时间;但是,如果选择查询方法“PropertyGreaterThanEquals”或“PropertyLessThanEquals”,我总共花了 1 分钟多的时间来运行 1920 个刻度。从这个意义上说,我必须再次遍历所有对象(码头)并手动执行大于查询?这似乎是另一个影响模型执行速度的问题?
我正在使用 java 版本“11.0.1”2018-10-16 LTS Java(TM) SE Runtime Environment 18.9(内部版本 11.0.1+13-LTS)我的 Eclipse 编译器级别为 10。安装的 JRE(默认)JDK 11。
感谢您提供有用的建议。