13.3. Fitness Landscape¶
The function that maps from genotype to fitness is called a fitness landscape. In the landscape metaphor, each genotype corresponds to a location in an
N-dimensional space, and fitness corresponds to the “height” of the landscape at that location.
In biological terms, the fitness landscape represents information about how the genotype of an organism is related to its physical form and capabilities, called its phenotype, and how the phenotype interacts with its environment.
In the real world, fitness landscapes are complicated, but we don’t need to build a realistic model. To induce evolution, we need some relationship between genotype and fitness, but it turns out that it can be any relationship. To demonstrate this point, we’ll use a totally random fitness landscape.
Here is the definition for a class that represents a fitness landscape:
class FitnessLandscape: def __init__(self, N): self.N = N self.one_values = np.random.random(N) self.zero_values = np.random.random(N) def fitness(self, loc): fs = np.where(loc, self.one_values, self.zero_values) return fs.mean()
The genotype of an agent, which corresponds to its location in the fitness landscape, is represented by a NumPy array of zeros and ones called
loc. The fitness of a given genotype is the mean of
N fitness contributions, one for each element of
To compute the fitness of a genotype,
FitnessLandscape uses two arrays:
one_values, which contains the fitness contributions of having a 1 in each element of
zero_values, which contains the fitness contributions of having a 0.
fitness method uses
np.where to select a value from
loc has a 1, and a value from
loc has a 0.
As an example, suppose
one_values = [0.1, 0.2, 0.3] zero_values = [0.4, 0.7, 0.9]
In that case, the fitness of
loc = [0, 1, 0] would be the mean of
[0.4, 0.2, 0.9], which is