Source code for axelrod.strategies.selfsteem
from math import pi, sin
from axelrod.action import Action
from axelrod.player import Player
C, D = Action.C, Action.D
[docs]
class SelfSteem(Player):
"""
This strategy is based on the feeling with the same name.
It is modeled on the sine curve(f = sin( 2* pi * n / 10 )), which varies
with the current iteration.
If f > 0.95, 'ego' of the algorithm is inflated; always defects.
If 0.95 > abs(f) > 0.3, rational behavior; follows TitForTat algortithm.
If 0.3 > f > -0.3; random behavior.
If f < -0.95, algorithm is at rock bottom; always cooperates.
Futhermore, the algorithm implements a retaliation policy, if the opponent
defects; the sin curve is shifted. But due to lack of further information,
this implementation does not include a sin phase change.
Names:
- SelfSteem: [Andre2013]_
"""
name = "SelfSteem"
classifier = {
"memory_depth": float("inf"),
"stochastic": True,
"long_run_time": False,
"inspects_source": False,
"manipulates_source": False,
"manipulates_state": False,
}
[docs]
def strategy(self, opponent: Player) -> Action:
"""Actual strategy definition that determines player's action."""
turns_number = len(self.history)
sine_value = sin(2 * pi * turns_number / 10)
if sine_value > 0.95:
return D
if 0.95 > abs(sine_value) > 0.3:
return opponent.history[-1]
if 0.3 > sine_value > -0.3:
return self._random.random_choice()
return C