diff --git a/.gitignore b/.gitignore index 72723e50a..e20d9558a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *pyc +*.DS_Store diff --git a/axelrod/strategies/__init__.py b/axelrod/strategies/__init__.py index aed9bdb91..0ecf96e06 100644 --- a/axelrod/strategies/__init__.py +++ b/axelrod/strategies/__init__.py @@ -5,6 +5,7 @@ from titfortat import * from gobymajority import * from alternator import * +from averagecopier import * strategies = [ @@ -15,4 +16,5 @@ GoByMajority, Random, Alternator, + AverageCopier, ] diff --git a/axelrod/strategies/averagecopier.py b/axelrod/strategies/averagecopier.py new file mode 100644 index 000000000..cbc42a430 --- /dev/null +++ b/axelrod/strategies/averagecopier.py @@ -0,0 +1,24 @@ +from axelrod import Player +import random + +class AverageCopier(Player): + """ + The player will cooperate with probability p if the opponent's cooperation ratio is p + """ + def strategy(self, opponent): + """ + Randomly picks a strategy (not affected by history) + """ + if len(opponent.history) == 0: + return random.choice(['C', 'D']) + p = sum([s == 'C' for s in opponent.history]) / len(opponent.history) + rnd_num = random.random() + if rnd_num < p: + return 'C' + return 'D' + + def __repr__(self): + """ + The string method for the strategy: + """ + return 'Average Copier' diff --git a/axelrod/tests/test_averagecopier.py b/axelrod/tests/test_averagecopier.py new file mode 100644 index 000000000..06b870a97 --- /dev/null +++ b/axelrod/tests/test_averagecopier.py @@ -0,0 +1,54 @@ +""" +Test for the average_copier strategy +""" +import unittest +import axelrod +import random + +class TestAverageCopier(unittest.TestCase): + + def test_initial_strategy(self): + """ + Test that the first strategy is picked randomly + """ + random.seed(1) + P1 = axelrod.AverageCopier() + P2 = axelrod.Player() + self.assertEqual(P1.strategy(P2), 'C') + self.assertEqual(P1.strategy(P2), 'D') + self.assertEqual(P1.strategy(P2), 'D') + self.assertEqual(P1.strategy(P2), 'C') + self.assertEqual(P1.strategy(P2), 'C') + self.assertEqual(P1.strategy(P2), 'C') + self.assertEqual(P1.strategy(P2), 'D') + self.assertEqual(P1.strategy(P2), 'D') + self.assertEqual(P1.strategy(P2), 'C') + self.assertEqual(P1.strategy(P2), 'C') + + def test_when_oppenent_all_Cs(self): + """ + Tests that if opponent has played all C then player chooses C + """ + random.seed(5) + P1 = axelrod.AverageCopier() + P2 = axelrod.Player() + P2.history = ['C', 'C', 'C', 'C'] + self.assertEqual(P1.strategy(P2), 'C') + self.assertEqual(P1.strategy(P2), 'C') + self.assertEqual(P1.strategy(P2), 'C') + + def test_when_opponent_all_Ds(self): + """ + Tests that if opponent has played all D then player chooses D + """ + random.seed(5) + P1 = axelrod.AverageCopier() + P2 = axelrod.Player() + P2.history = ['D', 'D', 'D', 'D'] + self.assertEqual(P1.strategy(P2), 'D') + self.assertEqual(P1.strategy(P2), 'D') + self.assertEqual(P1.strategy(P2), 'D') + + def test_representation(self): + P1 = axelrod.AverageCopier() + self.assertEqual(str(P1), 'Average Copier') diff --git a/results.png b/results.png index 3417c5983..d31a900be 100644 Binary files a/results.png and b/results.png differ