13.6. No Differentiation¶
Before we run the simulation, we have to specify the behavior of
choose_replacements. We’ll start with simple versions of these functions that don’t depend on fitness:
# class Simulation def choose_dead(self, fits): n = len(self.agents) is_dead = np.random.random(n) < 0.1 index_dead = np.nonzero(is_dead) return index_dead
n is the number of agents and
is_dead is a boolean array that contains
True for the agents who die during this time step. In this version, every agent has the same probability of dying: 0.1.
np.nonzero to find the indices of the non-zero elements of
True is considered non-zero).
# class Simulation def choose_replacements(self, n, fits): agents = np.random.choice(self.agents, size=n, replace=True) replacements = [agent.copy() for agent in agents] return replacements
n is the number of agents who reproduce during this time step. It uses
np.random.choice to choose
n agents with replacement. Then it invokes
copy on each one and returns a list of new
These methods don’t depend on fitness, so this simulation does not have differential survival or reproduction. As a result, we should not expect to see evolution. But how can we tell?