Como hemos visto, los algoritmos genéticos tratan de imitar de manera parcial los procesos de la evolución y selección natural. Sin embargo, en la década de los 90s surgieron algoritmos inspirados en reproducir comportamientos de otros procesos biológicos, como es el comportamiento colectivo de ciertas especies como las hormigas, aves, abejas o peces. De aquà surgen los algoritmos bioinspirados. A continuación, veremos dos técnicas bioinspiradas, optimización por cúmulo de partÃculas y evolución diferencial. La optimización por cúmulo de partÃculas es una técnica bioinspirada para resolver problemas de optimización y búsqueda. Al igual que los algoritmos genéticos, es una técnica basada en poblaciones. Esta técnica fue propuesta por James Kennedy y Russell Eberhart en 1995, tomando como ideas principales el comportamiento inteligente de cierto tipo de animales, como las aves o peces, y la computación evolutiva. PSO trabaja al mantener una población de partÃculas, que son soluciones potenciales, en el espacio de búsqueda. En cada iteración, generación en el algoritmo genético, cada solución es evaluada en la función objetivo para determinar su aptitud y cada una de estas soluciones potenciales se pueden ver como partÃculas volando a través del espacio de búsqueda, para encontrar el valor máximo o mÃnimo de la función objetivo. Inicialmente, el algoritmo PSO genera soluciones candidatas de manera aleatoria dentro del espacio de búsqueda. Cada solución contiene información de su posición, compuesta de la solución potencial y su valor de aptitud, asà como su velocidad. Adicionalmente, cada partÃcula conserva la solución con el mejor valor de aptitud encontrada hasta el momento, la cual se denomina "mejor solución local". Finalmente, PSO conserva la mejor solución encontrada hasta el momento, de todo el cúmulo, denominada "mejor solución global". El cambio en la velocidad y posición de cada partÃcula es el mecanismo responsable de la optimización. La velocidad de cada partÃcula en el cúmulo es calculada por la siguiente ecuación. El Ãndice de la partÃcula es representado por "i", por lo que "vi de t" es la velocidad de la partÃcula "i" en el tiempo "t" y "xi de t" es la posición de la partÃcula "i" en el tiempo "t". Los parámetros "Omega", "c1" y "c2" son definidos por el usuario y se toman en los rangos de 0 a 1,2; de 0 a 2; y de 0 a 2; respectivamente. "r1" y "r2" son valores aleatorios en el rango de cero a uno. El primer término es el componente inercial, el cual mantiene a la partÃcula "solución" moviéndose en la dirección dada por el segundo y tercer término de la ecuación. Valores pequeños del coeficiente de inercia lleva a la convergencia más rápidamente, mientras que un valor alto permite una mayor exploración del espacio de búsqueda. El segundo término se conoce como el "factor cognitivo", actúa como la memoria de la partÃcula, provocando que la búsqueda regrese a la región donde ha encontrado el mejor valor de aptitud a lo largo de las iteraciones. El tercer término es la componente social que provoca que la partÃcula se mueva hacia la mejor región del cúmulo. Una vez que la velocidad de cada partÃcula se ha calculado, se actualiza la posición de la partÃcula o solución de la siguiente manera. La evolución diferencial, "DE" por sus siglas en inglés, es un algoritmo bioinspirado propuesto por Kenneth Price y Rainer Storn, en 1995. Es una técnica basada en poblaciones que enfatiza la mutación y, posteriormente, aplica un operador de cruza uniforme. Inicialmente, el algoritmo de evolución diferencial genera soluciones candidatas de manera aleatoria dentro del espacio de búsqueda del problema en estudio. Evolución diferencial genera nuevas soluciones cada iteración al aplicar una mutación diferencial, la cual agrega la diferencia proporcional de dos individuos, "r1" y "r2", elegidos aleatoriamente de la población, a un tercer individuo "r3", también elegido aleatoriamente. Los individuos "r1", "r2" y "r3" son mutuamente exclusivos y, a su vez, diferente de "xi". El nuevo individuo, individuo mutado, por tanto, se define como "la constante de mutación F", la cual está en un rango de cero a uno, determina el rango de diferenciación entre los individuos "r1" y "r2". Posteriormente, se aplica la cruza sobre cada individuo "vi" para generar un individuo "ui". Este individuo es construido al aplicar una cruza intercalando los componentes, los cuales representan las variables de decisión del problema en estudio de la solución de la población anterior en la posición "i"; la cual es representada por "xi de t" con la intermedia, representada por "vi de t más uno", donde "t" representa la iteración o generación, "i" la posición del individuo en la población, y "j" es el Ãndice de cada variable de decisión que integra al individuo. Finalmente, el operador de selección decidirá, en función de la aptitud, si el nuevo individuo "ui de t más uno" es aceptado o se conserva el individuo "xi de t". Es relevante hacer mención que tanto PSO como evolución diferencial fueron propuestos inicialmente para resolver problemas de optimización paramétrica y, por tanto, trabajan sobre una codificación real, sobre un vector de valores reales que representan las variables de decisión. Por esta razón, no se tiene un mapeo o decodificación. No asà con algoritmos genéticos, los cuales fueron propuestos inicialmente para operar sobre una codificación binaria. Sin embargo, actualmente se cuentan con diversas versiones de algoritmos genéticos con codificación real y codificación entera para problemas de optimización combinatoria.