Source code for axelrod.strategies.apavlov
from typing import Optional
from axelrod.action import Action
from axelrod.player import Player
C, D = Action.C, Action.D
[docs]
class APavlov2006(Player):
"""
APavlov attempts to classify its opponent as one of five strategies:
Cooperative, ALLD, STFT, PavlovD, or Random. APavlov then responds in a
manner intended to achieve mutual cooperation or to defect against
uncooperative opponents.
Names:
- Adaptive Pavlov 2006: [Li2007]_
"""
name = "Adaptive Pavlov 2006"
classifier = {
"memory_depth": float("inf"),
"stochastic": False,
"long_run_time": False,
"inspects_source": False,
"manipulates_source": False,
"manipulates_state": False,
}
def __init__(self) -> None:
super().__init__()
self.opponent_class = None # type: Optional[str]
[docs]
def strategy(self, opponent: Player) -> Action:
"""Actual strategy definition that determines player's action."""
# TFT for six rounds
if len(self.history) < 6:
return D if opponent.history[-1:] == [D] else C
# Classify opponent
if len(self.history) % 6 == 0:
if opponent.history[-6:] == [C] * 6:
self.opponent_class = "Cooperative"
if opponent.history[-6:] == [D] * 6:
self.opponent_class = "ALLD"
if opponent.history[-6:] == [D, C, D, C, D, C]:
self.opponent_class = "STFT"
if opponent.history[-6:] == [D, D, C, D, D, C]:
self.opponent_class = "PavlovD"
if not self.opponent_class:
self.opponent_class = "Random"
# Play according to classification
if self.opponent_class in ["Random", "ALLD"]:
return D
if self.opponent_class == "STFT":
if len(self.history) % 6 in [0, 1]:
return C
# TFT
if opponent.history[-1:] == [D]:
return D
if self.opponent_class == "PavlovD":
# Return D then C for the period
if len(self.history) % 6 == 0:
return D
if self.opponent_class == "Cooperative":
# TFT
if opponent.history[-1:] == [D]:
return D
return C
[docs]
class APavlov2011(Player):
"""
APavlov attempts to classify its opponent as one of four strategies:
Cooperative, ALLD, STFT, or Random. APavlov then responds in a manner
intended to achieve mutual cooperation or to defect against
uncooperative opponents.
Names:
- Adaptive Pavlov 2011: [Li2011]_
"""
name = "Adaptive Pavlov 2011"
classifier = {
"memory_depth": float("inf"),
"stochastic": False,
"long_run_time": False,
"inspects_source": False,
"manipulates_source": False,
"manipulates_state": False,
}
def __init__(self) -> None:
super().__init__()
self.opponent_class = None # type: Optional[str]
[docs]
def strategy(self, opponent: Player) -> Action:
"""Actual strategy definition that determines player's action."""
# TFT for six rounds
if len(self.history) < 6:
return D if opponent.history[-1:] == [D] else C
if len(self.history) % 6 == 0:
# Classify opponent
if opponent.history[-6:] == [C] * 6:
self.opponent_class = "Cooperative"
if opponent.history[-6:].count(D) >= 4:
self.opponent_class = "ALLD"
if opponent.history[-6:].count(D) == 3:
self.opponent_class = "STFT"
if not self.opponent_class:
self.opponent_class = "Random"
# Play according to classification
if self.opponent_class in ["Random", "ALLD"]:
return D
if self.opponent_class == "STFT":
# TFTT
return D if opponent.history[-2:] == [D, D] else C
if self.opponent_class == "Cooperative":
# TFT
return D if opponent.history[-1:] == [D] else C