Source code for axelrod.strategies.stalker
from axelrod.action import Action
from axelrod.player import Player
from axelrod.strategy_transformers import FinalTransformer
C, D = Action.C, Action.D
[docs]
@FinalTransformer((D,), name_prefix=None) # End with defection
class Stalker(Player):
"""
This is a strategy which is only influenced by the score.
Its behavior is based on three values:
the very_bad_score (all rounds in defection)
very_good_score (all rounds in cooperation)
wish_score (average between bad and very_good score)
It starts with cooperation.
- If current_average_score > very_good_score, it defects
- If current_average_score lies in (wish_score, very_good_score) it
cooperates
- If current_average_score > 2, it cooperates
- If current_average_score lies in (1, 2)
- The remaining case, current_average_score < 1, it behaves randomly.
- It defects in the last round
Names:
- Stalker: [Andre2013]_
"""
name = "Stalker"
classifier = {
"memory_depth": float("inf"),
"stochastic": True,
"long_run_time": False,
"inspects_source": False,
"manipulates_source": False,
"manipulates_state": False,
}
def receive_match_attributes(self):
R, P, S, T = self.match_attributes["game"].RPST()
self.very_good_score = R
self.very_bad_score = P
self.wish_score = (R + P) / 2
self.current_score = 0
def score_last_round(self, opponent: Player):
# Load the default game if not supplied by a tournament.
game = self.match_attributes["game"]
last_round = (self.history[-1], opponent.history[-1])
scores = game.score(last_round)
self.current_score += scores[0]
def strategy(self, opponent: Player) -> Action:
"""Actual strategy definition that determines player's action."""
if len(self.history) == 0:
return C
self.score_last_round(opponent)
current_average_score = self.current_score / len(self.history)
if current_average_score > self.very_good_score:
return D
if (current_average_score > self.wish_score) and (
current_average_score < self.very_good_score
):
return C
if current_average_score > 2:
return C
if (current_average_score < 2) and (current_average_score > 1):
return D
return self._random.random_choice()