def test_execution_no_transitions(self): sm = StateMachineNetwork([State(1)], []) sm.states[1].set_biases([1, 2]) sm.states[1].set_weights([[1, 2], [3, 4]]) next_state, output = sm.activate(1, [5, 10]) self.assertEqual(next_state, 1) self.assertEqual(output, [26, 57])
def test_execution_true_transition(self): sm = StateMachineNetwork([State(1), State(2)], [Transition(1, 2)]) sm.states[1].set_biases([1, 2]) sm.states[1].set_weights([[1, 2], [3, 4]]) sm.transitions[1][0].add_condition(Condition(0, operator.eq, 5)) next_state, output = sm.activate(1, [5, 10]) self.assertEqual(next_state, 2) self.assertEqual(output, [26, 57])
def test_execution_multiple_transitions_all_false(self): sm = StateMachineNetwork( [State(1), State(2), State(3)], [Transition(1, 2), Transition(1, 2)]) sm.states[1].set_biases([1, 2]) sm.states[1].set_weights([[1, 2], [3, 4]]) sm.transitions[1][0].add_condition(Condition(0, operator.eq, 4)) sm.transitions[1][1].add_condition(Condition(1, operator.gt, 10)) next_state, output = sm.activate(1, [5, 10]) self.assertEqual(1, next_state) self.assertEqual(output, [26, 57])
def test_transition_multiple(self): sm = StateMachineNetwork( [State(1), State(2)], [Transition(1, 2), Transition(2, 1)]) self.assertEqual(len(sm.transitions), 2) self.assertEqual(len(sm.transitions[1]), 1) self.assertEqual(len(sm.transitions[2]), 1)
def learn_cartpole(config_path): env = gym.make('CartPole-v0') env._max_episode_steps = max_evaluation_steps # Load configuration. config = Config(StateMachineGenome, DefaultReproduction, DefaultSpeciesSet, DefaultStagnation, config_path) # Create the population, which is the top-level object for a NEAT run. p = Population(config) # Add a stdout reporter to show progress in the terminal. p.add_reporter(StdOutReporter(True)) stats = StatisticsReporter() p.add_reporter(stats) # Run for up for the given number of generations f = lambda genomes, config: eval_genomes(genomes, config, env=env) winner = p.run(f, num_generations) input("Press Enter to continue...") net = StateMachineNetwork.create(winner, config) eval_network(net, env, True)
def test_one_state(self): genome = StateMachineGenome(1) config = init_config() genome.configure_new(config) smn = StateMachineNetwork.create(genome, config) self.assertEqual(len(smn.states), 1) self.assertEqual(len(smn.transitions), 1)
def test_create_transition(self): genome = StateMachineGenome(1) config = init_config() genome.configure_new(config) genome.mutate_add_state(config) genome.mutate_add_transition(config) smn = StateMachineNetwork.create(genome, config) self.assertEqual(len(smn.states), 2) self.assertEqual(len(smn.transitions), 2) self.assertEqual(2, len(smn.transitions[1]) + len(smn.transitions[0]))
if __name__ == '__main__': # First load the genome genome = pickle.load(open(genome_path, "rb")) local_dir = os.path.dirname(__file__) config_path = os.path.join(local_dir, config_name) config = Config(StateMachineGenome, DefaultReproduction, DefaultSpeciesSet, DefaultStagnation, config_path) # Create the environment env = gym.make(env_name) # Run the genome net = StateMachineNetwork.create(genome, config.genome_config) observation = env.reset() fitnesses = [] states = [0 for _ in range(len(observation))] for i in range(num_steps): output = [ net.activate(states[i], observation[i]) for i in range(len(observation)) ] states = [state for state, _ in output] actions = [action for _, action in output] observation, _, _, _ = env.step(actions) fitnesses.append(env.get_fitness()) # Show plot of fitness over time.
def test_init(self): sm = StateMachineNetwork([], []) self.assertEqual(len(sm.transitions), 0) self.assertEqual(len(sm.states), 0)
def test_transition_multiple_begin_state(self): sm = StateMachineNetwork( [State(1), State(2), State(3)], [Transition(1, 2), Transition(1, 3)]) self.assertEqual(len(sm.transitions), 3) self.assertEqual(len(sm.transitions[1]), 2)
def test_add_state_twice(self): with self.assertRaises(ValueError) as context: StateMachineNetwork([State(1), State(1)], []) self.assertTrue('State included twice' in str(context.exception))
def test_add_state(self): sm = StateMachineNetwork([State(1)], []) self.assertEqual(len(sm.states), 1) self.assertEqual(sm.states[1].id, 1)
def test_empty_sm_creation(self): genome = StateMachineGenome(1) smn = StateMachineNetwork.create(genome, init_config()) self.assertEqual(len(smn.states), 0) self.assertEqual(len(smn.transitions), 0)
def test_invalid_state(self): sm = StateMachineNetwork([State(1)], []) self.assertRaises(KeyError, sm.activate, 3, [5, 10])
def eval_genomes(genomes, config, env): for genome_id, genome in genomes: genome.fitness = 0 net = StateMachineNetwork.create(genome, config) genome.fitness = eval_network(net, env)
def reset(self, genome, config): self.net = StateMachineNetwork.create(genome, config.genome_config) self.current_state = 0