1

我正在尝试在 Repast Java Suite 中编写 ABM,并为此使用 3D 网格。关于网格的两个问题:1)我想为网格中的每个 (x,y) 组合分配一个函数值 - 例如,对于每个 f(x,y)=x+y。因此,当代理在点 (x,y) 时,它会知道对应的 z 值是 z=f(x,y)=x+y。如何将数据层分配给网格来做到这一点?

2)同样对于同一个网格,代理应该能够知道是否访问了特定的补丁。每当代理访问该补丁时,它将被更新。

一般来说,我的问题是将其他方法、数据等分配给网格接口。由于这是我的模拟的一个基本问题,如果不解决它,我将无法继续前进.. 非常感谢答案.. 谢谢!

4

1 回答 1

0

a)听起来您可能想要GridValueLayer在 2D 网格上,而不是 3D 网格上。如果您希望代理能够在 3 维空间中移动,则使用 3D 网格,但如果它们在 2D 空间中移动,则使用 2D 网格,即使您希望它们随后读取每个位置的值。

GridValueLayer 可用于 n 维网格并为每个单元格保存一个值(由 n 个 int 值指定的位置)。对于您的示例,您可能希望 GridValueLayer 为 2D 网格中的每个单元格保存值 x+y。

例如

int[] dimensions = new int[]{xMax, yMax};
AbstractGrid  myBasicGrid = new AbstractGrid("exampleGrid", new SimpleGridAdder(), new WrapAroundBorders(), new SingleOccupancyCellAccessor(), dimensions);
GridValueLayer mySimpleGridValueLayer = new GridValueLayer("simpleAddLayer",true,dimensions);

for (int i = 0; i < xMax, i++)
{
    for (int j = 0; j < yMax, j++)
    {
        int[] coord = new int[]{i,j};
        mySimpleGridValueLayer.set(i+j, coord);
    }
}

b) 这可以通过多种方式完成。我再次建议使用 GridValueLayer。在代理代码中,在您移动到网格中的某个点时,将该坐标的 GridValueLayer 设置为 1。

最后一点。您可以实现自己的网格。只要符合Repast的Grid接口,也可以扩展AbstractGrid。例如,如果您扩展 AbstractGrid,然后有方法 getSum(int... coords),它只返回 coords 数组和 getVisited(int... coords) 的总和来解决您的问题。您还可以使其实现ProjectionListener接口,侦听 OBJECT_MOVED 类型的 ProjectionEvent,然后将该位置的visited 值设置为true。

于 2014-08-07T12:16:09.900 回答