Skip to content

kaleLetendre/GeneticAlgorithm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Genetic Algorithm Implementation in C

A configurable genetic algorithm implementation in C. Demonstrates core GA concepts: selection, crossover, mutation, and fitness evaluation.

Getting Started

Clone the repository and compile:

gcc GeneticAlgorithm.c -o genetic_algorithm -lm

Run:

./genetic_algorithm

Configuration

All 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

Fitness Functions

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

Code Structure

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

Adding Custom Fitness Functions

  1. 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)
    }
  2. Add max fitness calculation in getMaxFitness()

  3. Add the function mapping in main()

  4. Use it in config.txt: fitnessFunc=myFitnessFunc

Example Output

Gen 523|Genes|12131213 fitness: 6
Result (Gen 524):12131312 fitness: 7

Real-World Applications

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

About

a genetic algorithm being written in C

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages