0

我有一个非常简单的问题,但我似乎无法弄清楚。我认为这是与元胞自动机中的邻居检查有关的逻辑错误。这是我的代码,每秒运行一次,用于增长和检查邻居:

public void grow(){
    Cell[][] next = new Cell[100][100];
    for(int row = 0; row < (SIZE_X/SIZE); row++){
        for(int col = 0; col < (SIZE_Y/SIZE); col++){
            Cell cell = grid[row][col]; 
            Cell nCell = grid[row][col]; // gets 

            if(cell != null){
                int amount = neighbors(row, col); // find out how many neighbors are ALIVE/ON

                if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off
                    nCell.onOff(false);
                else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on
                    nCell.onOff(true);

                next[row][col] = nCell;
            }
        }
    }
    grid = next;
}

public int neighbors(int row, int col){ // checks the amount of neighbors that are ALIVE/ON
    int amount = 0;

    for(int r = row-1; r <= row+1; r++){ // stepping through a 3x3 area of the grid, which surrounds the selected block
        for(int c = col-1; c <= col+1; c++){

            // clamp
            if((r > 0 && r < 99) && (c > 0 && c < 99)){
                if(grid[r][c].isOn() == true && (r != row && c != col)) // checks if the current neighbor is ALIVE/ON 
                    amount++; // if it is then add one to the count
            }
        }
    }
    return amount;
}

我在我的元胞自动机中使用了一个简单的 12345/3(生存/出生)规则。

目前的问题是我有一个 100x100 的网格,中心有一个 10x10 的 ALIVE/ON 单元格空间。在我的代码运行一次后,所有的细胞都死了。

如果有人需要更多信息,请随时询问。提前致谢!

4

3 回答 3

0

有一些问题,但我不确定结果如何一切都死了。

第一个问题:

if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off
  cell.onOff(false);
if(cell.isOn() == false && (amount >=1 && amount <= 5)) // if it is off and has 1-5 alive neighbors it gets turned on
  cell.onOff(true);

假设小区有 1 个活邻居。然后第一个子句将其关闭,然后第二个子句将其重新打开。所以“死亡”规则不起作用。解决方案:使用else if.

第二个问题:

您在同一个地方检查所有内容。例如该字段是:

**.
*.*

我们检查单元格(0,0),然后字段是:.*。 .

然后在检查所有第一行之后,该字段是: ... 然后每个人都死了。:) 解决方案:首先检查每个单元格的邻居编号并将其存储在每个单元格中。只有在那之后才能按规则打开和关闭它们。

第三个问题:在场边缘,一些邻居被检查了两次。例如 cell(0,0)已打开,我们检查邻居是否有 cell (0,1)。首先我们尝试(-1, 0)将其更改为(0,0)并添加到数量。后来(0,0)再次检查为左邻并再次添加到数量。

于 2016-11-03T14:25:10.893 回答
0
if(grid[r][c].isOn() == true && (r != row && c != col))

在这里,您只会考虑与中心单元格不在同一行和列上的邻居。结果,您考虑的是 4 个单元而不是 8 个。您可能是这个意思:

if(grid[r][c].isOn() == true && (r != row || c != col)
于 2016-12-28T10:52:27.790 回答
-1

所以我实施了一些改变,解决了你谈到的问题。然而,另一个问题出现了,现在它在起始块的右侧形成了一个巨大的金字塔,并在看似没有韵律或理由的情况下慢慢长大。iv 更新了我的代码

细胞是一类吗?因为您直接从网格分配 nCell。如果您通过引用执行此操作,您还会更改旧网格视图中单元格的值。这样做将创建倾向于扩散到网格右下角的模式。

编辑:刚刚意识到这是Java,上面可能不是真的。如果是这种情况,请忽略这一点。

EDIT2:另外:

                 if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned
 off
                     nCell.onOff(false);
                 else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on
                    nCell.onOff(true);

这不符合 1-5 生存 3 出生规则。

于 2017-06-22T08:50:30.203 回答