2

仅创建一个自定义边缘的原始解决方案如下: Repast Java:创建自定义边缘代理以安排特定操作

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

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

在此处输入图像描述

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

在此处输入图像描述

在此处输入图像描述

上述问题引出了一个重要问题:边缘类与普通代理类有何不同?

4

1 回答 1

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

}

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

于 2019-10-22T14:32:37.933 回答