# Introduction to genetic.algo.optimizeR

## Overview

This vignette demonstrates how to use the `genetic.algo.optimizeR` package to optimize the function \(f(x) = x^2 - 4x + 4\) using a genetic algorithm.

## Aim

Optimize the function \(f(x) = x^2 - 4x + 4\) to find the value of \(x\) that minimizes the function.

## Method

### Initial Population

We start with a population of three individuals: \(x_1 = 1\), \(x_2 = 3\), and \(x_3 = 0\).

    # devtools::install_github("danymukesha/genetic.algo.optimizeR", upgrade = c("never"),)
    library(genetic.algo.optimizeR)

    # Initialize population
    population <- initialize_population(population_size = 3, min = 0, max = 3)
    population
    #> [1] 1 2 3

### Evaluation

We evaluate the fitness of each individual by calculating \(f(x)\) for each \(x\) value:

    # Evaluate fitness
    fitness <- evaluate_fitness(population)
    fitness
    #> [1] 1 0 1

### Selection

We select individuals \(x_1\) and \(x_2\) as parents for crossover because they have higher fitness.

    # Perform selection
    selected_parents <- selection(population, fitness, num_parents = 2)
    selected_parents
    #> [1] 2 1

### Crossover and Mutation

We perform crossover and mutation on the selected parents to generate offspring: \(x_1' = 1\), \(x_2' = 3\).

    # Perform crossover
    offspring <- crossover(selected_parents, offspring_size = 2)
    offspring
    #> [1] 2 2

    # Perform mutation
    mutated_offspring <- mutation(offspring, mutation_rate = 0.1)
    mutated_offspring
    #> [1] 2 2

### Replacement

We replace individual \(x_3\) with offspring \(x_1'\), maintaining the population size.

    # Replace individuals in the population
    new_population <- replacement(population, mutated_offspring, num_to_replace = 1)
    new_population
    #> [1] 1 2 2

    # Termination
    # Repeat the above steps(from Evaluation) for multiple generations or until a termination condition is met.

## Warp-Up

This vignette demonstrates the usage of the `genetic.algo.optimizeR` package to optimize the given function using a genetic algorithm. Users can follow similar steps to optimize other functions or customize the parameters as needed.