Use Moran processesΒΆ

Moran processes are implemented in Nashpy as a method on the Game class:

>>> import nashpy as nash
>>> import numpy as np
>>> A = np.array([[3, 1], [1, 2]])
>>> game = nash.Game(A)

The moran_process method returns a generator of a given collection of generations:

>>> np.random.seed(0)
>>> generations = game.moran_process(initial_population=(0, 0, 1))
>>> for population in generations:
...     print(population)
[0 0 1]
[0 1 1]
[0 1 1]
...
[0 1 1]
[1 1 1]

Note that this process is stochastic:

>>> np.random.seed(2)
>>> generations = game.moran_process(initial_population=(0, 0, 1))
>>> for population in generations:
...     print(population)
[0 0 1]
[0 0 1]
[0 0 0]

It is possible to pass a mutation_probability to the process in which case it will not terminate:

>>> np.random.seed(2)
>>> number_of_generations = 5
>>> mutation_probability = 1
>>> generations = game.moran_process(initial_population=(0, 0, 1), mutation_probability=mutation_probability)
>>> for _ in range(number_of_generations):
...     print(next(generations))
[0 0 1]
[1 0 1]
[1 1 1]
[0 1 1]
[0 1 0]

Currently, only non-negative valued matrices are supported:

>>> A = np.array([[3, -1], [1, 2]])
>>> game = nash.Game(A)
>>> generations = game.moran_process(initial_population=(0, 0, 1))
>>> for population in generations:
...     print(population)
Traceback (most recent call last):
 ...
ValueError: Only non negative valued payoff matrices are currently supported