A Python-based optimization framework using Genetic Algorithms and CMA-ES (Covariance Matrix Adaptation Evolution Strategy) to optimize biomechanical movements in OpenSim models. This project simulates and optimizes muscle activation patterns for various movements including jumping, counter-movement jumps, and flips. This project is developed only for learning purposes and not suitable for research.
-
Multiple Optimization Algorithms
- Genetic Algorithm with customizable mutation, crossover, and selection
- CMA-ES (Covariance Matrix Adaptation Evolution Strategy) solver
-
Biomechanical Movement Types
- Jumper: Basic vertical jump optimization
- cmjJumper: Counter-movement jump optimization
- Flipper: Backflip/flip movement optimization
-
Parallel Processing
- Multi-worker support for faster simulations
- Automatic CPU core detection or manual worker configuration
-
Flexible Muscle Control
- Muscle group-based control system
- Time-based activation patterns
- Support for 8 major muscle groups:
- Quadriceps
- Hamstrings
- Glutes
- Calves
- Tibialis Anterior
- Trunk Flexors
- Trunk Extensors
- Hip Flexors
This project requires:
- Python 3.x
- OpenSim (opensim-python)
- NumPy
- CMA (for CMA-ES solver)
- Multiprocessing support
See requirements.txt for the complete list of dependencies.
- Clone the repository:
git clone https://github.com/Talhauzumcu/GeneticAlgorithm.git
cd GeneticAlgorithm-
Install Miniconda (if not already installed):
- Download from Miniconda official site
- Follow the installation instructions for your operating system
-
Create and activate a conda environment:
conda create -n opensim-env python=3.x
conda activate opensim-env- Install OpenSim:
conda install -c opensim-org opensim- Install the remaining dependencies:
pip install -r requirements.txtRun the main script to start optimization:
python main.pyEdit the parameters in main.py to customize the optimization:
POPULATION_SIZE = 200 # Number of individuals in each generation
GENERATION_COUNT = 1000 # Number of generations to evolve
MUTATION_RATE = 0.02 # Probability of mutation (0-1)
INTEGRATION_DURATION = 2 # Simulation time in seconds
OVERLAP = 5 # Elite individuals to carry forward
RANDOM = 0 # Random individuals to introduce per generation
N_WORKERS = 8 # Number of parallel workersChoose your movement type in main.py:
from objects import Jumper, cmjJumper, Flipper
# Select one:
pop_object = Jumper # For basic jump
pop_object = cmjJumper # For counter-movement jump
pop_object = Flipper # For flip movementsfrom geneticSolver import geneticSolver
genetic_solver = geneticSolver(
model_path='./models/your_model.osim',
population_object=Jumper,
initial_population=None, # or provide custom population
population_size=200,
generation_count=1000,
mutation_rate=0.02,
overlap=5,
random=0,
initial_time=0.0,
final_time=2.0,
n_workers=8,
termination_function=your_termination_function
)from cmaSolver import cmaSolver
cma_solver = cmaSolver(
model_path='./models/your_model.osim',
population_object=Jumper,
population_size=200,
generation_count=1000,
initial_time=0.0,
final_time=2.0,
n_workers=8,
termination_function=your_termination_function,
sigma0=0.3 # Initial standard deviation
)Results are saved as JSON files containing:
- Generation number
- Individual ID
- Fitness score
- Muscle activation patterns (genom)
Example filename: flipper_gen100_15_1.84.json
gen100: Generation 10015: Individual ID 151.84: Fitness score of 1.84
Define custom termination conditions for your simulations:
def termination_function(model, state):
pelvis_ty = model.getCoordinateSet().get('pelvis_ty').getValue(state)
return pelvis_ty < 0.25 # Stop if pelvis height below 0.25- Talha Uzumcu