Created
April 28, 2016 18:30
-
-
Save mojones/550b32c46a8169bb3cd89d917b73111a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from axelrod import Actions, Player, init_args | |
C, D = Actions.C, Actions.D | |
class ANN(Player): | |
name = 'ANN' | |
classifier = { | |
'memory_depth': 1, #actually variable | |
'stochastic': True, | |
'inspects_source': False, | |
'makes_use_of': set(), | |
'manipulates_source': False, | |
'manipulates_state': False | |
} | |
def activate(self, inputs): | |
# calculate values of hidden nodes | |
hidden_values = [] | |
for i in range(self.hidden_layer_size): | |
hidden_node_value = 0 | |
bias_weight = self.bias_weights[i] | |
hidden_node_value += bias_weight | |
for j in range(self.input_values): | |
weight = self.input_to_hidden_layer_weights[i][j] | |
hidden_node_value += inputs[j] * weight | |
# ReLU acctivation function | |
hidden_node_value = max(hidden_node_value, 0) | |
hidden_values.append(hidden_node_value) | |
# calculate output value | |
output_value = 0 | |
for i in range(self.hidden_layer_size): | |
output_value += hidden_values[i] * self.hidden_to_output_layer_weights[i] | |
return output_value | |
@init_args | |
def __init__( | |
self, | |
input_to_hidden_layer_weights=[], | |
hidden_to_output_layer_weights=[], | |
bias_weights=[] | |
): | |
Player.__init__(self) | |
self.input_to_hidden_layer_weights = input_to_hidden_layer_weights | |
self.hidden_to_output_layer_weights = hidden_to_output_layer_weights | |
self.bias_weights = bias_weights | |
self.input_values = len(input_to_hidden_layer_weights[0]) | |
self.hidden_layer_size = len(hidden_to_output_layer_weights) | |
#self.init_args = (input_to_hidden_layer_weights, hidden_to_output_layer_weights,bias_weights,) | |
def strategy(self, opponent): | |
action2input = {'C' : 1, 'D' : -1} | |
if len(opponent.history) == 0: | |
opponent_first_c = 0 | |
opponent_first_d = 0 | |
opponent_second_c = 0 | |
opponent_second_d = 0 | |
my_previous_c = 0 | |
my_previous_d = 0 | |
my_previous2_c = 0 | |
my_previous2_d = 0 | |
opponent_previous_c = 0 | |
opponent_previous_d = 0 | |
opponent_previous2_c = 0 | |
opponent_previous2_d = 0 | |
elif len(opponent.history) == 1: | |
opponent_first_c = 1 if opponent.history[0] == 'C' else 0 | |
opponent_first_d = 1 if opponent.history[0] == 'D' else 0 | |
opponent_second_c = 0 | |
opponent_second_d = 0 | |
my_previous_c = 1 if self.history[-1] == 'C' else 0 | |
my_previous_d = 0 if self.history[-1] == 'D' else 0 | |
my_previous2_c = 0 | |
my_previous2_d = 0 | |
opponent_previous_c = 1 if opponent.history[-1] == 'C' else 0 | |
opponent_previous_d = 1 if opponent.history[-1] == 'D' else 0 | |
opponent_previous2_c = 0 | |
opponent_previous2_d = 0 | |
else: | |
opponent_first_c = 1 if opponent.history[0] == 'C' else 0 | |
opponent_first_d = 1 if opponent.history[0] == 'D' else 0 | |
opponent_second_c = 1 if opponent.history[1] == 'C' else 0 | |
opponent_second_d = 1 if opponent.history[1] == 'D' else 0 | |
my_previous_c = 1 if self.history[-1] == 'C' else 0 | |
my_previous_d = 0 if self.history[-1] == 'D' else 0 | |
my_previous2_c = 1 if self.history[-2] == 'C' else 0 | |
my_previous2_d = 1 if self.history[-2] == 'D' else 0 | |
opponent_previous_c = 1 if opponent.history[-1] == 'C' else 0 | |
opponent_previous_d = 1 if opponent.history[-1] == 'D' else 0 | |
opponent_previous2_c = 1 if opponent.history[-2] == 'C' else 0 | |
opponent_previous2_d = 1 if opponent.history[-2] == 'D' else 0 | |
turns_remaining = self.match_attributes['length'] - len(self.history) | |
total_opponent_c = opponent.history.count('C') | |
total_opponent_d = opponent.history.count('D') | |
total_self_c = self.history.count('C') | |
total_self_d = self.history.count('D') | |
output = self.activate([ | |
opponent_first_c, | |
opponent_first_d, | |
opponent_second_c, | |
opponent_second_d, | |
my_previous_c, | |
my_previous_d, | |
my_previous2_c, | |
my_previous2_d, | |
opponent_previous_c, | |
opponent_previous_d, | |
opponent_previous2_c, | |
opponent_previous2_d, | |
total_opponent_c, | |
total_opponent_d, | |
total_self_c, | |
total_self_d, | |
turns_remaining | |
]) | |
#if output > random.uniform(-1, 1): | |
if output > 0: | |
return 'C' | |
else: | |
return 'D' | |
def split_weights(weights, input_values, hidden_layer_size): | |
number_of_input_to_hidden_weights = input_values * hidden_layer_size | |
number_of_hidden_bias_weights = hidden_layer_size | |
number_of_hidden_to_output_weights = hidden_layer_size | |
input2hidden = [] | |
for i in range(0, number_of_input_to_hidden_weights, input_values): | |
input2hidden.append(weights[i:i+input_values]) | |
hidden2output = weights[number_of_input_to_hidden_weights:number_of_input_to_hidden_weights+number_of_hidden_to_output_weights] | |
bias = weights[number_of_input_to_hidden_weights+number_of_hidden_to_output_weights:] | |
return (input2hidden, hidden2output, bias) | |
class EvolvedANN(ANN): | |
name = "EvolvedANN" | |
def __init__(self): | |
input_values = 17 | |
hidden_layer_size = 10 | |
test_weights = test_weights = [0.19789658035994948, -5575.476236516673, 0.1028948855131803, 0.7421752484224489, -16.286246197005298, 11708.007255945553, 0.01400184611448853, -33.39126355009626, -12.755203414662356, -32.92388754142929, 197.3517717772447, 108262.87038790248, -0.1084768512582505, 85.20738888799768, 723.9537664890132, -2.59453614458083, 0.5599936275978272, 7.89217571665664, -48014.821440080384, -1.364025168184463, -1.062138244222801, 11153713.883580556, -59.58314524751318, 51278.916519524784, 3196.528224457722, -4635.771421694692, -129.93354968926164, -0.7927383528469051, 98.47779304649353, -81.19056440190543, 29.53082483602472, -48.16562780387682, 49.40755170297665, 288.3295763937912, -68.38780651250116, -167.64039570334904, -0.1576073061122998, 160.6846658333963, 34.55451693336857, -0.08213997499783675, -4.802560347075611, -1.4042000430302104, -0.9832145174590058, 0.008705149387813573, 14.041842191255089, 0.05395665905821821, -0.13856885306885558, 5.311455433711278, -5.835498171845142, 0.00010294700612334848, 26.42528200366623, 33.690839945794785, 7.931017950666591, -0.00037662122944226125, 59.295075951374606, -0.15888507169191035, 3.670332254391659, 789.6230735057893, -0.7367125124436135, -198.44119280589902, 537.9939493545736, -287.54344903637207, 1759.5455359353778, -18.48997020629342, -8426184.81603275, -82.36805426730088, 1144.1032034358543, 15635.402592538396, 3095.643889329041, 2332.107673930774, -0.5601648316602144, 101.98300711150003, -7387.135294747112, -4241.004613717573, 3.06175607282536e-05, -35122.894421260884, -38591.45572476855, -0.16081285130591272, -29608.73087879185, 122.47563639056185, 6.381946054740736, -0.8978628581801188, 17658.47647781355, -0.011719257684286711, 0.10734295104044986, -378.35448968529494, 225.06912279045062, -351.12326495980847, -1.927322672845826, 0.0014584395475859544, -8.629826916169318, 22.43281153854352, 87.10895591188721, -0.22253937914423294, -233.06796470563208, -620.4917481128365, -1.8253699204909606, -0.0030318160426064467, -77.25818476745101, -2057.311059352977, 3.764204074005541, -47.47629147374066, 233.16096124330778, -160721.96744375565, -278292.9688140893, -2.093640525920404, -142886.66171202937, 53.64449245132945, 12.5162147724691, -207.75462390139955, 132167.659160016, 21.197418541051732, 83979.45623573882, -49.47558832987566, 0.05242625398046057, -842.1484416713075, -0.1581049310461208, 2359.2124343564096, 1170.5147830681053, -847999.9145843558, -0.8053911061885284, -5363.722820739466, 171.58433274294117, -724.7468082647013, 2500359.853524033, 1595.3955511798079, -4.254009123616706, -171.12968391407912, -32.30624102753424, -558.412338112568, -234.29754199019308, -18768.34057250429, 8338.792126484348, -0.18593140210730602, -7.758804964874875, 0.39736677884665267, 547.0567585452197, 1.1969366369973133, 0.4861465741177498, -51.19319208716985, 12.775051406025534, -0.09185362260212569, 22.08417300332754, -5090.013231748707, -0.814394991797045, 1.1534025840023847, 8.390439959276764, -0.02227253403481858, 0.14162040507921927, -0.011508263843203926, 0.22372493104861083, 0.7754713610627112, 0.1044033140236981, -4.377055307648915, -41.898221495326574, -18656.755601828827, -134.56719406539244, -2405.8148785743474, 16864.049985157206, -0.5124682025216784, 14521.069005125159, -10.740782200739309, 18756.807715014013, -1723.9353962656946, 87029.99828299093, 5.7383786020894195e-05, 4762.960401619296, 0.7331769713238158, -308.5673034493341, 85.29725765515369, 0.4268843538235295, -0.17788805472511407, -1.1727033611646802, 7578.6822604990175, 0.5124673187864222, 0.1595627909684813, -145.93742731401096, -2954.234440189563, 0.009672881359732015, 106.4646644917487, -0.050606976105730346, 2.3904047264403596, -4.987645640997455, -43.22984692765006, -36.177108409134966, -0.3812547430698569, -2959.4921368963633, -1.8635802741029985, 0.020513128847167047, -0.9179124323385958] | |
(i2h, h2o, bias) = split_weights( | |
test_weights, | |
input_values, | |
hidden_layer_size | |
) | |
ANN.__init__(self, i2h, h2o, bias) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment