2016-11-03 2 views
0

J'ai un problème assez simple mais je n'arrive pas à le comprendre. Je crois que c'est une erreur de logique ayant à voir avec la vérification des voisins dans les automates cellulaires. Voici mon code qui fonctionne une fois par seconde pour la culture et la vérification voisins:Automates cellulaires vérifiant les voisins

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; 
} 

Im en utilisant un 12345/3 simple (survie/naissance) règle dans mon Cellular Automata. Le problème actuellement est que j'ai une grille de 100x100 avec un espace de 10x10 cellules ALIVE/ON dans le centre. Après que mon code s'exécute une fois, toutes les cellules meurent.

Si quelqu'un a besoin de plus d'informations, n'hésitez pas à demander. Merci d'avance!

Répondre

0

Il y a quelques problèmes mais je ne suis pas sûr de savoir comment tout est mort comme résultat.

Premier problème:

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); 

Supposons que la cellule a 1 voisin direct. Alors la première clause l'éteint et ensuite la seconde le rallume. Donc, la règle de la "mort" ne fonctionne pas. Solution: utilisez else if.

Deuxième problème:

Vous vérifiez tout au même endroit. Par exemple, le champ est:

**. 
*.* 

Nous contrôlons la cellule (0,0) et champ est:. *. .

Puis après tout la première ligne est sélectionnée, le champ est: ... . Alors tout le monde meurt. :) Solution: vérifiez d'abord le numéro du voisin pour chaque cellule et stockez-le dans chaque cellule. Seulement après cela les allumer et éteindre par les règles.

Et troisième problème: sur les bords du champ, certains voisins sont vérifiés deux fois. Par exemple, la cellule (0,0) est activée et nous vérifions les voisins pour la cellule (0,1). D'abord, nous essayons (-1, 0) qui est changé en (0,0) et ajouté à la quantité. Plus tard, (0,0) est à nouveau vérifié comme étant à gauche et ajouté de nouveau à la quantité.

+0

Désolé pour la réponse tardive. J'ai donc mis en place quelques changements qui ont résolu les problèmes dont vous avez parlé. Cependant, un autre problème est apparu: il s'agit maintenant d'une pyramide massive à droite des blocs de départ et qui se développe lentement avec apparemment aucune rime ou raison. Iv a mis à jour mon code –

0
if(grid[r][c].isOn() == true && (r != row && c != col)) 

Ici, vous ne considérerez que les voisins qui ne sont pas sur la même ligne AND colonne que votre cellule centrale. En conséquence, compte tenu de 4 cellules YOURE au lieu de 8. Vous avez probablement voulu dire cela:

if(grid[r][c].isOn() == true && (r != row || c != col) 
-1

Je mis en œuvre un certain changé, ce qui a résolu les problèmes dont vous avez parlé au sujet . Un autre problème a surgi cependant, qui est maintenant il fait une pyramide massive à la droite des blocs de départ et grandit lentement avec apparemment aucune rime ou raison. Iv a mis à jour mon code

Est-ce que Cell est une classe? Parce que vous affectez nCell directement à partir de la grille.Si vous faites cela par référence, vous modifiez également la valeur de la cellule dans l'ancienne grille. Cela créera des motifs qui ont tendance à se propager dans le coin inférieur droit de la grille.

EDIT: Je viens de réaliser que c'est Java, et ce qui précède peut ne pas être vrai là-bas. Ne tenez pas compte de cela si c'est le cas.

EDIT2: Aussi:

    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); 

Cela ne cadre pas avec la survie 1-5 3 règle de naissance.