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]])