Skip to content

Commit 3a0a2d8

Browse files
author
MatheusZickuhr
committed
Merge branch 'develop'
2 parents 7a37411 + 0f8bfef commit 3a0a2d8

44 files changed

Lines changed: 1029 additions & 491 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
MANIFEST
2+
PyGame-Learning-Environment/
3+
gym/
4+
/dist/
15
/venv/
26
/.idea/
3-
*.pyc
7+
*.pyc
8+
*.json
9+
*.csv
10+
*.png

README.md

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
12
# python-ne
23
A neuroevolution library for python
34

4-
5-
# how to install (github)
5+
# how to install
66

77
```
88
git clone https://github.com/MatheusZickuhr/python-ne.git
@@ -19,7 +19,13 @@ pip install python-ne
1919
# example (xor)
2020

2121
```python
22+
from python_ne.core.ga.csv_logger import CsvLogger
23+
from python_ne.core.ga.console_logger import ConsoleLogger
24+
from python_ne.core.ga.matplotlib_logger import MatplotlibLogger
25+
from python_ne.core.ga.mutation_strategies import Mutation1
26+
from python_ne.core.model_adapters.default_model_adapter import DefaultModelAdapter
2227
from python_ne.core.ga.genetic_algorithm import GeneticAlgorithm
28+
from python_ne.core.ga.crossover_strategies import Crossover1
2329
import numpy as np
2430

2531

@@ -29,33 +35,42 @@ def calc_fitness(element):
2935

3036
fitness = 0
3137
for x, y in zip(X, Y):
32-
prediction = element.get_output(x)
38+
prediction = np.argmax(element.get_output(x))
3339
if prediction == y:
3440
fitness += 1
3541
return fitness
3642

3743

38-
genetic_algorithm = GeneticAlgorithm(
39-
population_size=200,
40-
input_shape=(2,),
41-
output_size=2,
42-
selection_percentage=0.5,
43-
mutation_chance=0.1,
44-
fitness_threshold=4,
45-
ne_type='ne', # ne or neat
46-
backend_adapter='default', # default or keras,
47-
neural_network_config=[128, 128] # two hidden layers with 128 neurons each
48-
)
49-
50-
genetic_algorithm.run(
51-
number_of_generations=1000,
52-
calculate_fitness_callback=calc_fitness
53-
)
54-
55-
best_element = genetic_algorithm.get_best_element()
56-
57-
print(f'the fitness of the best element is {best_element.fitness}')
58-
59-
44+
if __name__ == '__main__':
45+
genetic_algorithm = GeneticAlgorithm(
46+
population_size=200,
47+
selection_percentage=0.9,
48+
mutation_chance=0.01,
49+
fitness_threshold=4,
50+
model_adapter=DefaultModelAdapter,
51+
crossover_strategy=Crossover1(),
52+
mutation_strategy=Mutation1(),
53+
neural_network_config=[((2,), 8, 'tanh'), (2, 'tanh')],
54+
)
55+
56+
csv_logger = CsvLogger()
57+
genetic_algorithm.add_observer(csv_logger)
58+
matplotlib_logger = MatplotlibLogger()
59+
genetic_algorithm.add_observer(matplotlib_logger)
60+
genetic_algorithm.add_observer(ConsoleLogger())
61+
62+
genetic_algorithm.run(
63+
number_of_generations=1000,
64+
calculate_fitness_callback=calc_fitness
65+
)
66+
67+
csv_logger.save('file.csv')
68+
matplotlib_logger.save_fitness_chart('fitness.png')
69+
matplotlib_logger.save_time_chart('time.png')
70+
matplotlib_logger.save_std_chart('std.png')
71+
72+
best_element = genetic_algorithm.get_best_element()
73+
74+
print(f'the fitness of the best element is {best_element.raw_fitness}')
6075

6176
```
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import gym
2+
3+
from python_ne.core.ga.console_logger import ConsoleLogger
4+
from python_ne.core.ga.crossover_strategies import NoCrossover
5+
from python_ne.core.ga.mutation_strategies import Mutation1
6+
from python_ne.core.model_adapters.default_model_adapter import DefaultModelAdapter
7+
from python_ne.extra.env_adapters.gym_env_adapter import GymEnvAdapter
8+
from python_ne.extra.ne_agent import NeAgent
9+
10+
if __name__ == '__main__':
11+
env = gym.make('LunarLander-v2')
12+
13+
env_adapter = GymEnvAdapter(env=env, render=False, continuous=False)
14+
15+
agent = NeAgent(
16+
env_adapter=env_adapter,
17+
model_adapter=DefaultModelAdapter,
18+
)
19+
20+
nn_config = (
21+
(env_adapter.get_input_shape(), 16, 'tanh'),
22+
(env_adapter.get_n_actions(), 'tanh')
23+
)
24+
25+
agent.train(
26+
number_of_generations=1000,
27+
population_size=500,
28+
selection_percentage=0.9,
29+
mutation_chance=0.01,
30+
fitness_threshold=250,
31+
neural_network_config=nn_config,
32+
crossover_strategy=NoCrossover(),
33+
mutation_strategy=Mutation1(),
34+
loggers=(ConsoleLogger(),),
35+
play_n_times=5,
36+
max_n_steps=300,
37+
reward_if_max_step_reached=-200
38+
)
39+
40+
agent.save('ne_agent.json')
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import gym
2+
3+
from python_ne.core.ga_neural_network.ne_neural_network import NeNeuralNetwork
4+
from python_ne.core.model_adapters.default_model_adapter import DefaultModelAdapter
5+
from python_ne.extra.env_adapters.gym_env_adapter import GymEnvAdapter
6+
from python_ne.extra.ne_agent import NeAgent
7+
8+
if __name__ == '__main__':
9+
env = gym.make('LunarLander-v2')
10+
11+
env_adapter = GymEnvAdapter(env=env, render=False)
12+
13+
agent = NeAgent(
14+
env_adapter=env_adapter,
15+
ne_type=NeNeuralNetwork,
16+
model_adapter=DefaultModelAdapter,
17+
)
18+
19+
agent.load('ne_agent.json')
20+
# agent.max_n_steps = 300
21+
total_r = 0
22+
for i in range(100):
23+
total_r += agent.play()
24+
if i > 0:
25+
print(total_r / i)

examples/ne_agent_example.py

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import os
2+
3+
from python_ne.core.ga.console_logger import ConsoleLogger
4+
from python_ne.core.ga.crossover_strategies import Crossover1, NoCrossover
5+
from python_ne.core.ga.mutation_strategies import Mutation1
6+
from python_ne.core.model_adapters.keras_model_adapter import KerasModelAdapter
7+
8+
os.putenv('SDL_VIDEODRIVER', 'fbcon')
9+
os.environ["SDL_VIDEODRIVER"] = "dummy"
10+
11+
12+
from python_ne.core.model_adapters.default_model_adapter import DefaultModelAdapter
13+
from python_ne.extra.ne_agent import NeAgent
14+
from python_ne.extra.env_adapters.ple_env_adapter import PleEnvAdapter
15+
from ple.games.flappybird import FlappyBird
16+
from ple import PLE
17+
18+
if __name__ == '__main__':
19+
env = PLE(FlappyBird(), display_screen=False, force_fps=True)
20+
env.init()
21+
22+
env_adapter = PleEnvAdapter(env=env)
23+
24+
agent = NeAgent(
25+
env_adapter=env_adapter,
26+
model_adapter=KerasModelAdapter,
27+
)
28+
29+
agent.train(
30+
number_of_generations=150,
31+
population_size=500,
32+
selection_percentage=0.9,
33+
mutation_chance=0.01,
34+
fitness_threshold=50,
35+
crossover_strategy=NoCrossover(),
36+
mutation_strategy=Mutation1(),
37+
neural_network_config=[
38+
(env_adapter.get_input_shape(), 16, 'tanh'),
39+
(env_adapter.get_n_actions(), 'tanh')
40+
],
41+
loggers=(ConsoleLogger(),)
42+
)
43+
44+
agent.save('ne_agent.json')
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from python_ne.core.model_adapters.default_model_adapter import DefaultModelAdapter
2+
from python_ne.core.model_adapters.keras_model_adapter import KerasModelAdapter
3+
from python_ne.extra.ne_agent import NeAgent
4+
from python_ne.extra.env_adapters.ple_env_adapter import PleEnvAdapter
5+
from ple.games.flappybird import FlappyBird
6+
from ple import PLE
7+
8+
if __name__ == '__main__':
9+
env = PLE(FlappyBird(), display_screen=True, force_fps=False)
10+
env.init()
11+
12+
env_adapter = PleEnvAdapter(env=env)
13+
14+
agent = NeAgent(
15+
env_adapter=env_adapter,
16+
model_adapter=KerasModelAdapter,
17+
)
18+
19+
agent.load('ne_agent.json')
20+
while 1:
21+
agent.play()

examples/xor_example.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1+
from python_ne.core.ga.csv_logger import CsvLogger
2+
from python_ne.core.ga.console_logger import ConsoleLogger
3+
from python_ne.core.ga.matplotlib_logger import MatplotlibLogger
4+
from python_ne.core.ga.mutation_strategies import Mutation1
5+
from python_ne.core.model_adapters.default_model_adapter import DefaultModelAdapter
16
from python_ne.core.ga.genetic_algorithm import GeneticAlgorithm
7+
from python_ne.core.ga.crossover_strategies import Crossover1
28
import numpy as np
39

410

@@ -8,7 +14,7 @@ def calc_fitness(element):
814

915
fitness = 0
1016
for x, y in zip(X, Y):
11-
prediction = element.get_output(x)
17+
prediction = np.argmax(element.get_output(x))
1218
if prediction == y:
1319
fitness += 1
1420
return fitness
@@ -17,21 +23,31 @@ def calc_fitness(element):
1723
if __name__ == '__main__':
1824
genetic_algorithm = GeneticAlgorithm(
1925
population_size=200,
20-
input_shape=(2,),
21-
output_size=2,
22-
selection_percentage=0.5,
23-
mutation_chance=0.1,
26+
selection_percentage=0.9,
27+
mutation_chance=0.01,
2428
fitness_threshold=4,
25-
ne_type='ne', # ne or neat
26-
backend_adapter='default', # default or keras,
27-
neural_network_config=[128, 128] # two hidden layers with 128 neurons each
29+
model_adapter=DefaultModelAdapter,
30+
crossover_strategy=Crossover1(),
31+
mutation_strategy=Mutation1(),
32+
neural_network_config=[((2,), 8, 'tanh'), (2, 'tanh')],
2833
)
2934

35+
csv_logger = CsvLogger()
36+
genetic_algorithm.add_observer(csv_logger)
37+
matplotlib_logger = MatplotlibLogger()
38+
genetic_algorithm.add_observer(matplotlib_logger)
39+
genetic_algorithm.add_observer(ConsoleLogger())
40+
3041
genetic_algorithm.run(
3142
number_of_generations=1000,
3243
calculate_fitness_callback=calc_fitness
3344
)
3445

46+
csv_logger.save('file.csv')
47+
matplotlib_logger.save_fitness_chart('fitness.png')
48+
matplotlib_logger.save_time_chart('time.png')
49+
matplotlib_logger.save_std_chart('std.png')
50+
3551
best_element = genetic_algorithm.get_best_element()
3652

37-
print(f'the fitness of the best element is {best_element.fitness}')
53+
print(f'the fitness of the best element is {best_element.raw_fitness}')

python_ne/core/backend_adapters/keras_backend_adapter.py

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from python_ne.utils.observer import Observer
2+
3+
4+
class ConsoleLogger(Observer):
5+
def notify(self, *args, **kwargs):
6+
print(f'generation={kwargs["current_generation"]}/{kwargs["number_of_generations"]},' +
7+
f' bestfitness={kwargs["best_element_fitness"]}, std={kwargs["population_fitness_std"]},' +
8+
f' runtime={kwargs["generation_time"]}')

0 commit comments

Comments
 (0)