有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Repast聚合数据集,但在Repast Simphony中分别针对每个实例

我正在使用Repast Simphony框架进行模拟。假设我有以下课程:

public class Generator {

    private String name;
    private Random random;

    public Generator(String name) {
        this.name = name;
        this.random = new Random();
    }

    public double getValue() {
        return random.nextDouble();
    }

}

然后我创建了这个类的几个实例,将它们添加到上下文中并运行模拟:

public class Builder implements ContextBuilder<Object> {

    @Override
    public Context build(Context<Object> context) {
        context.add(new Generator("Gen1"));
        context.add(new Generator("Gen2"));
        context.add(new Generator("Gen3"));

        return context;
    }

}

有没有办法收集聚合数据,但要分别针对类的每个实例?我想找出每个生成器生成的所有值的平均值,所以输出统计数据应采用以下格式:

Name,Mean
Gen1,0.458
Gen2,0.512
Gen3,0.463

如果我用方法数据源Generator.getValue创建新的聚合(平均)数据集,并重复每个勾号,我会得到一个大的值列表:

Tick,Mean
1,0.365
2,0.456
3,0.728
4,0.091
...

其中每个值都是平均值,但所有生成器的指定刻度值的平均值,而不是一个生成器的所有刻度值的平均值。有没有什么方法可以用Repast Simphony做到这一点

编辑:当我想使用自定义数据源时,添加class Generator implements AggregateDataSource和添加方法:

@Override
public String getId() {
    return name;
}

@Override
public Class<?> getDataType() {
    return Double.class;
}

@Override
public Class<?> getSourceType() {
    return Generator.class;
}

@Override
public Object get(Iterable<?> objs, int size) {
    return 7.0; // Not mean, only mock value for testing.
}

@Override
public void reset() {
    // TODO Auto-generated method stub
}

出现错误:

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    我认为您可以通过定义一个自定义聚合数据源来实现这一点。可以通过“自定义数据源”选项卡添加一个,提供一个实现AggregateDataSource的类

    https://repast.github.io/docs/api/repast_simphony/repast/simphony/data2/AggregateDataSource.html

    在get()方法中,遍历所有生成器对象并按名称获取平均值。每个生成器都需要AggregateDataSource实现。如果您使用一些静态变量,您可能可以对其进行编码,这样您只需要迭代一次,就可以得到该刻度的所有生成器的平均值。不过,在你让它工作之前,我会一直这样做

    更新:

    您应该为CustomDataSource创建一个不同的类,以避免混淆。get中的iterable应该允许您迭代生成器的所有实例。此外,当您需要提供完全限定名时,包+类名,例如x.y.MyCustomDataSource