【问题标题】:Repast aggregated dataset, but for each instance separately in Repast SimphonyRepast 聚合数据集,但在 Repast Simphony 中分别针对每个实例
【发布时间】:2020-10-17 16:49:58
【问题描述】:

我正在使用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
}

出现错误:

【问题讨论】:

  • 您是在寻找模拟结束时每个实例的一个值(即平均值)还是一个运行平均值?
  • @J.Ozik 我正在为模拟结束时的每个实例寻找一个值(平均值)。

标签: java simulation mean repast-simphony


【解决方案1】:

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

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

在 get() 方法中,您遍历所有 Generator 对象并按名称获取平均值。每个生成器都需要一个 AggregateDataSource 实现。如果您使用一些静态变量,您可能可以对其进行编码,以便您只需要迭代一次并获得该滴答的所有生成器的平均值。我会留下它,直到你让它工作为止。

更新:

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

【讨论】:

  • 谢谢。我尝试了 AggregateDataSource,但出现错误。我在原始帖子的末尾添加了更多细节。是否需要执行任何其他步骤才能将该类用作自定义数据源?
  • 你需要使用全限定名——包名+类名。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
相关资源
最近更新 更多