Arreglo en la selección elitista con ranking

En la fórmula con rmin se estaba utilizando la cantidad de copias
necesarias en vez del tamaño de la población como valor de n.
Cambio de implementación del Merssene twister

Se utiliza la implementación "mtwist" del algoritmo Merssene twister para la
generación de números aleatorios, de http://www.cs.hmc.edu/~geoff/mtwist.html

Como hace uso de `inline' hay que compilar con la opción -fgnu89-inline
poqrue la semántica de esa palabra en C99 y C89 es distinta.

La función al_azar ahora devuelve unsigned long int porque el índice de
un individuo puede superar al rango de unsigned int.
Se mejora un poco la muestra de información

Solo se muestra la corrida con la opción -d y sin esa opción cuando
encuentra solución y hay más de una corrida muestra en cual se encontró.
Se optimiza el registro del tiempo

Se utilizan punteros y solo se reserva memoria y se registra el tiempo
cuando se pasa la opción -d (que muestra el tiempo de duración de cada
generación).
Solo se muestra la corrida cuando hay más de una

Cuando encuentra solución y no se pasa la opción -d y hay más de una
corrida se muestra en que corrida encuentra la solución. Pero si hay una
sola corrida no tiene sentido mostrar esa información, porque siempre
va a ser la misma.
Se optimiza un poco el cálculo de aptitud

No se realizan operaciones que son solo necesarias con la opción -ddd.
Modificación de CFLAGS para optimizar rendimiento
Se alterna entre mutación simple y de varios genes

En mutación se elige un número aleatorio entre 0 y 1, con 1 hace
mutación simple (se eligen dos genes), y con 0 muta tantos genes como
dígitos de aptitud tenga.
Modificación de la selección elitista

Se modifica para que se copie la menor cantidad de individuos iguales
posibles. Ej.: si el primer y segundo individuo son iguales (misma
asignación de letras) se hace una copia del primero y no del segundo, en
busca de copiar otros distintos. Si hace falta para completar la
cantidad de copias, se copian individuos repetidos.
Inicializa algunas estructuras

Para que el compilador no de warnings innecesarios.
Hijos no queden iguales a los padres al cruzar

Se evita que los hijos sean copias idénticas a los padres cuando se
realiza la cruza cíclica. Si la operación es muy simple (ej.: pocas
letras/operandos) se intenta hasta 4 veces para no quedar en un bucle
infinito.
Se reacomoda el código para facilitar lectura
Función para definir selección, cruza y mutación

Se desarrolla una función para (re)definir las cantidades de selección,
cruza y mutación. Esto permite modificar la población durante la
ejecución del algoritmo.
Variable (re)inicializada en lugar incorrecto

Aunque no haya cruza es necesario asignar 0 a n_peores para que no
intente copiar a la nueva población individuos de cruza (que no se
realiza).