Varying the Neighbourhood Size

The size of the cell neighbourhood can be varied by setting the parameter `r` when calling the `evolve()` function. The value of `r` represents the number of cells to the left and to the right of the cell under consideration. Thus, to get a neighbourhood size of 3, `r` should be 1, and to get a neighbourhood size of 7, `r` should be 3. As an example, consider the work of M. Mitchell et al. involving the creation (discovery) of a cellular automaton that solves the density classification problem: if the initial random binary vector contains more than 50% of 1s, then a cellular automaton that solves this problem will give rise to a vector that contains only 1s after a fixed number of time steps, and likewise for the case of 0s. A very effective cellular automaton that solves this problem most of the time was found using a Genetic Algorithm.

```import cellpylib as cpl

cellular_automaton = cpl.init_random(149)

# Mitchell et al. discovered this rule using a Genetic Algorithm
rule_number = 6667021275756174439087127638698866559

# evolve the CA, setting r to 3, for a neighbourhood size of 7
cellular_automaton = cpl.evolve(cellular_automaton, timesteps=149,
apply_rule=lambda n, c, t: cpl.binary_rule(n, rule_number),
r=3)

cpl.plot(cellular_automaton)
```

Alternatively, the `BinaryRule` class can be used:

```cellular_automaton = cpl.evolve(cellular_automaton, timesteps=149,
apply_rule=cpl.BinaryRule(rule_number), r=3)
```

References:

Melanie Mitchell, James P. Crutchfield, and Rajarshi Das, “Evolving Cellular Automata with Genetic Algorithms: A Review of Recent Work”, In Proceedings of the First International Conference on Evolutionary Computation and Its Applications (EvCA’96), Russian Academy of Sciences (1996).