A configurable genetic algorithm implementation in C. Demonstrates core GA concepts: selection, crossover, mutation, and fitness evaluation.
Clone the repository and compile:
gcc GeneticAlgorithm.c -o genetic_algorithm -lmRun:
./genetic_algorithmAll parameters are set in config.txt:
pop=100
minGeneValue=1
maxGeneValue=3
size=8
numParents=3
mutationRate=100
maxGens=100000
verbosity=1
fitnessFunc=fitnessCalculator
| Parameter | Description |
|---|---|
| pop | Population size (number of individuals) |
| minGeneValue | Minimum value a gene can have |
| maxGeneValue | Maximum value a gene can have |
| size | Number of genes per individual |
| numParents | Number of fittest individuals selected for breeding |
| mutationRate | Higher = fewer mutations (1/mutationRate chance per gene) |
| maxGens | Maximum generations before stopping |
| verbosity | 0 = silent, 1 = show progress |
| fitnessFunc | Which fitness function to use |
| Function | Goal | Max Fitness |
|---|---|---|
| fitnessCalculator | All genes equal 1 | size |
| palindromeCalculator | Genes form a palindrome | size/2 |
| ascendingCalculator | Genes in ascending order | size-1 |
| alternatingCalculator | Genes alternate min/max | size |
| noRepeatCalculator | No adjacent genes match | size-1 |
| sumTargetCalculator | Gene sum equals size*2 | size*2 |
| primeCalculator | Genes form a prime number | -2 |
| Function | Description |
|---|---|
| printIndividual() | Prints an individual's genes and fitness |
| printPopulation() | Prints fitness scores for all individuals |
| initialisePopulation() | Creates random initial population |
| naturalSelection() | Selects fittest individuals as parents |
| getFitness() | Calculates fitness for entire population |
| reproduction() | Creates next generation via crossover and mutation |
| geneticAlgorithm() | Main loop orchestrating the evolution |
| readConfig() | Loads settings from config.txt |
| getMaxFitness() | Returns max fitness for the selected function |
-
Add your function following this signature:
int myFitnessFunc(int* population, int size, int index){ // Access genes with: *(population + index*size + i) // Return fitness score (higher = better) }
-
Add max fitness calculation in
getMaxFitness() -
Add the function mapping in
main() -
Use it in config.txt:
fitnessFunc=myFitnessFunc
Gen 523|Genes|12131213 fitness: 6
Result (Gen 524):12131312 fitness: 7
Genetic algorithms are useful when the search space is too large for brute force and there's no gradient to follow:
- Scheduling (shifts, timetables, routes)
- Engineering optimization (antenna design, structural layout)
- Neural network architecture search
- Game AI strategy tuning
- Drug discovery