Renombrado de variable

Se renombra la variable para mantener consistencia de nombres en todo el
programa. A las operaciones (+-*/) se las llama operadores.
Eliminación de casting innecesario
Uso de una estructura para almacenar el individuo

La estructura permite almacenar la asignación de letras a números y la
aptitud del individuo.
Definición de función de comparación de individuos

Permite comparar los individuos según su aptitud para su posterior
ordenamiento según ese parámetro.
Cambio de declaración de estructura de individuos

Se pasa de un puntero a un array de estructuras de individuos (con su
consiguiente reserva y liberación de memoria) a directamente un array de
estructuras.
Comienzo de implementación de selección elitista

Se ordenan los individuos por aptitud y se elije el mejor 5% (valor que
debería ser parametrizable). Se sigue dando forma al ciclo del AG.
Cambio del tipo de dato de variable cantidad_elite

Todas las variables que representen población deben ser uint32_t.
Eliminación de sentencia `break;` inútil

Al empezar a trabajar con generaciones ya no hace falta.
Implementación de algoritmo de selección

Se implementa el algoritmo de selección por ranking con copias
esperadas.
Uso de puntero para estructuras de individuos

Se vuelve a un puntero a un array de estructuras de individuos (con su
consiguiente reserva y liberación de memoria) para poder manejar grandes
cantidades de individuos, limitado solo por la cantidad de memoria.
Nuevo argumento `-s' para especificar la semilla

El argumento [-s|--semilla] permite especificar la semilla para generar
la población incial, con el objeto de poder repetir las corridas para
comparar funciones.
Ajuste de longitud de campo letras de individuo

Con 10 `chars' es suficiente, no hace falta 1 más para el caracter nulo
('\0'), porque ese campo nunca se interpreta como string.
Cambio de firma de seleccion_por_ranking_con_ce

Se cambia el orden de los parámetros y la cantidad de individuos se pasa
como puntero.
Arreglo de la función seleccion_por_ranking_con_ce

No incluía en la población sobre la que aplica la selección a los
individuos elegidos en la selección elitista.
Arreglo dentro de seleccion_por_ranking_con_ce

Faltaba incluir la variable `copias_totales' en la verificación de que
no se intente copiar más individuos de los que hay.
Arreglo de potencial división por 0

Si la cantidad de individuos en `seleccion_por_ranking_con_ce' era 1,
dividia por 0 al calcular las `copias_por_individuo'. Este arreglo hace
la verificación y asigna 1 a `copias_por_individuo' si la cantidad es 1.
Arreglo en el algoritmo shunting yard

Faltaba sacar el paréntesis de apertura `(' luego de realizar todas las
operaciones al encontrar un paréntesis de cierre.
Implementación de algoritmo de cruza multipunto

La cantidad de puntos para cruzar se puede pasar como parámetro, es
válido de 1 a 4 puntos.
Nuevo parámetro `-g' en las opciones del programa

El parámetro [-g|--generaciones] permite especificar la cantidad de
generaciones del AG. Si no se especifica se crean 10 generaciones.
Se modifica la estructura del ciclo del AG