仅创建一个自定义边的原始解决方案在这里: Repast Java: Creating a custom edge agent to schedule specific actions
1)。现在,我需要创建多种类型的自定义边来充当唯一代理(例如,在我的模型中,我具有路由代理,供应链接代理,关系链接代理)。我是否必须重复链接中描述的上述过程? (即添加另一个专用的CustomEdgeCreator类和名称不同的CustomEdge类),还是有一种更有效的方法?
2)。给定上面僵尸模型中的示例,我注意到通过CustomEdgeCreator方法创建自定义边缘不会使边缘代理类在GUI中可见,这不便于跟踪与边缘代理相关的相关属性。
从边缘代理执行数据收集也无法正常工作。我已将每个边缘的权重设置为2,但图表中显示的总和为0。
以上问题导致一个重要问题:边缘类别与普通座席类别有何不同?
答案 0 :(得分:3)
关于您的第一点: 由于您要将每个网络投影与特定的EdgeCreator实例相关联,因此有可能使EdgeCreator构造函数接受您希望该网络投影创建的Link类型。这可能会使事情更加简化。
在此处添加请求的示例:
package jzombies;
import repast.simphony.space.graph.EdgeCreator;
import repast.simphony.space.graph.RepastEdge;
public class CustomEdgeCreator<E extends RepastEdge<T>, T> implements EdgeCreator<E, T> {
private Class<E> e;
public CustomEdgeCreator(Class<E> e) {
this.e = e;
}
@Override
public Class<E> getEdgeType() {
return e;
}
@Override
public E createEdge(T source, T target, boolean isDirected, double weight) {
try {
return e.getDeclaredConstructor(new Class[]{Object.class, Object.class, boolean.class, double.class}).newInstance(source, target, isDirected, weight);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
关于第二点: 除非您将创建的边添加到上下文中,否则它不会显示为真正的代理。因此,在创建网络链接后,您可以将其添加到上下文中,并且它应该同时显示在代理表中和用于数据收集的目的。