import prisoner0, prisoner1 payoff_cc = [2, 2] payoff_cd = [-1, 3] payoff_dc = [3, -1] payoff_dd = [0, 0] moves = [ [], [] ] scores = [ [], [] ] totals = [0, 0] def score(m0, m1): global totals moves[0].append(m0) moves[1].append(m1) if m0 == 'cooperate' and m1 == 'cooperate': scores[0].append(payoff_cc[0]) scores[1].append(payoff_cc[1]) elif m0 == 'cooperate' and m1 == 'defect': scores[0].append(payoff_cd[0]) scores[1].append(payoff_cd[1]) elif m0 == 'defect' and m1 == 'cooperate': scores[0].append(payoff_dc[0]) scores[1].append(payoff_dc[1]) else: scores[0].append(payoff_dd[0]) scores[1].append(payoff_dd[1]) totals[0] += scores[0][-1] totals[1] += scores[1][-1] def play_iterations(num_iterations, prisoner0_strategy, prisoner1_strategy, display=False): for i in range(2): moves[i] = [] scores[i] = [] totals[i] = 0 for i in range(num_iterations): m0 = prisoner0.play(prisoner0_strategy, moves[0], moves[1]) m1 = prisoner1.play(prisoner1_strategy, moves[1], moves[0]) score(m0, m1) if display: s = 'm0={0:10} m1={1:10} scores=({2:2},{3:2}) totals=({4},{5})' print(s.format(m0, m1, scores[0][-1], scores[1][-1], totals[0], totals[1])) prisoner0.update(prisoner0_strategy, moves[0], moves[1], scores[0][-1]) prisoner1.update(prisoner1_strategy, moves[1], moves[0], scores[1][-1]) if display: s = 'Average per iteration scores: ({0:2.2f}, {1:2.2f})' print(s.format(totals[0]/num_iterations, totals[1]/num_iterations)) def evaluate(num_iterations, num_runs, prisoner0_strategy, prisoner1_strategy): overall_totals = [0, 0] for r in range(num_runs): play_iterations(num_iterations, prisoner0_strategy, prisoner1_strategy, False) overall_totals[0] += totals[0] overall_totals[1] += totals[1] # Now averages. avg0 = (overall_totals[0] / num_iterations) / num_runs avg1 = (overall_totals[1] / num_iterations) / num_runs s = '{0} vs. {1}: average scores over {2} iterations: ({3:6.2f}, {4:6.2f})' print(s.format(prisoner0_strategy, prisoner1_strategy, num_iterations, avg0, avg1)) return (avg0, avg1)