A spatial tournament is defined on a graph where the nodes correspond to players and edges define whether or not a given player pair will have a match.
The initial work on spatial tournaments was done by Nowak and May in a 1992 paper: [Nowak1992].
Additionally, Szabó and Fáth in their 2007 paper [Szabo2007] consider a variety of graphs, such as lattices, small world, scale-free graphs and evolving networks.
Let’s create a tournament where
Defector do not
play each other and neither do
Note that the edges have to be given as a list of tuples of player indices:
>>> import axelrod as axl >>> players = [axl.Cooperator(), axl.Defector(), ... axl.TitForTat(), axl.Grudger()] >>> edges = [(0, 2), (0, 3), (1, 2), (1, 3)]
To create a spatial tournament you pass the
edges to the
>>> spatial_tournament = axl.Tournament(players, edges=edges) >>> results = spatial_tournament.play(keep_interactions=True)
We can plot the results:
>>> plot = axl.Plot(results) >>> p = plot.boxplot() >>> p.show()
We can, like any other tournament, obtain the ranks for our players:
>>> results.ranked_names ['Cooperator', 'Tit For Tat', 'Grudger', 'Defector']
Let’s run a small tournament of 2
turns and 5
and obtain the interactions:
>>> spatial_tournament = axl.Tournament(players ,turns=2, repetitions=2, edges=edges) >>> results = spatial_tournament.play(keep_interactions=True) >>> for index_pair, interaction in sorted(results.interactions.items()): ... player1 = spatial_tournament.players[index_pair] ... player2 = spatial_tournament.players[index_pair] ... print('%s vs %s: %s' % (player1, player2, interaction)) Cooperator vs Tit For Tat: [[('C', 'C'), ('C', 'C')], [('C', 'C'), ('C', 'C')]] Cooperator vs Grudger: [[('C', 'C'), ('C', 'C')], [('C', 'C'), ('C', 'C')]] Defector vs Tit For Tat: [[('D', 'C'), ('D', 'D')], [('D', 'C'), ('D', 'D')]] Defector vs Grudger: [[('D', 'C'), ('D', 'D')], [('D', 'C'), ('D', 'D')]]
Cooperator does not interact with
It is also possible to create a probabilistic ending spatial tournament:
>>> prob_end_spatial_tournament = axl.Tournament(players, edges=edges, prob_end=.1, repetitions=1) >>> prob_end_results = prob_end_spatial_tournament.play(keep_interactions=True)
We see that the match lengths are no longer all equal:
>>> axl.seed(0) >>> lengths =  >>> for interaction in prob_end_results.interactions.values(): ... lengths.append(len(interaction)) >>> min(lengths) != max(lengths) True