Repast Java:创建多种类型的自定义边缘的问题

时间:2019-10-22 02:29:48

标签: repast-simphony

仅创建一个自定义边的原始解决方案在这里: Repast Java: Creating a custom edge agent to schedule specific actions

1)。现在,我需要创建多种类型的自定义边来充当唯一代理(例如,在我的模型中,我具有路由代理,供应链接代理,关系链接代理)。我是否必须重复链接中描述的上述过程? (即添加另一个专用的CustomEdgeCreator类和名称不同的CustomEdge类),还是有一种更有效的方法?

2)。给定上面僵尸模型中的示例,我注意到通过CustomEdgeCreator方法创建自定义边缘不会使边缘代理类在GUI中可见,这不便于跟踪与边缘代理相关的相关属性。

enter image description here

从边缘代理执行数据收集也无法正常工作。我已将每个边缘的权重设置为2,但图表中显示的总和为0。

enter image description here

enter image description here

以上问题导致一个重要问题:边缘类别与普通座席类别有何不同?

1 个答案:

答案 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;
    }

}

关于第二点: 除非您将创建的边添加到上下文中,否则它不会显示为真正的代理。因此,在创建网络链接后,您可以将其添加到上下文中,并且它应该同时显示在代理表中和用于数据收集的目的。