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

Repast Java: Problem of Creating Multiple types of Custom Edge

只创建一个自定义边的原始解决方案在这里:

1).现在我需要创建不止一种类型的自定义边作为唯一代理(例如,在我的模型中我有路由代理、供应-link 代理、关系-link 代理)。我是否必须再次重复link中描述的上述过程? (即添加另一个专用的 CustomEdgeCreator class 和具有不同名称的 CustomEdge class),或者是否有更有效的方法?

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

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

以上问题引出了一个重要的问题:边缘 class 与普通智能体 class 有何不同?

关于你的第一点: 由于您将每个网络投影与特定的 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;
    }

}

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