Repast 聚合数据集,但在 Repast Simphony 中分别针对每个实例
Repast aggregated dataset, but for each instance separately in Repast Simphony
我正在使用 Repast Simphony 框架进行模拟。假设我有以下 class:
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();
}
}
然后我创建了这个 class 的几个实例,将它们添加到上下文中并 运行 模拟:
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;
}
}
有没有什么方法可以收集汇总数据,但对 class 的每个实例单独收集数据?我想找出每个生成器的所有生成值的平均值,因此输出统计信息应采用以下格式:
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
}
出现错误:
我认为您可以通过定义自定义聚合数据源来做到这一点。您可以通过“自定义数据源”选项卡添加一个,提供实现 AggregateDataSource 的 class。
https://repast.github.io/docs/api/repast_simphony/repast/simphony/data2/AggregateDataSource.html
在 get() 方法中,您遍历所有 Generator 对象并通过名称获取平均值。每个生成器都需要一个 AggregateDataSource 实现。如果您使用一些静态变量,您可能可以对其进行编码,以便您只需要迭代一次并获得该刻度的所有生成器的平均值。我会保留它,直到你让它工作为止。
更新:
您应该为 CustomDataSource 创建一个不同的 class 以避免混淆。 get 中的可迭代对象应该允许您迭代 Generator 的所有实例。此外,当您需要提供完全限定名称时——包 + class 名称——例如x.y.MyCustomDataSource
我正在使用 Repast Simphony 框架进行模拟。假设我有以下 class:
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();
}
}
然后我创建了这个 class 的几个实例,将它们添加到上下文中并 运行 模拟:
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;
}
}
有没有什么方法可以收集汇总数据,但对 class 的每个实例单独收集数据?我想找出每个生成器的所有生成值的平均值,因此输出统计信息应采用以下格式:
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
}
出现错误:
我认为您可以通过定义自定义聚合数据源来做到这一点。您可以通过“自定义数据源”选项卡添加一个,提供实现 AggregateDataSource 的 class。
https://repast.github.io/docs/api/repast_simphony/repast/simphony/data2/AggregateDataSource.html
在 get() 方法中,您遍历所有 Generator 对象并通过名称获取平均值。每个生成器都需要一个 AggregateDataSource 实现。如果您使用一些静态变量,您可能可以对其进行编码,以便您只需要迭代一次并获得该刻度的所有生成器的平均值。我会保留它,直到你让它工作为止。
更新:
您应该为 CustomDataSource 创建一个不同的 class 以避免混淆。 get 中的可迭代对象应该允许您迭代 Generator 的所有实例。此外,当您需要提供完全限定名称时——包 + class 名称——例如x.y.MyCustomDataSource