Use asymmetric replicator dynamicsΒΆ

This algorithm that is implemented in Nashpy is called Asymmetric replicator dynamics and is implemented as a method on the Game class:

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

The asymmetric_replicator_dynamics method returns the strategies of both the row player and the column player over time:

>>> xs, ys = game.asymmetric_replicator_dynamics()
>>> xs
array([[0.5       , 0.5       ],
       [0.49875..., 0.50124...],
       [0.49752..., 0.50247...],
       ...,
       [0.41421..., 0.58578...],
       [0.41421..., 0.58578...],
       [0.41421..., 0.58578...]])
>>> ys
array([[5.00000...e-01, 5.00000...e-01],
       [4.94995...e-01, 5.05004...e-01],
       [4.89991...e-01, 5.10008...e-01],
       ...,
       [2.28749...e-09, 9.99999...e-01],
       [2.24298...e-09, 9.99999...e-01],
       [2.19926...e-09, 9.99999...e-01]])

It is also possible to pass x0 and y0 arguments to assign the initial strategy to be played. Otherwise the probability is divided equally amongst all possible actions for both x0 and y0. Additionally, a timepoints argument may be passed that gives the algorithm a sequence of timepoints over which to calculate the strategies.

>>> x0 = np.array([0.4, 0.6])
>>> y0 = np.array([0.9, 0.1])
>>> timepoints = np.linspace(0, 10, 1000)
>>> xs, ys = game.asymmetric_replicator_dynamics(x0=x0, y0=y0, timepoints=timepoints)
>>> xs
array([[0.4       , 0.6       ],
       [0.39784..., 0.60215...],
       [0.39569..., 0.60430...],
       ...,
       [0.17411..., 0.82588...],
       [0.17411..., 0.82588...],
       [0.17411..., 0.82588...]])
>>> ys
array([[9.00000...e-01, 1.00000...e-01],
       [8.98183...e-01, 1.01816...e-01],
       [8.96338...e-01, 1.03661...e-01],
       ...,
       [1.86696...e-08, 9.99999...e-01],
       [1.82868...e-08, 9.99999...e-01],
       [1.79139...e-08, 9.99999...e-01]])