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。