Skip to content

Commit e15b86e

Browse files
authored
Merge pull request #795 from Axelrod-Python/mem2
New Strategies: Mem2, Pun1, Collective Strategy
2 parents 10bf24a + d4925ff commit e15b86e

File tree

10 files changed

+345
-86
lines changed

10 files changed

+345
-86
lines changed

axelrod/strategies/_strategies.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
from .apavlov import APavlov2006, APavlov2011
77
from .appeaser import Appeaser
88
from .averagecopier import AverageCopier, NiceAverageCopier
9-
from .axelrod_first import (Davis, RevisedDowning, Feld, Grofman, Nydegger,
10-
Joss, Shubik, Tullock, UnnamedStrategy)
9+
from .axelrod_first import (
10+
Davis, RevisedDowning, Feld, Grofman, Nydegger, Joss, Shubik, Tullock,
11+
UnnamedStrategy)
1112
from .axelrod_second import Champion, Eatherley, Tester
1213
from .backstabber import BackStabber, DoubleCrosser
1314
from .better_and_better import BetterAndBetter
@@ -20,16 +21,15 @@
2021
from .defector import Defector, TrickyDefector
2122
from .doubler import Doubler
2223
from .finite_state_machines import (
23-
Fortress3, Fortress4, Predator, Raider, Ripoff, SolutionB1, SolutionB5,
24-
Thumper, FSMPlayer)
24+
Fortress3, Fortress4, Predator, Pun1, Raider, Ripoff, SolutionB1,
25+
SolutionB5, Thumper, FSMPlayer)
2526
from .forgiver import Forgiver, ForgivingTitForTat
2627
from .geller import Geller, GellerCooperator, GellerDefector
2728
from .gambler import Gambler, PSOGambler
28-
from .gobymajority import (GoByMajority,
29-
GoByMajority10, GoByMajority20, GoByMajority40,
30-
GoByMajority5,
31-
HardGoByMajority, HardGoByMajority10, HardGoByMajority20, HardGoByMajority40,
32-
HardGoByMajority5)
29+
from .gobymajority import (
30+
GoByMajority, GoByMajority10, GoByMajority20, GoByMajority40,
31+
GoByMajority5, HardGoByMajority, HardGoByMajority10, HardGoByMajority20,
32+
HardGoByMajority40, HardGoByMajority5)
3333
from .gradualkiller import GradualKiller
3434
from .grudger import (Grudger, ForgetfulGrudger, OppositeGrudger, Aggravater,
3535
SoftGrudger, GrudgerAlternator, EasyGo)
@@ -46,15 +46,17 @@
4646
MemoryOnePlayer, ALLCorALLD, FirmButFair, GTFT, SoftJoss,
4747
StochasticCooperator, StochasticWSLS, ZDExtort2, ZDExtort2v2, ZDExtort4,
4848
ZDGen2, ZDGTFT2, ZDSet2, WinStayLoseShift, WinShiftLoseStay)
49+
from .memorytwo import MEM2
4950
from .mindcontrol import MindController, MindWarper, MindBender
5051
from .mindreader import MindReader, ProtectedMindReader, MirrorMindReader
5152
from .mutual import Desperate, Hopeless, Willing
5253
from .negation import Negation
5354
from .oncebitten import OnceBitten, FoolMeOnce, ForgetfulFoolMeOnce, FoolMeForever
54-
from .prober import (Prober, Prober2, Prober3, Prober4, HardProber,
55-
NaiveProber, RemorsefulProber)
55+
from .prober import (CollectiveStrategy, Prober, Prober2, Prober3, Prober4,
56+
HardProber, NaiveProber, RemorsefulProber)
5657
from .punisher import Punisher, InversePunisher
57-
from .qlearner import RiskyQLearner, ArrogantQLearner, HesitantQLearner, CautiousQLearner
58+
from .qlearner import (
59+
RiskyQLearner, ArrogantQLearner, HesitantQLearner, CautiousQLearner)
5860
from .rand import Random
5961
from .retaliate import (
6062
Retaliate, Retaliate2, Retaliate3, LimitedRetaliate, LimitedRetaliate2,
@@ -63,8 +65,10 @@
6365
from .titfortat import (
6466
TitForTat, TitFor2Tats, TwoTitsForTat, Bully, SneakyTitForTat,
6567
SuspiciousTitForTat, AntiTitForTat, HardTitForTat, HardTitFor2Tats,
66-
OmegaTFT, Gradual, ContriteTitForTat, SlowTitForTwoTats, AdaptiveTitForTat,SpitefulTitForTat)
67-
from .worse_and_worse import (WorseAndWorse, KnowledgeableWorseAndWorse, WorseAndWorse2, WorseAndWorse3)
68+
OmegaTFT, Gradual, ContriteTitForTat, SlowTitForTwoTats, AdaptiveTitForTat,
69+
SpitefulTitForTat)
70+
from .worse_and_worse import (WorseAndWorse, KnowledgeableWorseAndWorse,
71+
WorseAndWorse2, WorseAndWorse3)
6872

6973
# Note: Meta* strategies are handled in .__init__.py
7074

@@ -88,6 +92,7 @@
8892
Calculator,
8993
CautiousQLearner,
9094
Champion,
95+
CollectiveStrategy,
9196
ContriteTitForTat,
9297
Cooperator,
9398
CooperatorHunter,
@@ -157,6 +162,7 @@
157162
LimitedRetaliate3,
158163
MathConstantHunter,
159164
NaiveProber,
165+
MEM2,
160166
MindBender,
161167
MindController,
162168
MindReader,
@@ -175,6 +181,7 @@
175181
Prober3,
176182
Prober4,
177183
ProtectedMindReader,
184+
Pun1,
178185
Punisher,
179186
Raider,
180187
Random,
@@ -183,6 +190,7 @@
183190
Retaliate,
184191
Retaliate2,
185192
Retaliate3,
193+
RevisedDowning,
186194
Ripoff,
187195
RiskyQLearner,
188196
Shubik,

axelrod/strategies/finite_state_machines.py

Lines changed: 117 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class FSMPlayer(Player):
4848
}
4949

5050
@init_args
51-
def __init__(self, transitions=None, initial_state=None, initial_action=None):
51+
def __init__(self, transitions=None, initial_state=None,
52+
initial_action=None):
5253
if not transitions:
5354
# Tit For Tat
5455
transitions = [(1, C, 1, C), (1, D, 1, D)]
@@ -92,14 +93,16 @@ class Fortress3(FSMPlayer):
9293

9394
@init_args
9495
def __init__(self):
95-
transitions = ((1, D, 2, D),
96-
(1, C, 1, D),
97-
(2, C, 1, D),
98-
(2, D, 3, C),
99-
(3, C, 3, C),
100-
(3, D, 1, D))
96+
transitions = (
97+
(1, D, 2, D),
98+
(1, C, 1, D),
99+
(2, C, 1, D),
100+
(2, D, 3, C),
101+
(3, C, 3, C),
102+
(3, D, 1, D)
103+
)
101104

102-
FSMPlayer.__init__(self, transitions=transitions, initial_state=1, initial_action=D)
105+
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=D)
103106

104107

105108
class Fortress4(FSMPlayer):
@@ -120,14 +123,16 @@ class Fortress4(FSMPlayer):
120123

121124
@init_args
122125
def __init__(self):
123-
transitions = ((1, C, 1, D),
124-
(1, D, 2, D),
125-
(2, C, 1, D),
126-
(2, D, 3, D),
127-
(3, C, 1, D),
128-
(3, D, 4, C),
129-
(4, C, 4, C),
130-
(4, D, 1, D))
126+
transitions = (
127+
(1, C, 1, D),
128+
(1, D, 2, D),
129+
(2, C, 1, D),
130+
(2, D, 3, D),
131+
(3, C, 1, D),
132+
(3, D, 4, C),
133+
(4, C, 4, C),
134+
(4, D, 1, D)
135+
)
131136

132137
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=D)
133138

@@ -148,28 +153,60 @@ class Predator(FSMPlayer):
148153

149154
@init_args
150155
def __init__(self):
151-
transitions = ((0, C, 0, D),
152-
(0, D, 1, D),
153-
(1, C, 2, D),
154-
(1, D, 3, D),
155-
(2, C, 4, C),
156-
(2, D, 3, D),
157-
(3, C, 5, D),
158-
(3, D, 4, C),
159-
(4, C, 2, C),
160-
(4, D, 6, D),
161-
(5, C, 7, D),
162-
(5, D, 3, D),
163-
(6, C, 7, C),
164-
(6, D, 7, D),
165-
(7, C, 8, D),
166-
(7, D, 7, D),
167-
(8, C, 8, D),
168-
(8, D, 6, D))
156+
transitions = (
157+
(0, C, 0, D),
158+
(0, D, 1, D),
159+
(1, C, 2, D),
160+
(1, D, 3, D),
161+
(2, C, 4, C),
162+
(2, D, 3, D),
163+
(3, C, 5, D),
164+
(3, D, 4, C),
165+
(4, C, 2, C),
166+
(4, D, 6, D),
167+
(5, C, 7, D),
168+
(5, D, 3, D),
169+
(6, C, 7, C),
170+
(6, D, 7, D),
171+
(7, C, 8, D),
172+
(7, D, 7, D),
173+
(8, C, 8, D),
174+
(8, D, 6, D)
175+
)
169176

170177
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=C)
171178

172179

180+
class Pun1(FSMPlayer):
181+
"""FSM player described in [Ashlock2006].
182+
183+
Names:
184+
- Pun1 [Ashlock2006]_
185+
"""
186+
187+
name = 'Pun1'
188+
classifier = {
189+
'memory_depth': 2,
190+
'stochastic': False,
191+
'makes_use_of': set(),
192+
'long_run_time': False,
193+
'inspects_source': False,
194+
'manipulates_source': False,
195+
'manipulates_state': False
196+
}
197+
198+
@init_args
199+
def __init__(self):
200+
transitions = (
201+
(1, C, 2, C),
202+
(1, D, 2, C),
203+
(2, C, 1, C),
204+
(2, D, 1, D)
205+
)
206+
207+
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=D)
208+
209+
173210
class Raider(FSMPlayer):
174211
"""FSM player described in DOI:10.1109/FOCI.2014.7007818"""
175212

@@ -186,14 +223,16 @@ class Raider(FSMPlayer):
186223

187224
@init_args
188225
def __init__(self):
189-
transitions = ((0, C, 2, D),
190-
(0, D, 2, D),
191-
(1, C, 1, C),
192-
(1, D, 1, D),
193-
(2, C, 0, D),
194-
(2, D, 3, C),
195-
(3, C, 0, D),
196-
(3, D, 1, C))
226+
transitions = (
227+
(0, C, 2, D),
228+
(0, D, 2, D),
229+
(1, C, 1, C),
230+
(1, D, 1, D),
231+
(2, C, 0, D),
232+
(2, D, 3, C),
233+
(3, C, 0, D),
234+
(3, D, 1, C)
235+
)
197236

198237
FSMPlayer.__init__(self, transitions, initial_state=0, initial_action=D)
199238

@@ -214,12 +253,14 @@ class Ripoff(FSMPlayer):
214253

215254
@init_args
216255
def __init__(self):
217-
transitions = ((1, C, 2, C),
218-
(1, D, 3, C),
219-
(2, C, 1, D),
220-
(2, D, 3, C),
221-
(3, C, 3, C), # Note that it's TFT in state 3
222-
(3, D, 3, D))
256+
transitions = (
257+
(1, C, 2, C),
258+
(1, D, 3, C),
259+
(2, C, 1, D),
260+
(2, D, 3, C),
261+
(3, C, 3, C), # Note that it's TFT in state 3
262+
(3, D, 3, D)
263+
)
223264

224265
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=D)
225266

@@ -240,12 +281,14 @@ class SolutionB1(FSMPlayer):
240281

241282
@init_args
242283
def __init__(self):
243-
transitions = ((1, C, 2, D),
244-
(1, D, 1, D),
245-
(2, C, 2, C),
246-
(2, D, 3, C),
247-
(3, C, 3, C),
248-
(3, D, 3, C))
284+
transitions = (
285+
(1, C, 2, D),
286+
(1, D, 1, D),
287+
(2, C, 2, C),
288+
(2, D, 3, C),
289+
(3, C, 3, C),
290+
(3, D, 3, C)
291+
)
249292

250293
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=D)
251294

@@ -266,18 +309,20 @@ class SolutionB5(FSMPlayer):
266309

267310
@init_args
268311
def __init__(self):
269-
transitions = ((1, C, 2, C),
270-
(1, D, 6, D),
271-
(2, C, 2, C),
272-
(2, D, 3, D),
273-
(3, C, 6, C),
274-
(3, D, 1, D),
275-
(4, C, 3, C),
276-
(4, D, 6, D),
277-
(5, C, 5, D),
278-
(5, D, 4, D),
279-
(6, C, 3, C),
280-
(6, D, 5, D))
312+
transitions = (
313+
(1, C, 2, C),
314+
(1, D, 6, D),
315+
(2, C, 2, C),
316+
(2, D, 3, D),
317+
(3, C, 6, C),
318+
(3, D, 1, D),
319+
(4, C, 3, C),
320+
(4, D, 6, D),
321+
(5, C, 5, D),
322+
(5, D, 4, D),
323+
(6, C, 3, C),
324+
(6, D, 5, D)
325+
)
281326

282327
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=D)
283328

@@ -298,9 +343,11 @@ class Thumper(FSMPlayer):
298343

299344
@init_args
300345
def __init__(self):
301-
transitions = ((1, C, 1, C),
302-
(1, D, 2, D),
303-
(2, C, 1, D),
304-
(2, D, 1, D))
346+
transitions = (
347+
(1, C, 1, C),
348+
(1, D, 2, D),
349+
(2, C, 1, D),
350+
(2, D, 1, D)
351+
)
305352

306353
FSMPlayer.__init__(self, transitions, initial_state=1, initial_action=C)

axelrod/strategies/memoryone.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from axelrod import Actions, Player, init_args, random_choice
22

3-
"""IPD Strategies: http://www.prisoners-dilemma.com/strategies.html"""
43

54
C, D = Actions.C, Actions.D
65

0 commit comments

Comments
 (0)