Algoritmos Evolutivos Sistemas de “Word Equations” - Aic.uniovi.es ...
Algoritmos Evolutivos Sistemas de “Word Equations” - Aic.uniovi.es ...
Algoritmos Evolutivos Sistemas de “Word Equations” - Aic.uniovi.es ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
UNIVERSIDAD DE OVIEDO<br />
Facultad <strong>de</strong> Ciencias<br />
Licenciatura en Matemáticas<br />
<strong>Algoritmos</strong> <strong>Evolutivos</strong><br />
para la R<strong>es</strong>olución <strong>de</strong><br />
<strong>Sistemas</strong> <strong>de</strong> <strong>“Word</strong> <strong>Equations”</strong><br />
Fátima Drubi Vega<br />
Trabajo Académico<br />
Oviedo, julio <strong>de</strong> 2003
Índice general<br />
1. Introducción 4<br />
2. Los <strong>Algoritmos</strong> Genéticos 6<br />
2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
2.2. Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
2.3. Características <strong>de</strong> los <strong>Algoritmos</strong> Genéticos . . . . . . . . . . . . . . . . . . 9<br />
2.4. El Algoritmo Genético Simple . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.4.1. Codificación <strong>de</strong> los Individuos . . . . . . . . . . . . . . . . . . . . . . 11<br />
2.4.2. Generación <strong>de</strong> la Población Inicial . . . . . . . . . . . . . . . . . . . 14<br />
2.4.3. Evaluación <strong>de</strong> los Individuos . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.4.4. Selección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.4.5. Cruce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
2.4.6. Mutación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
2.5. Seudocódigo <strong>de</strong> un Algoritmo Genético Simple . . . . . . . . . . . . . . . . 22<br />
2.6. El Teorema <strong>de</strong> los Esquemas . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
2.7. Otros <strong>Algoritmos</strong> Genéticos: los <strong>Algoritmos</strong> <strong>Evolutivos</strong> . . . . . . . . . . . . 34<br />
3. El Problema <strong>de</strong> Satisfactibilidad 36<br />
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
3.2. Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
3.3. Los <strong>Algoritmos</strong> <strong>Evolutivos</strong> para R<strong>es</strong>olver SAT . . . . . . . . . . . . . . . . . 39<br />
4. <strong>Sistemas</strong> <strong>de</strong> <strong>“Word</strong> <strong>Equations”</strong>: el Algoritmo <strong>de</strong> Makanin 48<br />
4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
4.2. Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
1
4.3. El Algoritmo <strong>de</strong> Makanin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
4.3.1. Repr<strong>es</strong>entación Gráfica . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
4.3.2. Las Ecuacion<strong>es</strong> Generalizadas . . . . . . . . . . . . . . . . . . . . . . 55<br />
4.3.3. EL Algoritmo <strong>de</strong> Transformación . . . . . . . . . . . . . . . . . . . . 60<br />
4.4. Casos Particular<strong>es</strong> <strong>de</strong> <strong>Sistemas</strong> <strong>de</strong> <strong>“Word</strong> <strong>Equations”</strong> . . . . . . . . . . . . . 66<br />
5. Un Algoritmo Genético Simple para R<strong>es</strong>olver l SW ES 71<br />
5.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
5.2. Codificación <strong>de</strong> los Individuos . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
5.3. Generación <strong>de</strong> la Población Inicial . . . . . . . . . . . . . . . . . . . . . . . 74<br />
5.4. Evaluación <strong>de</strong> los Individuos . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />
5.5. Los Operador<strong>es</strong> Genéticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />
6. El Algoritmo Genero Problema 88<br />
7. Primeros R<strong>es</strong>ultados Experimental<strong>es</strong> 91<br />
7.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />
7.2. Tamaño <strong>de</strong> Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />
7.3. Probabilidad <strong>de</strong> mutación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99<br />
8. <strong>Algoritmos</strong> <strong>Evolutivos</strong> para R<strong>es</strong>olver l SW ES 107<br />
8.1. A.E. Sólo Mutación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107<br />
8.2. A.E. Búsqueda Local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />
8.3. R<strong>es</strong>ultados experimental<strong>es</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111<br />
9. Experimento final 125<br />
A. El Algoritmo Genético Simple 128<br />
B. El Algoritmo Genero Problema 145<br />
C. Los problemas propu<strong>es</strong>tos 157<br />
C.1. El problema 10-15-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157<br />
C.2. El problema 10-15-5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158<br />
C.3. El problema 10-3-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158<br />
C.4. El problema 10-5-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159<br />
2
C.5. El problema 10-5-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159<br />
C.6. El problema 10-8-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160<br />
C.7. El problema 10-8-5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160<br />
C.8. El problema 12-6-4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161<br />
C.9. El problema 15-12-4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161<br />
C.10.El problema 15-25-5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162<br />
C.11.El problema 15-7-5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163<br />
C.12.El problema 25-23-4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164<br />
C.13.El problema 25-8-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165<br />
C.14.El problema 25-8-5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166<br />
C.15.El problema 5-15-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167<br />
C.16.El problema 5-3-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167<br />
D. A.E. Sólo Mutación 168<br />
E. A.E. Búsqueda Local 179<br />
Bibliografía 204<br />
3
Capítulo 1<br />
Introducción<br />
En <strong>es</strong>te trabajo hemos intentado reunir los r<strong>es</strong>ultados obtenidos a lo largo <strong>de</strong>l curso<br />
que comenzamos con el objetivo <strong>de</strong> diseñar un algoritmo que proporcione una solución a<br />
un sistema <strong>de</strong> ecuacion<strong>es</strong> conocido como sistema <strong>de</strong> “word equations”.<br />
El capítulo 2 lo <strong>de</strong>dicamos al <strong>es</strong>tudio <strong>de</strong>l tipo <strong>de</strong> algoritmos que preten<strong>de</strong>mos usar<br />
para r<strong>es</strong>olver <strong>es</strong>tos sitemas, los llamados algoritmos evolutivos. Podríamos <strong>de</strong>cir que en<br />
<strong>es</strong>te capítulo se encuentran las herramientas básicas nec<strong>es</strong>arias para su diseño. A<strong>de</strong>más,<br />
como aplicación <strong>de</strong> los mismos a la r<strong>es</strong>olución <strong>de</strong> diferent<strong>es</strong> problemas, <strong>es</strong>tudiamos en el<br />
capítulo 3 los llamados problemas SAT y explicamos el funcionamiento <strong>de</strong> los algoritmos<br />
evolutivos más conocidos para su r<strong>es</strong>olución. Algunos <strong>de</strong> <strong>es</strong>tos algoritmos nos servirán <strong>de</strong><br />
referencia a la hora <strong>de</strong> diseñar el nu<strong>es</strong>tro pu<strong>es</strong>, como veremos, los problemas SAT se<br />
reducen a sistemas <strong>de</strong> “word equations”.<br />
En el capítulo 4 introducimos el problema que preten<strong>de</strong>mos r<strong>es</strong>olver: los sistemas <strong>de</strong><br />
“word equations”, e intentamos r<strong>es</strong>umir la teoría que ya ha sido <strong>de</strong>sarrollada sobre <strong>es</strong>tos<br />
sistemas, <strong>de</strong>stacando las dificulta<strong>de</strong>s que aparecen en su r<strong>es</strong>olución, pu<strong>es</strong> aunque existe<br />
un algoritmo que los r<strong>es</strong>uelve, el algoritmo <strong>de</strong> Makanin, éste no se pue<strong>de</strong> usar en la<br />
práctica por ser un algoritmo con una complejidad triplemente exponencial.<br />
En los siguient<strong>es</strong> capítulos explicamos las distintas propu<strong>es</strong>tas que emplearemos para<br />
el diseño <strong>de</strong>l algoritmo evolutivo.<br />
Nu<strong>es</strong>tro trabajo propiamente dicho comienza en el capítulo 5 diseñando un algoritmo<br />
evolutivo <strong>de</strong>nominado algoritmo genético simple, cuyos primeros r<strong>es</strong>ultados experi-<br />
mental<strong>es</strong> aparecen en el capitulo 7. En el capítulo 6, hacemos un pequeño parént<strong>es</strong>is<br />
para diseñar un algoritmo que construya sistemas <strong>de</strong> “word equations”, pu<strong>es</strong> no existen<br />
4
documentos don<strong>de</strong> podamos encontrar <strong>es</strong>tos problemas.<br />
En el capítulo 8, obtenemos nuevos algoritmos evolutivos añadiendo algunas modifi-<br />
cacion<strong>es</strong> al algoritmo genético simple. Los r<strong>es</strong>ultados experimental<strong>es</strong> nos permitirán com-<br />
probar las mejoras obtenidas al añadir búsqueda local al algoritmo genético simple.<br />
Finalizamos exponiendo los r<strong>es</strong>ultados obtenidos <strong>de</strong>l mejor <strong>de</strong> los algoritmos evolutivos<br />
que hemos diseñado a lo largo <strong>de</strong> <strong>es</strong>te curso.<br />
Todos los algoritmos diseñados se encuentran en los distintos apéndic<strong>es</strong>, <strong>es</strong>critos en el<br />
lenguaje C++. También aparecen algunos <strong>de</strong> los sistemas <strong>de</strong> “word equations” que hemos<br />
utlizado en los diferent<strong>es</strong> experimentos.<br />
5
Capítulo 2<br />
Los <strong>Algoritmos</strong> Genéticos<br />
2.1. Introducción<br />
Un algoritmo genético <strong>es</strong> un proc<strong>es</strong>o <strong>de</strong> búsqueda basado en los mecanismos <strong>de</strong> la<br />
evolución biológica: selección natural, reproducción y mutación.<br />
Fueron <strong>de</strong>sarollados por John Holland [12] , que <strong>de</strong>s<strong>de</strong> pequeño se preguntaba cómo<br />
la naturaleza logra crear ser<strong>es</strong> cada vez más perfectos. Aunque <strong>es</strong>to no <strong>es</strong> totalmente<br />
cierto, r<strong>es</strong>ulta curioso observar que todo tiene lugar mediante interaccion<strong>es</strong> local<strong>es</strong> entre<br />
individuos.<br />
De la lectura <strong>de</strong>l libro titulado “La teoría genética <strong>de</strong> la selección natural” aprendió que<br />
la evolución era una forma <strong>de</strong> adaptación más potente que el simple aprendizaje.<br />
Los objetivos <strong>de</strong> su búsqueda han sido dos:<br />
Abstraer y explicar rigurosamente los proc<strong>es</strong>os <strong>de</strong> adaptación <strong>de</strong> los sistemas natu-<br />
ral<strong>es</strong>.<br />
Diseñar sistemas artificial<strong>es</strong> que conserven los mecanismos <strong>de</strong> los sistemas natural<strong>es</strong>.<br />
Su primer monográfico sobre los algoritmos genéticos se publicó en 1975, “Adaptation in<br />
Natural and Artificial Systems”. Algunos artículos y t<strong>es</strong>is posterior<strong>es</strong> <strong>es</strong>tablecen la vali<strong>de</strong>z<br />
<strong>de</strong> la técnica en la optimización <strong>de</strong> funcion<strong>es</strong> y aplicacion<strong>es</strong> <strong>de</strong> control.<br />
Los algoritmos genéticos son computacionalmente simpl<strong>es</strong>, aunque potent<strong>es</strong> en su<br />
búsqueda y mejora, y han sido aceptados como una aproximación válida a problemas<br />
que requieren búsqueda eficiente y eficaz. A<strong>de</strong>más, no <strong>es</strong>tán limitados por supu<strong>es</strong>tas r<strong>es</strong>-<br />
triccion<strong>es</strong> sobre el <strong>es</strong>pacio <strong>de</strong> búsqueda, como la continuidad o la existencia <strong>de</strong> <strong>de</strong>rivadas.<br />
6
2.2. Conceptos Básicos<br />
Definición 1<br />
Se llama alfabeto a un conjunto finito <strong>de</strong> símbolos dados.<br />
Se <strong>de</strong>notará por A.<br />
Ejemplo 1<br />
Los siguient<strong>es</strong> conjuntos pue<strong>de</strong>n ser alfabetos<br />
1. { 1, 3, 5, 7, 9}<br />
2. { a, b, c,. . . , x, y, z}<br />
3. {α, β, γ}<br />
4. {si, no, inicio, fin}<br />
5. { 0, 1}<br />
Definición 2<br />
Una ca<strong>de</strong>na o palabra <strong>es</strong> una suc<strong>es</strong>ión or<strong>de</strong>nada y finita <strong>de</strong> símbolos <strong>de</strong> un alfabeto.<br />
Se <strong>de</strong>notará por ω.<br />
Definición 3<br />
El número <strong>de</strong> símbolos que constituyen una ca<strong>de</strong>na ω se llama longitud <strong>de</strong> ω.<br />
Se <strong>de</strong>notará por |ω|.<br />
Ejemplo 2<br />
ω = 10011 <strong>es</strong> una ca<strong>de</strong>na <strong>de</strong> longitud |ω| = 5 <strong>de</strong>l alfabeto binario A = { 0, 1}.<br />
Definición 4<br />
Se dice ca<strong>de</strong>na vacia a la ca<strong>de</strong>na que no contiene símbolos y por lo tanto tiene longitud<br />
cero.<br />
Se <strong>de</strong>notará por Λ.<br />
Definición 5<br />
El exponente <strong>de</strong> periodicidad <strong>de</strong> una ca<strong>de</strong>na ω <strong>es</strong> el máximo número p tal que<br />
don<strong>de</strong> u, v y z son ca<strong>de</strong>nas con v = Λ.<br />
ω = uv p z<br />
7
Definición 6<br />
Dado un alfabeto A.<br />
Se <strong>de</strong>fine el conjunto <strong>de</strong> todas las ca<strong>de</strong>nas que se pue<strong>de</strong>n formar con símbolos <strong>de</strong> A como<br />
A ∗ = {Λ} ∪ A ∪ A 2 ∪ . . . ∪ A n ∪ . . . = <br />
A k<br />
siendo A k el conjunto <strong>de</strong> ca<strong>de</strong>nas <strong>de</strong> longitud k.<br />
Definición 7<br />
Sea A un alfabeto.<br />
Dadas dos ca<strong>de</strong>nas ω1 y ω2 sobre A se <strong>de</strong>fine la concatenación <strong>de</strong> ω1 y ω2 como la ca<strong>de</strong>na<br />
que r<strong>es</strong>ulta <strong>de</strong> colocar primero ω1 y a continuación ω2.<br />
Se <strong>de</strong>notará ω1ω2.<br />
Propieda<strong>de</strong>s <strong>de</strong> la concatenación:<br />
Asociativa,<br />
( ω1 ω2 ) ω3 = ω1 ( ω2 ω3 ) ∀ ω1, ω2, ω3 ∈ A.<br />
Existencia <strong>de</strong> elemento neutro,<br />
Λ ω = ω Λ ∀ ω ∈ A.<br />
|ω1ω2| = |ω1| + |ω2|<br />
En general, no <strong>es</strong> conmutativa.<br />
Ejemplo 3<br />
Si ω1 = ab y ω2 = b entonc<strong>es</strong><br />
Nota 1<br />
ω1ω2 = abb = bab = ω2ω1<br />
El alfabeto A con la operación <strong>de</strong> concatenación tiene <strong>es</strong>tructura <strong>de</strong> semigrupo con i<strong>de</strong>n-<br />
tidad.<br />
Nota 2<br />
Será frecuente usar el término “bit” para referirnos a los símbolos <strong>de</strong> un alfabeto, en<br />
particular, cuando trabajemos con el alfabeto binario A = { 0, 1}.<br />
8<br />
k≥0
2.3. Características <strong>de</strong> los <strong>Algoritmos</strong> Genéticos<br />
Algunas <strong>de</strong> las principal<strong>es</strong> características <strong>de</strong> los algoritmos genéticos, que los diferencia<br />
<strong>de</strong> otros proc<strong>es</strong>os <strong>de</strong> optimización, son las siguient<strong>es</strong>:<br />
Uso directo <strong>de</strong> un código.<br />
Trabajan con una codificación <strong>de</strong>l conjunto <strong>de</strong> variabl<strong>es</strong> <strong>de</strong>l problema, no con las<br />
propias variabl<strong>es</strong>.<br />
En general, se codifican como ca<strong>de</strong>nas <strong>de</strong> algún alfabeto.<br />
Búsqueda <strong>de</strong> una población.<br />
Buscan un conjunto <strong>de</strong> puntos, no un único punto.<br />
Mientras que algunos métodos <strong>de</strong> optimización se mueven en el <strong>es</strong>pacio <strong>de</strong> <strong>de</strong>cisión<br />
<strong>de</strong>s<strong>de</strong> un único punto al siguiente usando reglas <strong>de</strong> transición, los algoritmos genéticos<br />
trabajan simultaneamente con un conjunto <strong>de</strong> puntos, reduciéndose al máximo la<br />
probabilidad <strong>de</strong> encontrar un falso óptimo.<br />
Ceguedad sobre información auxiliar.<br />
Usan la información <strong>de</strong> la función objetivo <strong>de</strong>l problema <strong>de</strong> optimización, no sus<br />
<strong>de</strong>rivadas u otros conocimientos auxiliar<strong>es</strong>.<br />
Aleatoriedad controlada.<br />
Utilizan reglas <strong>de</strong> transmisión probabilísticas, nunca reglas <strong>de</strong>terminísticas.<br />
Es importante no confundir los métodos <strong>de</strong> búsqueda <strong>es</strong>trictamente aleatorios con las<br />
técnicas aleatorias. El algoritmo genético <strong>es</strong> un ejemplo <strong>de</strong> un proc<strong>es</strong>o <strong>de</strong> búsqueda<br />
que utiliza selección aleatoria como una herramienta para guiar una búsqueda muy<br />
explosiva mediante una codificación sencilla <strong>de</strong> un <strong>es</strong>pacio paramétrico. No <strong>es</strong>tamos<br />
hablando <strong>de</strong> un simple proc<strong>es</strong>o aleatorio, <strong>es</strong> <strong>de</strong>cir, no se trata <strong>de</strong> tomar una <strong>de</strong>cisión a<br />
cara o cruz, sino que <strong>de</strong>finimos un método <strong>de</strong> búsqueda que aprovecha la información<br />
histórica para <strong>es</strong>pecular sobre nuevos puntos.<br />
Estas cuatro características contribuyen a dar fuerza a los algoritmos genéticos y re-<br />
sultan <strong>de</strong> gran utilidad, por encima incluso <strong>de</strong> otras técnicas usadas con más frecuencia.<br />
9
A<strong>de</strong>más, la habilidad <strong>de</strong>l algoritmo genético para explotar la información acumula-<br />
da sobre un <strong>es</strong>pacio <strong>de</strong> búsqueda permite su aplicación a <strong>es</strong>pacios <strong>de</strong> búsqueda gran<strong>de</strong>s,<br />
complejos y poco entendidos.<br />
Por lo tanto, los algoritmos genéticos tratan <strong>de</strong> alcanzar un equilibrio entre dos ob-<br />
jetivos aparentemente en conflicto: explotar las buenas cualida<strong>de</strong>s <strong>de</strong> las candidatas a<br />
solución y explorar el <strong>es</strong>pacio <strong>de</strong> búsqueda.<br />
La simplicidad <strong>de</strong> las operacion<strong>es</strong> y la gran eficacia <strong>de</strong>l proc<strong>es</strong>o son dos <strong>de</strong> los principal<strong>es</strong><br />
atractivos <strong>de</strong> los algoritmos genéticos. Veremos que la explicación <strong>de</strong> por qué <strong>es</strong>te proc<strong>es</strong>o<br />
funciona <strong>es</strong> mucho más sutil.<br />
2.4. El Algoritmo Genético Simple<br />
Ant<strong>es</strong> <strong>de</strong> examinar el funcionamiento interno <strong>de</strong> un algoritmo genético simple y <strong>es</strong>tudiar<br />
su potencia, tenemos que tener claros cuál<strong>es</strong> son nu<strong>es</strong>tros objetivos cuando <strong>de</strong>cimos que<br />
queremos optimizar una función o un proc<strong>es</strong>o. Es evi<strong>de</strong>nte que el objetivo más importante<br />
<strong>de</strong> la optimización <strong>es</strong> la mejora.<br />
Definición 8<br />
Se llama individuo a cualquier ca<strong>de</strong>na candidata a ser solución <strong>de</strong>l problema que se pre-<br />
ten<strong>de</strong> r<strong>es</strong>olver mediante un algoritmo genético.<br />
Un conjunto finito <strong>de</strong> individuos se dice población.<br />
Definición 9<br />
Se llama función fitn<strong>es</strong>s, <strong>de</strong> calidad, o <strong>de</strong> aptitud... a aquella función que <strong>de</strong>termina los<br />
individuos mejor adaptados o, <strong>de</strong> alguna manera, más cercanos a la solución <strong>de</strong>l problema.<br />
Para seleccionar una función fitn<strong>es</strong>s a<strong>de</strong>cuada hay que hacer un balance entre aquellas que<br />
reflejen diferencias muy gran<strong>de</strong>s (provocando una convergencia prematura <strong>de</strong> los indivi-<br />
duos <strong>de</strong> la población hacia un óptimo local) y las que proporcionen diferencias pequeñas<br />
(dando lugar a un <strong>es</strong>tacionamiento).<br />
En ocasion<strong>es</strong> se aña<strong>de</strong> un factor <strong>de</strong> penalización para controlar los individuos que no<br />
r<strong>es</strong>pon<strong>de</strong>n a las características <strong>de</strong> las solucion<strong>es</strong> <strong>de</strong>l problema.<br />
El algoritmo genético simple <strong>es</strong>tá constituido principalmente por tr<strong>es</strong> etapas bien dife-<br />
renciadas: selección, cruce y mutación. Sin embargo, en la práctica <strong>es</strong> nec<strong>es</strong>ario <strong>es</strong>pecificar<br />
para su diseño los siguient<strong>es</strong> aspectos:<br />
10
la codificación <strong>de</strong> las variabl<strong>es</strong> <strong>de</strong>l problema que constituirán los individuos<br />
el modo <strong>de</strong> generar la población inicial<br />
la función fitn<strong>es</strong>s que evaluará la población<br />
el criterio <strong>de</strong> selección<br />
el tipo <strong>de</strong> cruce<br />
y la forma en que se aplicará el proc<strong>es</strong>o <strong>de</strong> mutación.<br />
2.4.1. Codificación <strong>de</strong> los Individuos<br />
Los operador<strong>es</strong> genéticos (selección, cruce y mutación) <strong>de</strong>pen<strong>de</strong>n <strong>de</strong>l tipo <strong>de</strong> repre-<br />
sentación utilizado. Originalmente, las solucion<strong>es</strong> se repr<strong>es</strong>entaban por ca<strong>de</strong>nas binarias,<br />
<strong>es</strong> <strong>de</strong>cir, listas <strong>de</strong> ceros y unos. Este tipo <strong>de</strong> repr<strong>es</strong>entación permite <strong>de</strong>finir fácilmente el<br />
proc<strong>es</strong>o <strong>de</strong> cruce. Sin embargo, en algunos problemas r<strong>es</strong>ulta poco natural y eficiente. Por<br />
<strong>es</strong>te motivo, <strong>es</strong> importante <strong>es</strong>tudiar el problema que se preten<strong>de</strong> r<strong>es</strong>olver para <strong>de</strong>terminar<br />
la repr<strong>es</strong>entación más a<strong>de</strong>cuada <strong>de</strong> los individuos y, en consecuencia, <strong>de</strong> la solución que se<br />
busca.<br />
Ejemplo 4<br />
Consi<strong>de</strong>ramos el problema <strong>de</strong>l viajante dado por 5 ciuda<strong>de</strong>s y 20 aristas.<br />
Hay que calcular un camino cerrado que pase por todas las ciuda<strong>de</strong>s, sólo una vez por<br />
cada ciudad, y tal que la distancia recorrida sea mínima.<br />
Sean C1, C2, C3, C4 y C5 las ciuda<strong>de</strong>s que hay que recorrer.<br />
Suponemos que el viajante parte siempre <strong>de</strong> la ciudad C1.<br />
Tenemos que codificar cinco variabl<strong>es</strong>, una por cada una <strong>de</strong> las ciuda<strong>de</strong>s <strong>de</strong>l problema.<br />
Proponemos codificarlas como ca<strong>de</strong>nas <strong>de</strong> longitud 4 <strong>de</strong>l alfabeto A = { 0, 1} pu<strong>es</strong> a cada<br />
ciudad llegan y salen cuatro aristas. De <strong>es</strong>ta forma, repr<strong>es</strong>entamos para cada ciudad las<br />
aristas que salen <strong>de</strong> <strong>es</strong>ta y le asignamos el valor uno a aquella que forma parte <strong>de</strong>l camino<br />
elegido. Así, la ca<strong>de</strong>na<br />
0010 1000 0100 0010 1000 <br />
repr<strong>es</strong>enta una candidata a solución sobre las aristas or<strong>de</strong>nadas.<br />
C1<br />
C2<br />
C3<br />
11<br />
C4<br />
C5
C1<br />
0<br />
0<br />
C2<br />
0 ✶<br />
1<br />
C5<br />
C3<br />
C4<br />
C3<br />
0<br />
0<br />
C4<br />
1 ✶<br />
0<br />
C2<br />
Sin embargo, no r<strong>es</strong>ulta una repr<strong>es</strong>entación natural y, a<strong>de</strong>más, no todos los individuos que<br />
tienen cinco unos repr<strong>es</strong>entan una solución <strong>de</strong>l problema.<br />
La ca<strong>de</strong>na<br />
C5<br />
C1<br />
11101100000000000000<br />
ni siquiera repr<strong>es</strong>enta un camino en el grafo <strong>de</strong> bits corr<strong>es</strong>pondiente, pu<strong>es</strong> cada subca<strong>de</strong>na<br />
repr<strong>es</strong>entando a una ciudad <strong>de</strong>be contener un uno y tr<strong>es</strong> ceros. Así mismo, la ca<strong>de</strong>na<br />
01001000001000101000<br />
aunque si repr<strong>es</strong>enta un camino no permite recorrer todas las ciuda<strong>de</strong>s y no pue<strong>de</strong> ser<br />
aceptada como solución candidata <strong>de</strong>l problema.<br />
C1 ✮<br />
❪<br />
C2<br />
▼<br />
✇<br />
✶ C3<br />
C5<br />
C4<br />
Observamos que las posibl<strong>es</strong> solucion<strong>es</strong> son <strong>de</strong> la forma<br />
C1 ✐<br />
C2<br />
✼<br />
✌<br />
C5<br />
✇<br />
C3<br />
C4<br />
✕<br />
✴<br />
C1<br />
C2<br />
✌<br />
C5<br />
▼<br />
✶<br />
12<br />
C5<br />
1<br />
0<br />
0<br />
0<br />
. . .<br />
Con <strong>es</strong>ta repr<strong>es</strong>entación <strong>de</strong> las<br />
variabl<strong>es</strong> nos vemos obligados a<br />
controlar las ca<strong>de</strong>nas generadas<br />
para garantizar que se visitan<br />
todas las ciuda<strong>de</strong>s una sóla vez<br />
cada una. D<strong>es</strong>pués, comprobamos<br />
cuál <strong>es</strong> la que hace mínima la<br />
distancia recorrida.<br />
C3<br />
C4<br />
✕<br />
C1<br />
❪<br />
C2<br />
❦<br />
❄<br />
C5<br />
<br />
C3<br />
✻<br />
C4
Por lo tanto, r<strong>es</strong>ulta más natural repr<strong>es</strong>entar la ruta <strong>de</strong> las ciuda<strong>de</strong>s por una permutación,<br />
digamos<br />
(5, 4, 2, 3)<br />
sobre el alfabeto A ′ = {2, 3, 4, 5} que permite <strong>de</strong>finir diferent<strong>es</strong> poblacion<strong>es</strong> <strong>es</strong>tabl<strong>es</strong>, <strong>es</strong><br />
<strong>de</strong>cir, todos los individuos así generados repr<strong>es</strong>entan posibl<strong>es</strong> solucion<strong>es</strong>.<br />
La permutación (5, 4, 2, 3) se interprata <strong>de</strong> la siguiente forma: partiendo <strong>de</strong> la ciudad C1<br />
el viajante se <strong>de</strong>splaza hasta la ciudad C5, <strong>de</strong> ahí se mueve a C4, <strong>de</strong>spués sigue hacia C3<br />
pasando primero por la ciudad C2 y finalmente vuelve a C1.<br />
1<br />
✾<br />
2<br />
❪<br />
⑦<br />
5<br />
⑦<br />
3<br />
4<br />
✸<br />
Con <strong>es</strong>ta repr<strong>es</strong>entación sólo<br />
tenemos que preocuparnos <strong>de</strong><br />
encontrar la permutación que<br />
haga mínima la distancia nec<strong>es</strong>aria<br />
para recorrer todas las ciuda<strong>de</strong>s.<br />
A<strong>de</strong>más, el problema <strong>de</strong>l viajante en su enunciado general no exige que el camino comience<br />
en una ciudad concreta sino que se enuncia en los siguient<strong>es</strong> términos:<br />
“Construir, si existe, un camino <strong>de</strong> coste mínimo que<br />
pase por cada una <strong>de</strong> las cinco ciuda<strong>de</strong>s una sóla vez”<br />
Con <strong>es</strong>te enunciado y suponiendo, como hasta ahora, que todas las ciuda<strong>de</strong>s <strong>es</strong>tan comu-<br />
nicadas entre sí en ambos sentidos, la mejor repr<strong>es</strong>entación <strong>de</strong> los individuos <strong>es</strong>tá formada<br />
por permutacion<strong>es</strong> <strong>de</strong> cinco elementos, pu<strong>es</strong> la repr<strong>es</strong>entación binaria nec<strong>es</strong>itaría a<strong>de</strong>más<br />
indicar cuál <strong>es</strong> la ciudad inicial <strong>de</strong>l camino para cada individuo.<br />
Aunque existen múltipl<strong>es</strong> tipos <strong>de</strong> repr<strong>es</strong>entación, la mayoría <strong>de</strong> los r<strong>es</strong>ultados en la<br />
teoría <strong>de</strong> los algoritmos genéticos, como el teorema <strong>de</strong> los <strong>es</strong>quemas que <strong>es</strong>tudiaremos<br />
posteriormente, han sido <strong>de</strong>sarrollados sobre el alfabeto binario.<br />
Nota 3<br />
Una codificación correcta <strong>es</strong> una <strong>de</strong> las clav<strong>es</strong> más important<strong>es</strong> para tener exito en la<br />
r<strong>es</strong>olución <strong>de</strong> los problemas.<br />
13
2.4.2. Generación <strong>de</strong> la Población Inicial<br />
Una vez <strong>de</strong>finida la codificación <strong>de</strong> los individuos, el primer paso en un algoritmo<br />
genético <strong>es</strong> la creación <strong>de</strong> una población inicial <strong>de</strong> solucion<strong>es</strong> <strong>de</strong>l problema, <strong>de</strong>bidamente<br />
codificada.<br />
Normalmente, se fija el tamaño <strong>de</strong> la población y se generan <strong>de</strong> forma aleatoria los<br />
individuos para conseguir una población inicial amplia y repr<strong>es</strong>entativa <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong><br />
búsqueda.<br />
En los últimos tiempos, se han ido incorporando métodos heurísticos a <strong>es</strong>te proc<strong>es</strong>o con<br />
el fin <strong>de</strong> generar individuos en la población inicial con un buen fitn<strong>es</strong>s. En <strong>es</strong>te caso, hay<br />
que garantizar la diversidad <strong>es</strong>tructural <strong>de</strong> <strong>es</strong>tos individuos para tener una repr<strong>es</strong>entación<br />
<strong>de</strong> la mayor parte <strong>de</strong> la población posible o, al menos, evitar la convergencia puntual.<br />
También existen algoritmos don<strong>de</strong> el tamaño <strong>de</strong> la población <strong>es</strong> variable.<br />
2.4.3. Evaluación <strong>de</strong> los Individuos<br />
Cada vez que se genera una población <strong>de</strong> individuos <strong>es</strong> nec<strong>es</strong>ario evaluarlos para obtener<br />
una medida <strong>de</strong> calidad, <strong>es</strong> <strong>de</strong>cir, el fitn<strong>es</strong>s asociado a cada individuo. Este valor <strong>es</strong> utilizado<br />
en el proc<strong>es</strong>o <strong>de</strong> selección para la obtención <strong>de</strong> las suc<strong>es</strong>ivas generacion<strong>es</strong>.<br />
Como ya se mencionó, la elección <strong>de</strong>l fitn<strong>es</strong>s que guiará el proc<strong>es</strong>o <strong>de</strong> búsqueda será una<br />
<strong>de</strong> las clav<strong>es</strong> para garantizar el buen funcionamiento <strong>de</strong>l algoritmo genético.<br />
Ejemplo 5<br />
En el problema <strong>de</strong>l viajante anterior, en su versión general, generamos <strong>de</strong> forma aleatoria<br />
una población <strong>de</strong> tamaño tp = 3.<br />
Como se trata <strong>de</strong> un problema <strong>de</strong> minimización po<strong>de</strong>mos tomar como función fitn<strong>es</strong>s f la<br />
función que nos proporciona la distacia recorrida. De <strong>es</strong>te modo, un individuo será mejor<br />
que otro si la función fitn<strong>es</strong>s asociada tiene un valor más pequeño.<br />
Definimos dij la distancia entre las ciuda<strong>de</strong>s Ci y Cj para i, j = 1, 2, 3, 4, 5 con i = j.<br />
Suponemos que<br />
d12 = 12 Km d13 = 40 Km d14 = 31 Km d15 = 65 Km d23 = 26 Km<br />
d24 = 13 Km d25 = 78 Km d34 = 43 Km d35 = 37 Km d45 = 52 Km<br />
Se tiene la siguiente tabla<br />
14
Individuo fitn<strong>es</strong>s<br />
I1 = (1, 4, 2, 3, 5) 172<br />
I2 = (2, 3, 5, 4, 1) 158<br />
I3 = (3, 1, 4, 2, 5) 199<br />
Luego, la ruta que proporciona el individuo I2 <strong>es</strong> la mejor <strong>de</strong> las tr<strong>es</strong> rutas <strong>de</strong> la población.<br />
2.4.4. Selección<br />
La selección <strong>es</strong> un operador genético mediante el cual cada individuo <strong>es</strong> copiado <strong>de</strong><br />
acuerdo a los valor<strong>es</strong> que le asocia la función fitn<strong>es</strong>s. Se trata <strong>de</strong> una versión artificial <strong>de</strong><br />
la selección natural, don<strong>de</strong> el ser mejor adaptado tiene mayor probabilidad <strong>de</strong> sobrevivir.<br />
Pensemos en la función fitn<strong>es</strong>s como una medida <strong>de</strong> ganancia, utilidad o bondad que<br />
queremos maximizar. Los individuos que tienen asociado un valor más alto <strong>de</strong> la función<br />
fitn<strong>es</strong>s tienen una mayor probabilidad <strong>de</strong> contribuir en uno o más <strong>de</strong>scendient<strong>es</strong> en la<br />
siguiente generación.<br />
La implementación en forma algorítmica <strong>de</strong>l proc<strong>es</strong>o <strong>de</strong> selección se realiza mediante<br />
una ruleta, don<strong>de</strong> a cada individuo <strong>de</strong> la población le corr<strong>es</strong>pon<strong>de</strong> una sección circular<br />
directamente proporcional a la probabilidad que tiene <strong>de</strong> contribuir en la siguiente gene-<br />
ración. De <strong>es</strong>ta forma, cada vez que se tiene que seleccionar un individuo se realiza una<br />
tirada <strong>de</strong> bola en la ruleta tomando aquel asociado a la sección circular don<strong>de</strong> cayó la<br />
bola.<br />
La probabilidad <strong>de</strong> contribuir en la siguiente generación viene dada por<br />
para cada individuo i = 1, . . . , tp.<br />
Ejemplo 6<br />
P(i) = fitn<strong>es</strong>s(i)<br />
tp<br />
fitn<strong>es</strong>s(j)<br />
j=1<br />
Dada la función f : N −→ N<br />
x −→ x 2<br />
¿Cuál <strong>es</strong> el valor máximo que alcanza f en el intervalo entero [0, 31]?<br />
Codificamos la única variable <strong>de</strong>l problema, x, como una ca<strong>de</strong>na <strong>de</strong> longitud 5 en el alfa-<br />
beto A = { 0, 1}. De <strong>es</strong>ta forma, po<strong>de</strong>mos utilizar la numeración binaria para relacionar<br />
el valor <strong>de</strong> x con su corr<strong>es</strong>pondiente codificación.<br />
15
0 −→ 00000<br />
4 −→ 00100<br />
17 −→ 10001<br />
31 −→ 11111<br />
Como se trata <strong>de</strong> un problema <strong>de</strong> optimización (maximizar f) po<strong>de</strong>mos tomar como<br />
función fitn<strong>es</strong>s la propia función f.<br />
Suponemos un tamaño <strong>de</strong> población tp = 4.<br />
Consi<strong>de</strong>ramos la población inicial, generada <strong>de</strong> forma aleatoria,<br />
I1 = 01010 I2 = 01001<br />
I3 = 11100 I4 = 00010<br />
Al evaluar <strong>es</strong>tos indivios se tiene la siguiente tabla<br />
Individuo Pob. Inicial Valor <strong>de</strong> x f(x) = x 2 P (i) = fi/ fj<br />
I1 01010 10 100 0.19<br />
I2 01001 18 324 0.6<br />
I3 11100 7 49 0.09<br />
I4 00010 8 64 0.12<br />
Se <strong>de</strong>duce que el individuo I2 <strong>es</strong> el que más probabilidad tiene <strong>de</strong> contribuir en la gene-<br />
ración siguiente, por <strong>es</strong>o, la sección circular que le corr<strong>es</strong>pon<strong>de</strong> en la ruleta <strong>es</strong> la más gran<strong>de</strong>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
19 % <br />
12 % <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
9 %<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
60 %<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Nota:<br />
La selección <strong>es</strong> con reemplazamiento,<br />
<strong>es</strong> <strong>de</strong>cir, un mismo individuo pue<strong>de</strong><br />
ser copiado varias vec<strong>es</strong>. Por lo tanto,<br />
los individuos mejor adaptados tienen<br />
mayor probabilidad <strong>de</strong> sobrevivir.<br />
Existen otras técnicas para la selección <strong>de</strong> los individuos, como las <strong>de</strong>nominadas:<br />
Torneo: Se seleccionan dos individuos aleatoriamente y se elige el más apto con una<br />
probabilidad p fijada. (el menos apto se elige con probabilidad (1 − p))<br />
16
Ranqueo: Se or<strong>de</strong>na la población según el fitn<strong>es</strong>s <strong>de</strong> cada individuo y se le asigna la<br />
probabilidad <strong>de</strong> selección <strong>de</strong> acuerdo a la posición que ocupa.<br />
2.4.5. Cruce<br />
Un sencillo proc<strong>es</strong>o <strong>de</strong> cruce, <strong>de</strong>nominado cruce en un punto, se realiza en dos etapas.<br />
En la primera, los individuos <strong>de</strong> la población elegidos <strong>de</strong> acuerdo al criterio <strong>de</strong> selección<br />
<strong>es</strong>tablecido son emparejados al azar.<br />
Recuér<strong>de</strong>se que una pareja pue<strong>de</strong> <strong>es</strong>tar formada por el mismo individuo repetido.<br />
En la segunda etapa, cada par <strong>de</strong> individuos experimenta un cruce como sigue:<br />
1. Se selecciona al azar una posición entera entre uno y la longitud <strong>de</strong> la ca<strong>de</strong>na, l,<br />
menos uno.<br />
Sea k ∈ {1, . . . , l − 1} la posición seleccionada al azar.<br />
2. Se obtienen dos nuevas ca<strong>de</strong>nas al intercambiar las subca<strong>de</strong>nas situadas entre las<br />
posicion<strong>es</strong> k + 1 y l, ambas inclusive.<br />
Ejemplo 7<br />
Consi<strong>de</strong>ramos las ca<strong>de</strong>nas w1 y w2 <strong>de</strong> la población inicial en el ejemplo anterior,<br />
w1 = 01010<br />
w2 = 01001<br />
Como la longitud <strong>de</strong> <strong>es</strong>tas ca<strong>de</strong>nas <strong>es</strong> l = 5, tenemos que elegir la posición k como valor<br />
entero entre 1 y 4.<br />
Suponemos k = 4 (como indica el símbolo separador | )<br />
w1 = 0101|0<br />
w2 = 0100|1<br />
El cruce r<strong>es</strong>ultante produce dos nuevas ca<strong>de</strong>nas,<br />
w ′ 1<br />
w ′ 2<br />
= 01011<br />
= 01000<br />
Así se genera una nueva población <strong>de</strong> individuos que hereda parte <strong>de</strong> la información <strong>de</strong> la<br />
población anterior.<br />
17
Nota 4<br />
Se pue<strong>de</strong>n seleccionar tantos individuos <strong>de</strong> la población actual como sean nec<strong>es</strong>arios para<br />
generar una nueva población que reemplace completamente a la actual.<br />
Sin embargo, en muchas ocasion<strong>es</strong> se copian los N mejor<strong>es</strong> individuos <strong>de</strong> la población actual<br />
a la siguiente <strong>de</strong> modo que sólo se seleccionan los individuos nec<strong>es</strong>arios para completar la<br />
nueva población. Este tipo <strong>de</strong> selección se <strong>de</strong>nomina elitista.<br />
Normalmente, se suele copiar el mejor o los dos mejor<strong>es</strong> individuos <strong>de</strong> cada población a la<br />
siguiente. De <strong>es</strong>ta forma se mantiene siempre en la población al mejor individuo alcanzado<br />
hasta el momento.<br />
Existen muchos otros proc<strong>es</strong>os <strong>de</strong> cruce que se van adaptando a las nec<strong>es</strong>ida<strong>de</strong>s con-<br />
cretas <strong>de</strong> cada problema. A continuación <strong>de</strong>finimos algunos <strong>de</strong> los más conocidos.<br />
Definición 10 (Cruce en n puntos)<br />
Se dice cruce en n puntos cuando dadas dos ca<strong>de</strong>nas <strong>de</strong> longitud l se eligen n posicion<strong>es</strong><br />
enteras<br />
{ki} i=1,...,n tal que ki ∈ {1, . . . , l − 1}<br />
y se intercambian las subca<strong>de</strong>nas situadas entre <strong>es</strong>tas posicion<strong>es</strong>.<br />
Se trata <strong>de</strong> la generalización <strong>de</strong>l cruce en un punto.<br />
Ejemplo 8<br />
Cosi<strong>de</strong>ramos dos individuos <strong>de</strong> longuitud l = 15 dados por<br />
010101000001000<br />
100100101011101<br />
Vamos a aplicar un cruce <strong>de</strong> 4 puntos. Para ello seleccionamos al azar cuatro posicion<strong>es</strong><br />
enteras entre 1 y 14.<br />
Supongamos que k1 = 3, k2 = 7, k3 = 9 y k4 = 13, entonc<strong>es</strong><br />
010|1010|00|0010|00<br />
100|1001|01|0111|01<br />
Hemos obtenido dos nuevos individuos,<br />
✿<br />
③<br />
100101001001001<br />
010100100011100<br />
18<br />
100|1010|01|0010|01<br />
010|1001|00|0111|00
Definición 11 (Cruce uniforme)<br />
Se dice cruce uniforme cuando se cruzan dos ca<strong>de</strong>nas dadas <strong>de</strong> longitud l mediante un<br />
proc<strong>es</strong>o que compara los símbolos que ocupan las mismas posicion<strong>es</strong> en ambas ca<strong>de</strong>nas, <strong>es</strong><br />
<strong>de</strong>cir, para cada posición i = 0, . . . , l se compara el símbolo que ocupa la i ésima posición<br />
<strong>de</strong> la primera ca<strong>de</strong>na con el que ocupa la i ésima posición <strong>de</strong> la segunda ca<strong>de</strong>na.<br />
El más utilizado cruce uniforme, genera una nueva ca<strong>de</strong>na cruzando dos ca<strong>de</strong>nas como<br />
sigue:<br />
para cada i = 0, . . . , l,<br />
si los simbolos que ocupan la i ésima posición coinci<strong>de</strong>n, entonc<strong>es</strong> se copia dicho símbolo<br />
a la posición i ésima <strong>de</strong> la nueva ca<strong>de</strong>na, en otro caso, se elige uno <strong>de</strong> los dos símbolos<br />
comparados (con probabilidad p se elige el <strong>de</strong> la primera ca<strong>de</strong>na y con probabilidad (1-p)<br />
el <strong>de</strong> la segunda) y se copia a la i ésima posición <strong>de</strong> la nueva ca<strong>de</strong>na.<br />
Ejemplo 9<br />
Dadas dos ca<strong>de</strong>nas sobre el alfabeto A = { 0, 1}<br />
ω1 = 01010111<br />
ω2 = 00101111<br />
Obtenemos una nueva ca<strong>de</strong>na aplicando un cruce uniforme que elige el símbolo <strong>de</strong> ω1<br />
con probabilida 0,3 y el símbolo <strong>de</strong> ω2 con probabilidad 0,7 cuando los símbolos que se<br />
comparan no coinci<strong>de</strong>n.<br />
Comparamos los símbolos que ocupan la primera posición, como coinci<strong>de</strong>n se copia <strong>es</strong>e<br />
símbolo a la nueva ca<strong>de</strong>na.<br />
ω1 = 01010111<br />
ω2 = 00101111<br />
✲ 0 · · ·<br />
Al comparar los símbolos que ocupan la segunda posición, y teniendo en cuenta la proba-<br />
bilidad <strong>de</strong> cruce, ha r<strong>es</strong>ultado que el símbolo <strong>de</strong> ω1 se copia a la nueva ca<strong>de</strong>na.<br />
ω1 = 01010111<br />
ω2 = 00101111<br />
✲ 0 1 · · ·<br />
Repitiendo el proc<strong>es</strong>o hasta la última posición <strong>de</strong> ambas ca<strong>de</strong>nas podría obtenerse<br />
ω1 = 01010111<br />
ω2 = 00101111<br />
19<br />
✲ 0 1 1 0 1 1 1 1
Existen otros criterios para <strong>de</strong>finir el operador <strong>de</strong> cruce uniforme, como por ejemplo:<br />
Cuando dos símbolos no coincidan se intercambian entre sí con una <strong>de</strong>terminada<br />
probabilidad, dando lugar a dos nuevas ca<strong>de</strong>nas.<br />
Fijada una <strong>de</strong> las dos ca<strong>de</strong>nas, se recorre símbolo a símbolo. Cada vez que se en-<br />
cuentre un uno se compara con el símbolo que ocupa la misma posición en la otra<br />
ca<strong>de</strong>na. Si no coinci<strong>de</strong>n, entonc<strong>es</strong> se intercambian <strong>es</strong>tos dos símbolos entre sí, dando<br />
lugar a dos nuevas ca<strong>de</strong>nas. A<strong>de</strong>más, se pue<strong>de</strong> imponer una probabilidad <strong>de</strong> cambio.<br />
Ejemplo 10<br />
Dadas dos ca<strong>de</strong>nas sobre el alfabeto A = { 0, 1}<br />
ω1 = 11001001<br />
ω2 = 10011101<br />
Para aplicar el cruce uniforme consi<strong>de</strong>ramos el criterio que intercambia dos símbolos dis-<br />
tintos con probabilidad p = 0,5.<br />
Empezamos a recorrer los símbolos <strong>de</strong> ambas ca<strong>de</strong>nas y encontramos los dos primeros que<br />
no coinci<strong>de</strong>n<br />
1 1 0 0 1 0 0 1<br />
1 0 0 1 1 1 0 1<br />
Al aplicar la probabilidad <strong>de</strong> intercambio r<strong>es</strong>ulta que no se cambian.<br />
Seguimos recorriendo las dos ca<strong>de</strong>nas. Llegamos al siguiente punto don<strong>de</strong> los símbolos <strong>de</strong><br />
ambas ca<strong>de</strong>nas no coinci<strong>de</strong>n<br />
1 1 0 0 1 0 0 1<br />
1 0 0 1 1 1 0 1<br />
Ahora sí se intercambian. Se obtienen dos nuevas ca<strong>de</strong>nas<br />
1 1 0 0 1 0 0 1<br />
1 0 0 1 1 1 0 1<br />
✿<br />
③<br />
1 1 0 1 1 0 0 1<br />
1 0 0 0 1 1 0 1<br />
Este proc<strong>es</strong>o se repite hasta que hayamos recorrido todos los símbolos.<br />
Los nuevos individuos que r<strong>es</strong>ultan <strong>de</strong> aplicar el cruce uniforme vienen dados por<br />
1 1 0 1 1 1 0 1<br />
1 0 0 0 1 0 0 1<br />
20
Los proc<strong>es</strong>os <strong>de</strong> selección y cruce son sorpren<strong>de</strong>ntemente sencillos, involucrando gene-<br />
ración aleatoria <strong>de</strong> números, copias <strong>de</strong> ca<strong>de</strong>nas y algún intercambio parcial <strong>de</strong> ca<strong>de</strong>nas.<br />
No obstante, el énfasis combinado <strong>de</strong> selección, aleatoriedad controlada e intercambio<br />
<strong>de</strong> información <strong>de</strong>l cruce dan a los algoritmos genéticos gran parte <strong>de</strong> su potencia. Pue<strong>de</strong><br />
parecer sorpren<strong>de</strong>nte que dos operacion<strong>es</strong> tan simpl<strong>es</strong> r<strong>es</strong>ulten útil<strong>es</strong> en algún caso. Incluso,<br />
parece raro que el azar juege un papel tan fundamental en un proc<strong>es</strong>o <strong>de</strong> búsqueda directo.<br />
2.4.6. Mutación<br />
El operador <strong>de</strong> mutación juega un papel secundario en el algoritmo genético simple.<br />
Según algunos <strong>es</strong>tudios, la frecuencia <strong>de</strong> mutación que permite obtener buenos r<strong>es</strong>ultados<br />
en la mayor parte <strong>de</strong> los problemas <strong>es</strong> <strong>de</strong>l or<strong>de</strong>n <strong>de</strong> una mutación por mil bits. Se sabe<br />
que en la naturaleza la probabilidad <strong>de</strong> mutación <strong>es</strong> aún más pequeña. Por <strong>es</strong>o po<strong>de</strong>mos<br />
concluir que la mutación <strong>es</strong> consi<strong>de</strong>rada, apropiadamente, un mecanismo secundario. Sin<br />
embargo, <strong>es</strong>te proc<strong>es</strong>o nos permite dar un salto en otra dirección en el <strong>es</strong>pacio <strong>de</strong> busqueda,<br />
evitando la convergencia prematura a óptimos local<strong>es</strong>. Se trata <strong>de</strong> un mecanismo generador<br />
<strong>de</strong> diversidad.<br />
Uno <strong>de</strong> los proc<strong>es</strong>os <strong>de</strong> mutación más sencillos y utilizados consiste en reemplazar el<br />
valor <strong>de</strong> un bit <strong>de</strong> la población con cierta probabilidad. Otra forma <strong>de</strong> introducir nuevos<br />
individuos en una población <strong>es</strong> la recombinación <strong>de</strong> éstos tomados al azar, sin tener en<br />
cuenta el fitn<strong>es</strong>s.<br />
21
2.5. Seudocódigo <strong>de</strong> un Algoritmo Genético Simple<br />
Una vez <strong>es</strong>tudiados los elementos nec<strong>es</strong>arios para construir un algoritmo genético sim-<br />
ple, vamos a <strong>de</strong>scribir el funcionamiento <strong>de</strong>l mismo.<br />
Fijados el tamaño <strong>de</strong> la población tp y la función fitn<strong>es</strong>s f que guiará el proc<strong>es</strong>o, se<br />
genera una población inicial P0 don<strong>de</strong> cada individuo se obtiene <strong>de</strong> forma aleatoria. En la<br />
siguiente etapa, se evalúan los individuos <strong>de</strong> la población P0 para conocer el fitn<strong>es</strong>s asociado<br />
a cada uno. Finalmente, se realiza un bucle <strong>de</strong> iteracion<strong>es</strong> que consiste en la generación <strong>de</strong><br />
nuevas poblacion<strong>es</strong> a partir <strong>de</strong> las anterior<strong>es</strong> mediante los operador<strong>es</strong> genéticos. De <strong>es</strong>ta<br />
forma, en la iteración k ésima se genera la población Pk a partir <strong>de</strong> los individuos <strong>de</strong> la<br />
población Pk−1 usando selección, cruce y mutación.<br />
Cuando finaliza la ejecución <strong>de</strong>l algoritmo, se obtiene una población formada por<br />
buenos individuos, siendo el mejor <strong>de</strong> ellos la solución que se propone.<br />
Seudocódigo <strong>de</strong> un AGS<br />
P0 ← generar población inicial<br />
E0 ← evaluar (P0)<br />
para k = 1 hasta NIter hacer<br />
fin para<br />
para j = 1 hasta tp hacer<br />
fin para<br />
Ij(1) ← seleccionar <strong>de</strong> Pk−1<br />
Ij(2) ← seleccionar <strong>de</strong> Pk−1<br />
Ij ← cruzar (Ij(1), Ij(2))<br />
Ij ← mutar (Ij)<br />
Ej ← evaluar (Ij)<br />
Pk ← guardar (Ij)<br />
Podíamos <strong>es</strong>tar inter<strong>es</strong>ados en conservar los N mejor<strong>es</strong> individuos <strong>de</strong> cada población<br />
en la siguiente, <strong>es</strong> <strong>de</strong>cir, aplicar una selección elitista.<br />
En el siguiente seudocódigo, guardamos el mejor individuo generado hasta el momento<br />
en la nueva población.<br />
22
Seudocódigo <strong>de</strong> un AGS elitista<br />
P0 ← generar población inicial<br />
E0 ← evaluar (P0)<br />
para k = 1 hasta NIter hacer<br />
fin para<br />
I ← mejor individuo <strong>de</strong> Pk−1<br />
Pk ← guardar (I)<br />
para j = 1 hasta tp − 1 hacer<br />
fin para<br />
Ij(1) ← seleccionar <strong>de</strong> Pk−1<br />
Ij(2) ← seleccionar <strong>de</strong> Pk−1<br />
Ij ← cruzar (Ij(1), Ij(2))<br />
Ij ← mutar (Ij)<br />
Ej ← evaluar (Ij)<br />
Pk ← guardar (Ij)<br />
Para finalizar <strong>es</strong>ta sección, <strong>es</strong>tudiaremos el funcionamiento <strong>de</strong> un algoritmo genético<br />
simple elitista aplicado a un problema concreto.<br />
Ejemplo 11<br />
Se preten<strong>de</strong> maximizar el valor <strong>de</strong> la función<br />
Codificación <strong>de</strong> los individuos<br />
f : [ −2, 2 ] −→ R<br />
x −→<br />
x<br />
exp( ) cos(5x)<br />
2<br />
(x+3) 2<br />
Tenemos que codificar una única variable x que toma valor<strong>es</strong> real<strong>es</strong> entre −2 y 2.<br />
Para po<strong>de</strong>r codificarlo como ca<strong>de</strong>na <strong>de</strong>l alfabeto binario A = { 0, 1} <strong>de</strong>finimos la<br />
siguiente traslación:<br />
˜f : [ 0, 4 ] −→ [ −2, 2 ] −→ R<br />
˜x −→ ˜x − 2 −→<br />
˜x−2<br />
exp( ) cos(5(˜x−2))<br />
2<br />
((˜x−2)+3) 2<br />
+ 1<br />
+ 1 =<br />
Suponemos que la solución viene dada con tr<strong>es</strong> cifras <strong>de</strong>cimal<strong>es</strong>. Luego,<br />
0, 000 ≤ ˜x ≤ 4, 000<br />
23<br />
˜x<br />
exp( −1) cos(5˜x−10)<br />
2<br />
(˜x+1) 2 + 1
Sabemos que<br />
2048 = 2 11 < 4000 < 2 12 = 4096<br />
Por lo tanto, po<strong>de</strong>mos codificar la variable ˜x como una ca<strong>de</strong>na ω <strong>de</strong> longitud |ω| = 12<br />
en el alfabeto A = { 0, 1}.<br />
Nót<strong>es</strong>e que<br />
111111111111 = 4, 095 > 4, 000<br />
Así que cuando generemos los individuos <strong>de</strong> la población tendremos que controlar<br />
que el valor asociado a <strong>es</strong>a ca<strong>de</strong>na <strong>es</strong> menor o igual que cuatro.<br />
Población inicial<br />
Fitn<strong>es</strong>s<br />
Trabajaremos con poblacion<strong>es</strong> <strong>de</strong> tamaño tp = 4.<br />
La población inicial será generada <strong>de</strong> forma totalmente aleatoria.<br />
Como se trata <strong>de</strong> un problema <strong>de</strong> maximizar f po<strong>de</strong>mos tomar como fitn<strong>es</strong>s la propia<br />
función f.<br />
Criterio <strong>de</strong> selección<br />
Cruce<br />
Mutación<br />
Aplicamos en cada iteración selección elitista proporcional al fitn<strong>es</strong>s y que mantega<br />
en la población a los dos mejor<strong>es</strong> individuos alcanzados hasta <strong>es</strong>e momento.<br />
Cada par <strong>de</strong> individuos seleccionados será cruzado en un punto.<br />
Sólo el mejor individuo obtenido <strong>de</strong> los dos que r<strong>es</strong>ultan <strong>de</strong>l proc<strong>es</strong>o <strong>de</strong> cruce se<br />
guardará en la nueva población .<br />
La probabilidad <strong>de</strong> que un individuo sea mutado será <strong>de</strong> 0,7 y la probabilidad <strong>de</strong><br />
que un bit cambie su valor será <strong>de</strong> 1/12 = 0,083.<br />
Empezamos a r<strong>es</strong>olver el problema ejecutando el algoritmo genético simple así diseñado.<br />
Obtenemos la pobalción inicial P0 dada por los individuos:<br />
24
I1 = 011001010010<br />
I2 = 110000100101<br />
I3 = 101110100100<br />
I4 = 010000100001<br />
Se tiene la siguiente tabla asociada a la población inicial P0<br />
Individuo P0 ˜x ˜ f(˜x) P (Ii) = ˜ fi/ ˜ fj<br />
I 0 1 011001010010 1.190 0.914 0.23<br />
I 0 2 110000100101 2.627 0.896 0.22<br />
I 0 3 101110100100 0.605 1.149 0.28<br />
I 0 4 010000100001 2.114 1.092 0.27<br />
Los dos mejor<strong>es</strong> individuos <strong>de</strong> P0, I0 3 y I0 4 , pasan directamente a la siguiente población,<br />
P1.<br />
Individuo P1 ˜x ˜ f(˜x)<br />
I 1 1 101110100100 0.605 1.149<br />
I 1 2 010000100001 2.114 1.092<br />
· · · · · · · · · · · ·<br />
Tenemos que generar otros dos individuos mediante los operador<strong>es</strong> genéticos para comple-<br />
tar la población P1.<br />
Generación <strong>de</strong> I 1 3 :<br />
I 0 3<br />
I 0 1<br />
= 10|1110100100<br />
= 01|1001010010<br />
Luego, <strong>de</strong> los proc<strong>es</strong>os <strong>de</strong> selección y cruce se tiene que I 1 3<br />
✿<br />
③<br />
01|1110100100 con ˜ f(0,606) = 1,149<br />
10|1001010010 con ˜ f(1,189) = 0,915<br />
= 011110100100. A<strong>de</strong>más, <strong>es</strong>te<br />
individuo <strong>es</strong> sometido al proc<strong>es</strong>o <strong>de</strong> mutación. Sin embargo, ninguno <strong>de</strong> sus bits muta.<br />
Generación <strong>de</strong> I 1 4 :<br />
I 0 3<br />
I 0 2<br />
= 1011101|00100<br />
= 1100001|00101<br />
25<br />
✿<br />
③<br />
1100001|00100 con ˜ f(0,579) = 1,134<br />
1011101|00101 con ˜ f(2,653) = 0,897
Luego, <strong>de</strong> los proc<strong>es</strong>os <strong>de</strong> selección y cruce se tiene que I1 4 = 110000100100. Este individuo<br />
también <strong>es</strong> seleccionado para la mutación. En <strong>es</strong>ta ocasión mutan los símbolos situados en<br />
la sexta y duodécima posición. Se obtiene<br />
La nueva población P1 queda como sigue<br />
I 1 4 = 110001100101<br />
Individuo P1 ˜x ˜ f(˜x) P (Ii) = ˜ fi/ ˜ fj<br />
Ahora, generamos la población P2.<br />
I 1 1 101110100100 0.605 1.149 0.27<br />
I 1 2 010000100001 2.114 1.092 0.25<br />
I 1 3 011110100100 0.606 1.149 0.27<br />
I 1 4 110001100101 2.659 0.897 0.21<br />
En primer lugar, copiamos los dos mejor<strong>es</strong> individuos <strong>de</strong> P1, I 1 1 y I1 3 .<br />
D<strong>es</strong>pués, para completar la población P2, generamos dos individuos aplicando los opera-<br />
dor<strong>es</strong> genéticos a P1.<br />
I 1 3<br />
I 1 2<br />
I 1 1<br />
I 1 1<br />
= 0111|10100100<br />
= 0100|00100001<br />
= 10111010|0100<br />
= 10111010|0100<br />
De los proc<strong>es</strong>os <strong>de</strong> selección y cruce se tiene que<br />
I 2 3<br />
I 2 4<br />
✿<br />
③<br />
✿<br />
③<br />
= 010010100100<br />
= 101110100100<br />
Nót<strong>es</strong>e que para obtener I 2 4 hemos cruzado el mismo individuo, I1 1 .<br />
A<strong>de</strong>más, al individuo I 2 3<br />
0100|10100100 con ˜ f(0,594) = 1,143<br />
0111|00100001 con ˜ f(0,126) = 1,088<br />
101110100100 con ˜ f(0,605) = 1,149<br />
101110100100 con ˜ f(0,605) = 1,149<br />
se le aplica el operador <strong>de</strong> mutación. En <strong>es</strong>te caso, los bits situados<br />
en la quinta, sexta y última posición mutan. Se obtiene<br />
Sin embargo, el individuo I 2 4<br />
I 2 3 = 010001100101<br />
no <strong>es</strong> sometido al proc<strong>es</strong>o <strong>de</strong> mutación.<br />
Por lo tanto, la nueva población P2 ya <strong>es</strong>tá completamente generada.<br />
26
Individuo P2 ˜x ˜ f(˜x) P (Ii) = ˜ fi/ ˜ fj<br />
I 2 1 101110100100 0.605 1.149 0.26<br />
I 2 2 011110100100 0.606 1.149 0.26<br />
I 2 3 010001100101 2.658 0.897 0.22<br />
I 2 4 101110100100 0.605 1.149 0.26<br />
Para generar la siguiente población, tenemos que elegir los dos mejor<strong>es</strong> individuos <strong>de</strong> P2.<br />
Como el mejor fitn<strong>es</strong>s se tiene para los individuos I2 1 , I2 2 y I2 4 , elegimos al azar dos. Estos<br />
serán los que pasen directamente a la siguiente población, P3.<br />
Para completar la población aplicamos los operador<strong>es</strong> genéticos a la población P2.<br />
Se obtiene la siguiente tabla para la población P3.<br />
Individuo P3 ˜x ˜ f(˜x) P (Ii) = ˜ fi/ ˜ fj<br />
I 3 1 011110100100 0.606 1.149 0.25<br />
I 3 2 101110100100 0.605 1.149 0.25<br />
I 3 3 011110100100 0.606 1.149 0.25<br />
I 3 4 010010100100 0.594 1.143 0.25<br />
Repetimos los pasos para generar la población P4.<br />
Individuo P4 ˜x ˜ f(˜x) P (Ii) = ˜ fi/ ˜ fj<br />
I 4 1 101110100100 0.605 1.149 0.25<br />
I 4 2 011110100100 0.606 1.149 0.25<br />
I 4 3 111110100100 0.607 1.150 0.25<br />
I 4 4 011111100100 0.638 1.163 0.25<br />
Finalizamos <strong>es</strong>te <strong>de</strong>sarrollo generando la población P5.<br />
Individuo P5 ˜x ˜ f(˜x) P (Ii) = ˜ fi/ ˜ fj<br />
I 5 1 011111100100 0.638 1.163 0.25<br />
I 5 2 111110100100 0.607 1.150 0.25<br />
I 5 3 111110100100 0.607 1.150 0.25<br />
I 5 4 011011100100 0.630 1.160 0.25<br />
27
Tras <strong>es</strong>tas generacion<strong>es</strong>, la solución que se propone <strong>es</strong><br />
ω = 011111100100 −→ ˜x = 0,638 ∈ [0, 4] −→ x = ˜x − 2 = −1,362 ∈ [−2, 2]<br />
tal que f(x) = ˜ f(˜x) = 1,163 <strong>es</strong> el valor máximo alcanzado.<br />
Con ayuda <strong>de</strong> MATLAB hemos repr<strong>es</strong>entado la función f en el intervalo <strong>de</strong> <strong>de</strong>finición<br />
[−2, 2] y hemos calculado el valor máximo <strong>de</strong> f en dicho intervalo. De modo que se tiene<br />
la siguiente gráfica<br />
tal que<br />
Figura 2.1:<br />
max{f(x) : x ∈ [−2, 2 ]} = 1,177<br />
Con <strong>es</strong>te ejemplo hemos intentado terminar <strong>de</strong> compren<strong>de</strong>r el funcionamiento <strong>de</strong>l algo-<br />
ritmo genético y al mismo tiempo ver el buen comportamiento <strong>de</strong>l método. En <strong>es</strong>te caso<br />
particular, en pocas iteracion<strong>es</strong> nos hemos aproximado al óptimo <strong>de</strong> la función mediante<br />
unas operacion<strong>es</strong> muy sencillas. Sin embargo, la convergencia al óptimo en <strong>es</strong>te problema<br />
se podría mejorar, pu<strong>es</strong> hemos aplicado un proc<strong>es</strong>o <strong>de</strong> selección elitista que mantenía los<br />
dos mejor<strong>es</strong> individuos encontrados hasta <strong>es</strong>e momento para una población <strong>de</strong> tamaño<br />
tp = 4, r<strong>es</strong>ulta más inter<strong>es</strong>ante mantener en las nuevas poblacion<strong>es</strong> sólo al mejor individuo<br />
encontrado hasta <strong>es</strong>e momento con el fin <strong>de</strong> aumentar la diversidad <strong>de</strong> las poblacion<strong>es</strong><br />
generadas.<br />
Nota 5<br />
En la práctica, el tamaño <strong>de</strong> población, el número <strong>de</strong> iteracion<strong>es</strong>, la probabilidad <strong>de</strong> mu-<br />
tación... son <strong>de</strong>terminados <strong>de</strong> forma experimental para cada problema concreto.<br />
28
2.6. El Teorema <strong>de</strong> los Esquemas<br />
Uno <strong>de</strong> los r<strong>es</strong>ultados más important<strong>es</strong> <strong>de</strong> la teoría <strong>de</strong> los algoritmos genéticos <strong>es</strong> el<br />
teorema <strong>de</strong> los <strong>es</strong>quemas. Este r<strong>es</strong>ultado justifica la convergencia <strong>de</strong>l método usado por<br />
los algoritmos genéticos sobre un alfabeto binario.<br />
Ant<strong>es</strong> <strong>de</strong> enunciar el teorema tenemos que introducir un nuevo concepto <strong>de</strong>nominado<br />
<strong>es</strong>quema.<br />
Definición 12<br />
Se llama <strong>es</strong>quema a una ca<strong>de</strong>na que repr<strong>es</strong>enta un conjunto <strong>de</strong> ca<strong>de</strong>nas con similar<strong>es</strong> ca-<br />
racterísticas, <strong>es</strong> <strong>de</strong>cir, ca<strong>de</strong>nas que tienen los mismos símbolos en <strong>de</strong>terminadas posicion<strong>es</strong>.<br />
El símbolo ∗ se utiliza para indicar las posicion<strong>es</strong> don<strong>de</strong> no <strong>es</strong> obligada la coinci<strong>de</strong>ncia, <strong>es</strong><br />
<strong>de</strong>cir, indica las posicion<strong>es</strong> don<strong>de</strong> pue<strong>de</strong> ir cualquier elemento <strong>de</strong>l alfabeto.<br />
Ejemplo 12<br />
Consi<strong>de</strong>ramos las ca<strong>de</strong>nas<br />
01001001<br />
01000010<br />
01101001<br />
01100011<br />
Es evi<strong>de</strong>nte que las posicion<strong>es</strong> 1, 2, 4 y 6 <strong>de</strong> todas <strong>es</strong>tas ca<strong>de</strong>nas coinci<strong>de</strong>n. Por lo tanto,<br />
la ca<strong>de</strong>na<br />
<strong>es</strong> el <strong>es</strong>quema que las repr<strong>es</strong>enta.<br />
Nota 6<br />
01 ∗ 0 ∗ 0 ∗ ∗<br />
Un mismo conjunto <strong>de</strong> ca<strong>de</strong>nas pue<strong>de</strong> pertenecer a distintos <strong>es</strong>quemas.<br />
Definición 13<br />
Sea H un <strong>es</strong>quema.<br />
Se llama or<strong>de</strong>n <strong>de</strong> H al número <strong>de</strong> símbolos en H que son distintos <strong>de</strong> *.<br />
Se <strong>de</strong>notará por o(H).<br />
Se llama longitud <strong>de</strong> H al número <strong>de</strong> símbolos <strong>de</strong>l alfabeto { 0, 1, ∗ } más uno que hay<br />
entre la primera y la última <strong>de</strong> las posicion<strong>es</strong> distintas <strong>de</strong> *.<br />
Se <strong>de</strong>notará por δ(H).<br />
29
Nota 7<br />
Si el <strong>es</strong>quema H posee una única posición distinta <strong>de</strong> * entonc<strong>es</strong> δ(H) = 0.<br />
Ejemplo 13<br />
Sea el alfabeto binario A = { 0, 1}.<br />
Se tiene la siguiente tabla<br />
Esquema Or<strong>de</strong>n Longitud<br />
H1 = 0 1 ∗ ∗ 1 ∗ 0 o(H1) = 4 δ(H1) = 6<br />
H2 = ∗ 1 ∗ 1 ∗ 1∗ o(H2) = 3 δ(H2) = 4<br />
H3 = 0 ∗ ∗ 0 1 0 1 o(H3) = 5 δ(H3) = 6<br />
H4 = ∗ ∗ 0 ∗ 1 ∗ ∗ o(H4) = 2 δ(H4) = 2<br />
Teorema 1 (Teorema <strong>de</strong> los Esquemas)<br />
Sea H un <strong>es</strong>quema.<br />
H5 = ∗0 ∗ ∗ ∗ ∗∗ o(H5) = 1 δ(H5) = 0<br />
H6 = ∗ ∗ ∗11 ∗ ∗ o(H6) = 2 δ(H6) = 1<br />
El número <strong>de</strong> individuos pertenecient<strong>es</strong> a H en la población k +1 que r<strong>es</strong>ulta <strong>de</strong> aplicar los<br />
operador<strong>es</strong> genéticos (selección, cruce y mutación) sobre la población k pue<strong>de</strong> aproximarse<br />
por la <strong>de</strong>sigualdad<br />
m(H, k + 1) ≥ m(H, k) · f(H)<br />
¯f<br />
· [1 − pc · δ(H)<br />
− o(H) · pm]<br />
L − 1<br />
don<strong>de</strong> f(H) <strong>es</strong> el fitn<strong>es</strong>s medio <strong>de</strong> los individuos <strong>de</strong> m(H, k),<br />
¯f <strong>es</strong> el fitn<strong>es</strong>s medio <strong>de</strong> la población Pk,<br />
pc <strong>es</strong> la probabilidad <strong>de</strong> cruce,<br />
pm <strong>es</strong> la probabilidad <strong>de</strong> que un bit mute,<br />
L <strong>es</strong> la longitud <strong>de</strong> los individuos y<br />
m(H, k) <strong>es</strong> el número <strong>de</strong> individuos pertenecient<strong>es</strong> al <strong>es</strong>quema H contenidos en la<br />
población k ésima.<br />
Demostración 1<br />
Para obtener <strong>es</strong>ta <strong>es</strong>timación tenemos que <strong>es</strong>tudiar el efecto individual y combinado <strong>de</strong> los<br />
operador<strong>es</strong> genéticos sobre los <strong>es</strong>quemas contenidos en una población.<br />
30
Sabemos que durante la selección la probabilidad <strong>de</strong> que un individuo Ii sea seleccionado<br />
viene dada por la expr<strong>es</strong>ión P (Ii) = fi/Σfj. Luego, en n seleccion<strong>es</strong> con reemplazamiento<br />
en la población Pk se obtiene que el número <strong>de</strong> individuos <strong>de</strong>l <strong>es</strong>quema H que han sido<br />
<strong>es</strong>cogidos en <strong>es</strong>as n seleccion<strong>es</strong> viene dado por<br />
m(H, k + 1) = m(H, k) · n · f(H)/Σfj<br />
Pero, como ¯ f = fj/n <strong>de</strong>nota el fitn<strong>es</strong>s medio <strong>de</strong> la población, po<strong>de</strong>mos <strong>es</strong>cribir la<br />
<strong>es</strong>timación anterior como sigue<br />
m(H, k + 1) = m(H, k) · f(H)/ ¯ f<br />
Por la tanto, el número <strong>de</strong> individuos pertenecient<strong>es</strong> al <strong>es</strong>quema H en la siguiente ge-<br />
neración <strong>es</strong> directamente proporcional al fitn<strong>es</strong>s medio <strong>de</strong>l <strong>es</strong>quema H e inversamente<br />
proporcional al fitn<strong>es</strong>s medio <strong>de</strong> la población. Esto quiere <strong>de</strong>cir que los <strong>es</strong>quemas con fitn<strong>es</strong>s<br />
medio mayor que el fitn<strong>es</strong>s medio <strong>de</strong> la población aumentarán su número <strong>de</strong> individuos<br />
en la siguiente generación, y viceversa. De hecho, el crecimiento <strong>de</strong> los “buenos” <strong>es</strong>quemas<br />
será exponencial, mientras que los <strong>es</strong>quemas “malos” tien<strong>de</strong>n a <strong>de</strong>saparecer.<br />
En particular, cuando el fitn<strong>es</strong>s medio <strong>de</strong> un <strong>de</strong>terminado <strong>es</strong>quema H se mantiene por<br />
encima <strong>de</strong>l fitn<strong>es</strong>s medio <strong>de</strong> la población una cantidad c ¯ f, entonc<strong>es</strong> se tiene<br />
m(H, k + 1) = m(H, k) · ¯ f + c ¯ f<br />
¯f<br />
= (1 + c) · m(H, k)<br />
Si suponemos un valor constante <strong>de</strong> c a lo largo <strong>de</strong> las distintas generacion<strong>es</strong> r<strong>es</strong>ulta que<br />
m(H, k) = m(H, 0) · (1 + c) k<br />
Por otro lado, r<strong>es</strong>ulta sencillo <strong>de</strong>ducir que la probabilidad <strong>de</strong> supervivencia <strong>de</strong> un <strong>es</strong>quema<br />
H tras el proc<strong>es</strong>o <strong>de</strong> cruce viene dada por<br />
ps = 1 − δ(H)<br />
L − 1<br />
Si se consi<strong>de</strong>ra una probabilidad <strong>de</strong> cruce pc para cada par <strong>de</strong> individuos emparejados,<br />
entonc<strong>es</strong> la probabilidad <strong>de</strong> supervivencia <strong>de</strong> un <strong>es</strong>quema H se aproxima por<br />
ps ≥ 1 − pc · δ(H)<br />
L − 1<br />
Ahora, combinando el efecto <strong>de</strong> la selección y <strong>de</strong>l cruce sobre un <strong>es</strong>quema H, y teniendo<br />
en cuenta que ambas operacion<strong>es</strong> son in<strong>de</strong>pendient<strong>es</strong>, se obtiene<br />
31<br />
∀ k
m(H, k + 1) ≥ m(H, k) · f(H)<br />
<br />
¯f<br />
· 1 − pc · δ(H)<br />
<br />
L − 1<br />
Es <strong>de</strong>cir, el <strong>es</strong>quema H crece o <strong>de</strong>crece según un factor multiplicativo que, por ahora,<br />
<strong>de</strong>pen<strong>de</strong> <strong>de</strong> la calidad (su fitn<strong>es</strong>s medio) y <strong>de</strong> la longitud <strong>de</strong>l <strong>es</strong>quema. Así, los <strong>es</strong>quemas<br />
con fitn<strong>es</strong>s medio por encima <strong>de</strong>l fitn<strong>es</strong>s medio <strong>de</strong> la población y <strong>de</strong> longitud pequeña<br />
crecerán en la siguiente generación.<br />
Finalmente, <strong>es</strong>tudiamos el efecto <strong>de</strong> la mutación sobre un <strong>es</strong>quema H.<br />
Es evi<strong>de</strong>nte que para que un <strong>es</strong>quema H sobreviva al proc<strong>es</strong>o <strong>de</strong> mutación no <strong>de</strong>ben cambiar<br />
ninguno <strong>de</strong> los símbolos situados en las posicion<strong>es</strong> fijas, <strong>es</strong> <strong>de</strong>cir, los símbolos distintos <strong>de</strong><br />
*. Por lo tanto, la probabilidad <strong>de</strong> que un <strong>es</strong>quema H sobreviva a una mutación viene dada<br />
por<br />
(1 − pm) o(H)<br />
don<strong>de</strong> o(H) <strong>es</strong> el número <strong>de</strong> posicion<strong>es</strong> fijas <strong>de</strong> H y (1 − pm) <strong>es</strong> la probabilidad <strong>de</strong> que una<br />
posición fija no mute.<br />
En particular, para valor<strong>es</strong> muy pequeños <strong>de</strong> pm la expr<strong>es</strong>ión anterior pue<strong>de</strong> aproximarse<br />
por (1 − o(H) · pm).<br />
Para concluir la <strong>de</strong>mostración, tenemos que tener encuenta el efecto conjunto <strong>de</strong> los<br />
tr<strong>es</strong> operador<strong>es</strong> genéticos sobre un <strong>es</strong>quema H, <strong>de</strong> modo que el número <strong>de</strong> individuos<br />
pertenecient<strong>es</strong> a H en la siguiente generación pue<strong>de</strong> aproximarse mediante la siguiente<br />
<strong>de</strong>sigualdad<br />
m(H, k + 1) ≥ m(H, k) · f(H)<br />
¯f<br />
<br />
· 1 − pc · δ(H)<br />
<br />
· (1 − o(H) · pm)<br />
L − 1<br />
Si <strong>de</strong>spreciamos los términos pequeños, obtenemos la <strong>de</strong>sigualdad buscada<br />
m(H, k + 1) ≥ m(H, k) · f(H)<br />
¯f<br />
32<br />
<br />
· 1 − pc · δ(H)<br />
<br />
− o(H) · pm<br />
L − 1
Ejemplo 14<br />
Veamos con un sencillo ejemplo el efecto <strong>de</strong>l cruce (en un punto) sobre los <strong>es</strong>quemas.<br />
Consi<strong>de</strong>ramos una ca<strong>de</strong>na <strong>de</strong> longitud 7,<br />
Sean H1 y H2 dos <strong>es</strong>quemas <strong>de</strong> ω,<br />
Suponemos que el punto <strong>de</strong> cruce <strong>es</strong> k = 3.<br />
ω = 0111000<br />
H1 = ∗ 1 ∗ ∗ ∗ ∗ 0<br />
H2 = ∗ ∗ ∗ 1 0 ∗ ∗<br />
H1 = ∗ 1 ∗ | ∗ ∗ ∗ 0<br />
H2 = ∗ ∗ ∗ | 1 0 ∗ ∗<br />
Observ<strong>es</strong>e que si el individuo que se cruza con ω no posee un 0 en la última posición o<br />
un 1 en la segunda posición, entonc<strong>es</strong> el <strong>es</strong>quema H1 se <strong>de</strong>struye al aplicar el operador <strong>de</strong><br />
cruce.<br />
Sin embargo, el <strong>es</strong>quema H2 sobrevive al proc<strong>es</strong>o <strong>de</strong> cruce pu<strong>es</strong> al menos uno <strong>de</strong> sus hijos<br />
pertenece a H2.<br />
Si aplicamos el cruce en otros puntos, po<strong>de</strong>mos concluir que el <strong>es</strong>quema H1 tiene mayor<br />
probabilidad <strong>de</strong> <strong>de</strong>saparecer pu<strong>es</strong> existen muchos puntos que rompen la <strong>es</strong>tructura que<br />
caracteriza dicho <strong>es</strong>quema. Es <strong>de</strong>cir, existe una relación directa entre la <strong>de</strong>saparición <strong>de</strong><br />
un <strong>es</strong>quema y lo que hemos <strong>de</strong>finido como su longitud.<br />
En <strong>es</strong>te caso concreto, se tiene que δ(H1) = 5 y δ(H2) = 1.<br />
Como el punto <strong>de</strong> cruce se elige aleatoriamente, po<strong>de</strong>mos <strong>de</strong>cir que las probabilida<strong>de</strong>s <strong>de</strong><br />
que dichos <strong>es</strong>quemas sean <strong>de</strong>struidos vienen dadas por<br />
δ(H1)/(L − 1) = 5/6<br />
δ(H2)/(L − 1) = 1/6<br />
En general, la probabilidad <strong>de</strong> supervivencia <strong>de</strong> un <strong>es</strong>quema H tras aplicarle el operador<br />
<strong>de</strong> cruce viene dada por<br />
1 − δ(H)<br />
L − 1<br />
33
2.7. Otros <strong>Algoritmos</strong> Genéticos: los <strong>Algoritmos</strong> <strong>Evolutivos</strong><br />
Hasta ahora hemos <strong>es</strong>tudiado el funcionamiento <strong>de</strong>l algoritmo genético simple y hemos<br />
<strong>de</strong>scrito cada uno <strong>de</strong> los operador<strong>es</strong> nec<strong>es</strong>arios para su diseño. Estos operador<strong>es</strong> pue<strong>de</strong>n<br />
re<strong>de</strong>finirse para adaptarlos a las nec<strong>es</strong>ida<strong>de</strong>s concretas <strong>de</strong> cada problema, pero el algoritmo<br />
genético simple <strong>de</strong>berá <strong>de</strong> conservar su <strong>es</strong>tructura interna: generación <strong>de</strong> una población<br />
inicial y generación <strong>de</strong> nuevas poblacion<strong>es</strong> mediante los operador<strong>es</strong> genéticos. Cualquier<br />
modificación que afecte a la <strong>es</strong>tructura <strong>de</strong>l algoritmo genético daría lugar a un algoritmo<br />
<strong>de</strong> búsqueda <strong>de</strong>nominado algoritmo evolutivo.<br />
En general, se llama algoritmo evolutivo a cualquier algoritmo probabilístico que par-<br />
tiendo <strong>de</strong> una población inicial evoluciona, dando lugar a nuevas poblacion<strong>es</strong>, con la <strong>es</strong>-<br />
peranza <strong>de</strong> que se here<strong>de</strong>n las buenas cualida<strong>de</strong>s <strong>de</strong> las poblacion<strong>es</strong> anterior<strong>es</strong>. Por lo<br />
tanto, el algoritmo genético simple <strong>es</strong> un caso particular <strong>de</strong> algoritmo evolutivo don<strong>de</strong> los<br />
operador<strong>es</strong> <strong>de</strong> selección, cruce y mutación actúan sobre cada población para generar una<br />
nueva.<br />
Partiendo <strong>de</strong> un algoritmo genético simple vamos a <strong>de</strong>finir algunas modificacion<strong>es</strong> que<br />
dan lugar a diferent<strong>es</strong> algoritmos evolutivos.<br />
Sólo mutación<br />
Si consi<strong>de</strong>ramos poblacion<strong>es</strong> <strong>de</strong> tamaño tp = 1, no tiene sentido <strong>de</strong>finir el operador <strong>de</strong><br />
cruce para generar nuevas poblacion<strong>es</strong>. En <strong>es</strong>te caso, se tiene un algoritmo evolutivo<br />
que en cada generación muta el único individuo <strong>de</strong> la población. El nuevo individuo<br />
reemplazará al anterior si el fitn<strong>es</strong>s asociado <strong>es</strong> mejor.<br />
Información heurística<br />
En muchas poblacion<strong>es</strong> <strong>es</strong> posible conocer algunas <strong>de</strong> las características que <strong>de</strong>ben<br />
tener las candidatas a solución. Por ejemplo, en algunos problemas se pue<strong>de</strong> saber a<br />
priori que una ca<strong>de</strong>na que sea solución <strong>de</strong>l problema <strong>de</strong>be <strong>de</strong> empezar por uno. Esa<br />
información pue<strong>de</strong> ser usada en la generación <strong>de</strong> la población inicial e incluso en los<br />
operador<strong>es</strong> genéticos.<br />
Convergencia Prematura<br />
Es posible evitar que una población converga a un valor que no nos permita mejorar<br />
para alcanzar la solución. Para ello, una posibilidad <strong>es</strong> inyectar <strong>de</strong> forma artificial<br />
34
diversidad mediante la generación aleatoria <strong>de</strong> nuevos individuos que reemplacen<br />
parcial o totalmente la población actual.<br />
Búsqueda local<br />
En muchos algoritmos genéticos se introduce un nuevo operador que por si sólo cons-<br />
tituye un algoritmo <strong>de</strong> búsqueda. Se trata <strong>de</strong> un proc<strong>es</strong>o que busca puntos próximos<br />
a uno dado con la <strong>es</strong>peranza <strong>de</strong> encontrar el óptimo o, por lo menos, mejorar la<br />
solución. Existen muchas tecnicas para diseñar la búsqueda local, una <strong>de</strong> las más<br />
extendidas consiste en la modificación <strong>de</strong> los valor<strong>es</strong> <strong>de</strong> los símbolos que constituyen<br />
un individuo. Cada vez que se cambia el valor <strong>de</strong> un símbolo se compara el nuevo<br />
individuo con el anterior, tomando el mejor <strong>de</strong> los dos. Podríamos repetirlo para todos<br />
los valor<strong>es</strong> <strong>de</strong>l individuo. Esta búsqueda local viene a ser un proc<strong>es</strong>o <strong>de</strong> mutación<br />
dirigido.<br />
En general, la búsqueda local mejora consi<strong>de</strong>rablemente los algoritmos. Pue<strong>de</strong> ser<br />
utilizada para mejorar la población inicial <strong>de</strong> modo que el algoritmo arranca con una<br />
población <strong>de</strong> óptimos local<strong>es</strong>. Incluso se pue<strong>de</strong> aplicar a cada población generada.<br />
Ejemplo 15 (Sólo Muatación)<br />
Vamos a construir un algoritmo evolutivo para una población <strong>de</strong> tamaño tp = 1 que usa<br />
búsqueda local.<br />
Seudocódigo<br />
I0 ← generar población inicial<br />
I0 ← busqueda local (I0)<br />
I0 ← evaluar (I0)<br />
para k = 1 hasta NIter hacer<br />
fin para<br />
I1 ← copiar (I0)<br />
I1 ← mutar (I1)<br />
I1 ← busqueda local(I1)<br />
E1 ← evaluar (I1)<br />
I0 ← mejor individuo (I0 , I1)<br />
35
Capítulo 3<br />
El Problema <strong>de</strong> Satisfactibilidad<br />
3.1. Introducción<br />
Una <strong>de</strong> las muchas aplicacion<strong>es</strong> <strong>de</strong> los algoritmos <strong>es</strong>tudiados en el capítulo anterior<br />
<strong>es</strong> la r<strong>es</strong>olución <strong>de</strong> los llamados problemas <strong>de</strong> satisfactibilidad o simplemente problemas<br />
SAT.<br />
A lo largo <strong>de</strong> <strong>es</strong>te capítulo analizaremos algunos <strong>de</strong> los algoritmos evolutivos más impor-<br />
tant<strong>es</strong> para la r<strong>es</strong>olución <strong>de</strong> SAT. Empezamos introduciendo un poco <strong>de</strong> teoría relacionada<br />
con <strong>es</strong>te problema.<br />
3.2. Conceptos Básicos<br />
Definición 14 (Problema NP)<br />
Se dice que un problema P <strong>es</strong> No Determinístico Polinomial si existe un algoritmo no<br />
<strong>de</strong>terminístico que lo r<strong>es</strong>uelve en tiempo polinomial, <strong>es</strong> <strong>de</strong>cir, dada una solución <strong>de</strong>l pro-<br />
blema P comprobar que efectivamente <strong>es</strong> solución lleva un tiempo polinomial.<br />
Usaremos la notación NP para referirnos a un problema No Determinístico Polinomial.<br />
Definición 15<br />
Se dice que un problema P se reduce a otro problema Q si existe una función f computable<br />
que transforma entradas <strong>de</strong> P en entradas <strong>de</strong> Q y tal que x <strong>es</strong> solución <strong>de</strong> P si y sólo sí f(x)<br />
<strong>es</strong> solución <strong>de</strong> Q.<br />
En <strong>es</strong>te caso, un algoritmo para r<strong>es</strong>olver Q proporciona otro algoritmo para r<strong>es</strong>olver P.<br />
Definición 16 (Problema NP duro)<br />
Se dice que un problema P <strong>es</strong> NP duro cuando cualquier otro problema NP se reduce a él.<br />
36
Definición 17 (Problema NP completo)<br />
Se dice que un problema P <strong>es</strong> completo para NP o que <strong>es</strong> NP completo si <strong>es</strong> NP y, a<strong>de</strong>más,<br />
cualquier otro problema NP se reduce a él.<br />
Definición 18 (Variable booleana)<br />
Se dice que una variable <strong>es</strong> booleana cuando sólo pue<strong>de</strong> tomar los valor<strong>es</strong> verda<strong>de</strong>ro o<br />
falso.<br />
El conjunto booleano viene dado por<br />
B = { falso, verda<strong>de</strong>ro } = { 0, 1}<br />
Por lo tanto, si x <strong>es</strong> una variable booleana entonc<strong>es</strong> el valor <strong>de</strong> x <strong>es</strong>tá en B.<br />
Definición 19<br />
El problema <strong>de</strong> satisfactibilidad (SAT) consiste en encontrar un elemento<br />
x = (x1, . . . , xn) ∈ B n tal que f(x) = 1<br />
siendo f : B n −→ B una función booleana dada.<br />
Si ∃ x ∈ B n tal que f(x) = 1 entonc<strong>es</strong> el problema se dirá satisfactible. En otro caso, se<br />
dirá insatisfactible.<br />
Proposición 1 El problema SAT <strong>es</strong> NP completo.<br />
Definición 20<br />
Sea Ω un conjunto finito <strong>de</strong> variabl<strong>es</strong>, Ω = {x1, . . . , xn}.<br />
Se dice literal sobre una variable xi a su afirmación o negación, <strong>de</strong>notándose r<strong>es</strong>pectiva-<br />
mente por xi o ¯xi.<br />
Se llama cláusula a cualquier conjunto finito <strong>de</strong> disyuncion<strong>es</strong> <strong>de</strong> literal<strong>es</strong> sobre variabl<strong>es</strong>.<br />
Ejemplo 16<br />
Dadas tr<strong>es</strong> variabl<strong>es</strong> x1, x2 y x3, se pue<strong>de</strong>n <strong>de</strong>finir las siguient<strong>es</strong> cláusulas:<br />
Definición 21<br />
C1 = x1 ∨ x2 ∨ x3, formada por tr<strong>es</strong> literal<strong>es</strong><br />
C2 = x1 ∨ x1, formada por dos literal<strong>es</strong> sobre la misma variable<br />
Se dice que una función booleana f : B n −→ B <strong>es</strong>tá en forma normal si se expr<strong>es</strong>a como<br />
una conjunción <strong>de</strong> cláusulas, <strong>es</strong> <strong>de</strong>cir, si<br />
don<strong>de</strong> C1, . . . , Cm son m cláusulas.<br />
f(x) = C1(x) ∧ C2(x) ∧ · · · ∧ Cm(x)<br />
37
Ejemplo 17 (Un problema SAT)<br />
Dada la función booleana en forma normal<br />
f : B 4 −→ B<br />
x −→ f(x) = C1(x)∧C2(x)<br />
don<strong>de</strong> C1(x) = x1 ∨ x2 ∨ x3 y C2(x) = x2 ∨ x3 ∨ x4.<br />
¿ ∃ x ∈ B 4 tal que f(x) = 1 ?<br />
Si tomamos x = (0, 0, 1, 1) ∈ B 4 entonc<strong>es</strong><br />
f(x) = C1(x) ∧ C2(x) = (0 ∨ 1 ∨ 0) ∧ (0 ∨ 1 ∨ 0) = 1 ∧ 1 = 1<br />
Por lo tanto, <strong>es</strong>te problema SAT <strong>es</strong> satisfactible.<br />
Nota 8<br />
Cualquier función <strong>de</strong> un problema SAT pue<strong>de</strong> expr<strong>es</strong>arse en forma normal sin que <strong>es</strong>to<br />
suponga pérdida <strong>de</strong> generalidad. Por ello, toda función booleana asociada al problema<br />
SAT que se consi<strong>de</strong>re a partir <strong>de</strong> ahora <strong>es</strong>tará expr<strong>es</strong>ada en forma normal.<br />
Definición 22<br />
Un problema SAT se dice <strong>de</strong> clase k si todas las cláusulas contienen exactamente k literal<strong>es</strong><br />
distintos.<br />
Para simplificar la notación hablaremos <strong>de</strong>l problema k SAT en lugar <strong>de</strong>l problema SAT<br />
<strong>de</strong> clase k.<br />
Observacion<strong>es</strong>:<br />
1. Mientras que los problemas 2 SAT son r<strong>es</strong>olubl<strong>es</strong> en tiempo polinomial, los problemas<br />
k SAT son NP completos para k ≥ 3.<br />
2. Los algoritmos exactos pue<strong>de</strong>n dar una r<strong>es</strong>pu<strong>es</strong>ta <strong>de</strong>finitiva (ser satisfactible o in-<br />
satisfactible) a algunos problemas concretos, pero tienen una complejidad <strong>de</strong> tipo<br />
exponencial en el mejor <strong>de</strong> los casos.<br />
3. Los algoritmos heurísticos, <strong>es</strong> <strong>de</strong>cir, aquellos que aprovechan la información históri-<br />
ca, pue<strong>de</strong>n encontrar solucion<strong>es</strong> para los problemas SAT, pero no garantizan una<br />
r<strong>es</strong>pu<strong>es</strong>ta <strong>de</strong>finitiva a todos los problemas, ya que no pue<strong>de</strong>n <strong>de</strong>terminar con seguri-<br />
dad si el problema <strong>es</strong> o no satisfactible.<br />
38
3.3. Los <strong>Algoritmos</strong> <strong>Evolutivos</strong> para R<strong>es</strong>olver SAT<br />
Los algoritmos evolutivos son algoritmos heurísticos que han sido utilizados para re-<br />
solver problemas SAT y otros muchos problemas NP completos.<br />
Como hemos visto en el capítulo anterior, el primer paso será la codificación <strong>de</strong> las<br />
variabl<strong>es</strong> <strong>de</strong>l problema y la elección <strong>de</strong> la función fitn<strong>es</strong>s más a<strong>de</strong>cuada para obtener una<br />
solución.<br />
A continuación <strong>de</strong>scribimos distintos métodos <strong>de</strong> codificación para el problema SAT.<br />
R<strong>es</strong>pr<strong>es</strong>entación ca<strong>de</strong>na <strong>de</strong> bits<br />
El proc<strong>es</strong>o inmediato y, hasta ahora, más seguro para repr<strong>es</strong>entar una solución can-<br />
didata <strong>de</strong> un problema SAT <strong>es</strong> una ca<strong>de</strong>na <strong>de</strong> bits <strong>de</strong> longitud igual al número <strong>de</strong><br />
variabl<strong>es</strong>, <strong>de</strong> manera que a cada variable se le asocia un bit.<br />
Para po<strong>de</strong>r implementar el algoritmo genético tenemos que <strong>de</strong>cidir cuál será nu<strong>es</strong>tra<br />
función fitn<strong>es</strong>s. La función booleana f <strong>de</strong>l problema SAT pue<strong>de</strong> ser usada como<br />
función fitn<strong>es</strong>s pu<strong>es</strong> las solucion<strong>es</strong> <strong>de</strong>l problema SAT corr<strong>es</strong>pon<strong>de</strong>n al óptimo global<br />
<strong>de</strong> f. Sin embargo, <strong>es</strong>ta aproximación falla porque el algoritmo genético <strong>de</strong>genera en<br />
pura búsqueda aleatoria cuando todas las solucion<strong>es</strong> candidatas toman el valor cero<br />
en la función objetivo, a menos que una solución sea encontrada.<br />
Por <strong>es</strong>te motivo se introduce la formulación MAXSAT, don<strong>de</strong> la función fitn<strong>es</strong>s re-<br />
pr<strong>es</strong>enta el número <strong>de</strong> cláusulas que se verifican, <strong>es</strong> <strong>de</strong>cir,<br />
fMAXSAT (x) = C1(x) + · · · + Cm(x)<br />
siendo Ci(x) el valor <strong>de</strong> verdad <strong>de</strong> la i ésima cláusula, para i = 1, . . . , m.<br />
Ejemplo 18<br />
Consi<strong>de</strong>ramos el problema SAT dado por la función<br />
f : B 6 −→ B<br />
x −→ f(x) = C1(x)∧C2(x)<br />
don<strong>de</strong> C1(x) = {x1, x2, x1} y C2(x) = {x3, x4, x6}.<br />
Observamos que la cláusula C1 se verifica siempre, pu<strong>es</strong> aparece x1 y ¯x1.<br />
Proponemos como solución el elemento<br />
x = (x1, x2, x3, x4, x5, x6) = (1, 0, 0, 1, 1, 0) ∈ B 6<br />
39
La codificación <strong>de</strong> <strong>es</strong>ta solución como ca<strong>de</strong>na <strong>de</strong> bits <strong>es</strong> 100110.<br />
La función fitn<strong>es</strong>s que guiará el proc<strong>es</strong>o <strong>de</strong> búsqueda se <strong>de</strong>fine como<br />
fMAXSAT (x) = C1(x) + C2(x) = 1 + C2(x) ∀x<br />
El elemento que se propone como solución <strong>es</strong> en realidad solución <strong>de</strong>l problema pu<strong>es</strong><br />
C2(101010) = 1. Por lo tanto,<br />
fMAXSAT (101010) = 2<br />
que <strong>es</strong> el valor máximo que pue<strong>de</strong> tomar el fitn<strong>es</strong>s, <strong>es</strong> <strong>de</strong>cir, se verifican todas las<br />
cláusulas.<br />
La función fMAXSAT <strong>es</strong> usada como función fitn<strong>es</strong>s en la mayoría <strong>de</strong> los algoritmos<br />
evolutivos para SAT, sin embargo, las dificulta<strong>de</strong>s que han ido apareciendo, incluso<br />
para r<strong>es</strong>olver pequeños problemas SAT, han motivado la <strong>de</strong>finición <strong>de</strong> nuevas fun-<br />
cion<strong>es</strong> fitn<strong>es</strong>s que <strong>de</strong>pen<strong>de</strong>n <strong>de</strong> los mecanismos <strong>de</strong> adaptación utilizados, con el fin<br />
<strong>de</strong> lograr una distinción entre las distintas solucion<strong>es</strong> candidatas.<br />
R<strong>es</strong>pr<strong>es</strong>entación punto flotante<br />
En 1998, Bäck [3] propone transformar los problemas SAT en problemas <strong>de</strong> opti-<br />
mización continuos, <strong>de</strong> manera que la optimización numérica <strong>de</strong> <strong>es</strong>tos problemas se<br />
pueda abordar mediante técnicas clásicas.<br />
Así, las solucion<strong>es</strong> candidatas son repr<strong>es</strong>entadas por vector<strong>es</strong> continuos<br />
y ∈ [−1, 1] n<br />
y la función objetivo se <strong>de</strong>fine <strong>de</strong> modo que el óptimo global corr<strong>es</strong>pon<strong>de</strong> direc-<br />
tamente a solucion<strong>es</strong> factibl<strong>es</strong> para el problema SAT. Para ello, se reemplazan las<br />
variabl<strong>es</strong> xj por (yj −1) 2 y xj por (yj +1) 2 para cada j = 1, . . . , n. A<strong>de</strong>más, se <strong>de</strong>fine<br />
la función fitn<strong>es</strong>s<br />
g(x) =<br />
⎛ ⎞<br />
m n<br />
⎝ hij(x) ⎠<br />
siendo m el número <strong>de</strong> cláusulas y<br />
⎧<br />
(yj − 1)<br />
⎪⎨<br />
hij(x) =<br />
2 si xj ∈ Ci(x) , ¯xj ∈ Ci(x)<br />
(yj + 1) 2 si ¯xj ∈ Ci(x) , xj ∈ Ci(x)<br />
⎪⎩<br />
i=1<br />
j=1<br />
(yj − 1) 2 · (yj + 1) 2 si ¯xj , xj ∈ Ci(x)<br />
1 en otro caso<br />
40
Ahora el objetivo <strong>es</strong> minimizar la función g. De hecho, valor<strong>es</strong> <strong>de</strong> g nulos se corr<strong>es</strong>-<br />
pon<strong>de</strong>n con solucion<strong>es</strong>.<br />
Ejemplo 19<br />
Consi<strong>de</strong>ramos el problema 3 SAT dado por la fórmula booleana<br />
f(x) = C1(x) ∧ C2(x) ∧ C3(x)<br />
don<strong>de</strong> C1(x) = x1 ∨ x2 ∨ x4, C2(x) = x1 ∨ x3 ∨ x4, y C3(x) = x2 ∨ x3 ∨ x4.<br />
La función f : B 4 −→ B se transforma en la función continua g : [−1, 1] 4 −→ R<br />
<strong>de</strong>finida por<br />
g(y) = (y1−1) 2 (y2+1) 2 (y4−1) 2 +(y1+1) 2 (y3−1) 2 (y4+1) 2 +(y2+1) 2 (y3+1) 2 (y4−1) 2<br />
y nu<strong>es</strong>tro objetivo <strong>es</strong> minimizar el valor <strong>de</strong> g.<br />
Ahora, los valor<strong>es</strong> booleanos 0 y 1 son asociados a los valor<strong>es</strong> -1 y 1.<br />
En la implementación <strong>de</strong>l algoritmo, para comprobar si una solución para el pro-<br />
blema SAT <strong>es</strong> realmente repr<strong>es</strong>entada, se convierten los vector<strong>es</strong> continuos a -1 y 1,<br />
redon<strong>de</strong>ando los valor<strong>es</strong> negativos y positivos, r<strong>es</strong>pectivamente.<br />
A p<strong>es</strong>ar <strong>de</strong> lo prometedora y original que r<strong>es</strong>ulta <strong>es</strong>ta repr<strong>es</strong>entación, los r<strong>es</strong>ultados<br />
obtenidos no mejoran los <strong>de</strong> la repr<strong>es</strong>entación como ca<strong>de</strong>na <strong>de</strong> bits.<br />
R<strong>es</strong>pr<strong>es</strong>entación clausal<br />
Propu<strong>es</strong>ta por Hao [10] en 1995, <strong>es</strong>ta repr<strong>es</strong>entación r<strong>es</strong>alta los efectos local<strong>es</strong> <strong>de</strong> las<br />
variabl<strong>es</strong> en las cláusulas.<br />
Para ello, se seleccionan asignacion<strong>es</strong> <strong>de</strong> valor<strong>es</strong> localmente consistent<strong>es</strong> para las<br />
distintas variabl<strong>es</strong> en cada cláusula con el fin <strong>de</strong> encontrar asignacion<strong>es</strong> globalmente<br />
consistent<strong>es</strong>.<br />
Ejemplo 20<br />
Volviendo a la función boolena <strong>de</strong>l ejemplo anterior<br />
f(x) = C1(x) ∧ C2(x) ∧ C3(x)<br />
don<strong>de</strong> C1(x) = x1 ∨ x2 ∨ x4, C2(x) = x1 ∨ x3 ∨ x4, y C3(x) = x2 ∨ x3 ∨ x4.<br />
Existen 8 asignacion<strong>es</strong> posibl<strong>es</strong> para las variabl<strong>es</strong> en la primera cláusula, pero sólo<br />
una <strong>de</strong> ellas no <strong>es</strong> viable. En efecto,<br />
sí (x1, x2, x4) = (0, 1, 0) entonc<strong>es</strong> C1(x) = x1 ∨ x2 ∨ x4 = 0 ∨ 0 ∨ 0 = 0<br />
41
En el r<strong>es</strong>to <strong>de</strong> los casos, <strong>es</strong> fácil comprobar que C1(x) = 1.<br />
Razonando <strong>de</strong> la misma forma, obtenemos las asignacion<strong>es</strong> posibl<strong>es</strong> para las otras<br />
cláusulas.<br />
Una combinación <strong>de</strong> asignacion<strong>es</strong> posibl<strong>es</strong> para las distintas cláusulas viene dada por<br />
{(x1, x2, x4) = (1, 0, 0); (x1, x3, x4) = (1, 1, 0); (x2, x3, x4) = (0, 1, 1)}<br />
Esta sería una candidata a solución, sin embargo, contiene asignacion<strong>es</strong> inconsis-<br />
tent<strong>es</strong> para la variable x4, pu<strong>es</strong> por un lado se tiene que x4 = 0 en la cláusula C1 y,<br />
por otro lado, x4 = 1 para la cláusula C3. Por lo tanto, <strong>es</strong>ta candidata a solución no<br />
<strong>es</strong> globalmente consistente.<br />
Siguiendo con <strong>es</strong>te razonamiento, se llega a la candidata a solución<br />
{(x1, x2, x4) = (1, 0, 0); (x1, x3, x4) = (1, 1, 0); (x2, x3, x4) = (0, 1, 0)}<br />
que <strong>es</strong> globalmente consistente y, por lo tanto, x = (1, 0, 1, 0) <strong>es</strong> solución <strong>de</strong>l proble-<br />
ma.<br />
En <strong>es</strong>te caso, el algoritmo genético tiene que ser guiado por una función objetivo<br />
que refleje la cantidad <strong>de</strong> inconsistencias entre las distintas asignacion<strong>es</strong> <strong>de</strong> variabl<strong>es</strong><br />
para las cláusulas. Esto implica un proc<strong>es</strong>o <strong>de</strong> búsqueda centrado en las relacion<strong>es</strong><br />
entre las variabl<strong>es</strong> que, al mismo tiempo, <strong>es</strong>tán relacionadas entre sí por las distintas<br />
cláusulas.<br />
Aunque Hao argumentó que la eliminación <strong>de</strong> las asignacion<strong>es</strong> inviabl<strong>es</strong> reduce el<br />
<strong>es</strong>pacio <strong>de</strong> búsqueda, la repr<strong>es</strong>entación clausal induce un <strong>es</strong>pacio <strong>de</strong> búsqueda mu-<br />
cho más gran<strong>de</strong> incluso que el obtenido en la repr<strong>es</strong>entación ca<strong>de</strong>na <strong>de</strong> bits para<br />
problemas con muchas cláusulas.<br />
R<strong>es</strong>pr<strong>es</strong>entación “path”<br />
Sugerida por Gottlieb y Voss [6] en 1998, se basa en el hecho <strong>de</strong> que una solución<br />
viable <strong>de</strong>be satisfacer al menos una variable en cada cláusula.<br />
La i<strong>de</strong>a consiste en ir seleccionando una variable en cada cláusula mediante un<br />
proc<strong>es</strong>o que recorre todas las cláusulas exactamente una vez cada una. Si no hay<br />
inconsistencia en <strong>es</strong>te proc<strong>es</strong>o, po<strong>de</strong>mos construir un vector <strong>de</strong> asignacion<strong>es</strong>.<br />
42
Una función fitn<strong>es</strong>s razonable para <strong>es</strong>te tipo <strong>de</strong> repr<strong>es</strong>entación <strong>de</strong>be medir el número<br />
<strong>de</strong> inconsistencias.<br />
Ejemplo 21<br />
Dado el problema SAT, encontrar x = (x1, x2, x3, x4) ∈ B 4 tal que<br />
siendo<br />
f(x) = 1<br />
f(x) = (x1 ∨ x2 ∨ x4) ∧ (x1 ∨ x3 ∨ x4) ∧ (x2 ∨ x3 ∨ x4)<br />
El camino (x1, x4, x3) <strong>es</strong> factible y nos permite construir los vector<strong>es</strong> <strong>de</strong> asignación<br />
x = (1, 0, 0, 0) y x ′ = (1, 1, 0, 0), mientras que el camino (x1, x4, x4) contiene una<br />
inconsistencia.<br />
Una característica <strong>de</strong> <strong>es</strong>te proc<strong>es</strong>o, que lo distingue <strong>de</strong> la repr<strong>es</strong>entación clausal,<br />
<strong>es</strong> que permite repr<strong>es</strong>entar una familia <strong>de</strong> solucion<strong>es</strong> factibl<strong>es</strong> en lugar <strong>de</strong> intentar<br />
<strong>de</strong>terminar exactamente una.<br />
Aunque <strong>es</strong>ta repr<strong>es</strong>entación parece la más idónea, los r<strong>es</strong>ultados obtenidos no han<br />
mejorado los <strong>de</strong> la repr<strong>es</strong>entación ca<strong>de</strong>na <strong>de</strong> bits.<br />
D<strong>es</strong>pués <strong>de</strong> <strong>es</strong>ta breve <strong>de</strong>scripción po<strong>de</strong>mos concluir que la mayoría <strong>de</strong> los algoritmos<br />
evolutivos para r<strong>es</strong>olver problemas SAT utilizan como repr<strong>es</strong>entación la ca<strong>de</strong>na <strong>de</strong> bits.<br />
La diferencia se encuentra en el tipo <strong>de</strong> función fitn<strong>es</strong>s utilizada. A<strong>de</strong>más, algunos algo-<br />
ritmos evolutivos incorporan otras características, no genéticas, como la búsqueda local y<br />
la adaptación.<br />
SAT.<br />
A continuación <strong>de</strong>scribimos algunos <strong>de</strong> los algoritmos evolutivos más conocidos para<br />
SAWEA ( stepwise adaptation of weights )<br />
En 1997, Eiben y van <strong>de</strong>r Hauw [4] proponen una función fitn<strong>es</strong>s para r<strong>es</strong>olver<br />
los problemas SAT, principalmente 3 SAT . El algoritmo evolutivo que la utiliza<br />
se <strong>de</strong>nominó SAW y la función fitn<strong>es</strong>s se <strong>de</strong>finió como<br />
fSAW (x) = ω1 · C1(x) + · · · + ωm · Cm(x)<br />
don<strong>de</strong> los p<strong>es</strong>os ωi ∈ N, para i = 1, . . . , m, son adaptados para i<strong>de</strong>ntificar las cláusu-<br />
las difícil<strong>es</strong> <strong>de</strong> satisfacer en la actual fase <strong>de</strong> búsqueda.<br />
43
En la primera fase todos los p<strong>es</strong>os son inicializados a uno, ωi = 1 para i = 1, . . . , m,<br />
con lo que se utiliza fMAXSAT .<br />
En las siguient<strong>es</strong> fas<strong>es</strong>, cada 250 evaluacion<strong>es</strong> <strong>de</strong> la función fitn<strong>es</strong>s, los p<strong>es</strong>os son<br />
ajustados <strong>de</strong> acuerdo a la siguiente expr<strong>es</strong>ión<br />
ωi ← ωi + 1 − Ci(x ∗ )<br />
don<strong>de</strong> x ∗ <strong>es</strong> el actual individuo mejor adaptado. De <strong>es</strong>ta forma, se incrementan sólo<br />
los p<strong>es</strong>os que corr<strong>es</strong>pon<strong>de</strong>n a cláusulas que no se verifican con x ∗ , <strong>es</strong> <strong>de</strong>cir, los p<strong>es</strong>os<br />
reflejan la “dureza” <strong>de</strong> las cláusulas asociadas obligando a enfocar hacia ellas la<br />
búsqueda evolutiva.<br />
En 1998, Bäck i<strong>de</strong>ntifico las mejor<strong>es</strong> características <strong>de</strong> <strong>es</strong>te algoritmo evolutivo y que<br />
se conoce por SAWEA. Estas características son: tamaño <strong>de</strong> población tp = 1, un o-<br />
perador <strong>de</strong> mutación que mute exactamente un bit y un <strong>es</strong>quema <strong>de</strong> reemplazamiento<br />
en el cual <strong>de</strong> cada individuo se generan λ hijos mediante mutacion<strong>es</strong>, sustituyendo<br />
el mejor <strong>de</strong> todos ellos a su padre, <strong>es</strong>te tipo <strong>de</strong> reemplazamiento se <strong>de</strong>nota como<br />
(1, λ ∗ ).<br />
Más tar<strong>de</strong>, Jong y Kosters sugieren aplicar un operador adicional a los individuos<br />
obtenidos <strong>de</strong> la mutación. Este operador selecciona aleatoriamente algunas cláusulas<br />
y, en aquellas que todavía no se verifiquen, muta una variable elgida aleatoriamente.<br />
Esta mejora se conoce por LSAWEA.<br />
RFEA ( refining functions )<br />
En 1998, Gottlieb y Voss [7] introducen una nueva función fitn<strong>es</strong>s con el fin <strong>de</strong><br />
distinguir las distintas ca<strong>de</strong>nas binarias que tienen asociado un mismo valor fitn<strong>es</strong>s<br />
fMAXSAT .<br />
Para ello, <strong>de</strong>finen una función<br />
r : B n −→ [0, 1)<br />
que guarda el conocimiento heurístico adicional y utilizan la función fitn<strong>es</strong>s re<strong>de</strong>finida<br />
para guiar el proc<strong>es</strong>o <strong>de</strong> búsqueda.<br />
fREF (x) = C1(x) + · · · + Cm(x) + α · r(x)<br />
44
En la función fREF la constante α > 0 controla la influencia <strong>de</strong> r. De <strong>es</strong>ta forma, si<br />
usamos un nivel <strong>de</strong> influencia α ∈ [0, 1), po<strong>de</strong>mos distinguir ca<strong>de</strong>nas que satisfacen<br />
el mismo número <strong>de</strong> cláusulas.<br />
Una versión mejorada <strong>de</strong> <strong>es</strong>te algoritmo evolutivo, <strong>de</strong>nominada RFEA, usa una<br />
población <strong>de</strong> tamaño tp = 4, selección por torneo, y un <strong>es</strong>quema <strong>de</strong> reemplaza-<br />
miento basado en la eliminación <strong>de</strong>l peor individuo. A<strong>de</strong>más, un nuevo individuo <strong>es</strong><br />
rechazado si ya <strong>es</strong>tá en la población. El operador <strong>de</strong> mutación consiste en seleccionar<br />
una cláusula <strong>de</strong> entre las que no se verifican y cambiar el valor <strong>de</strong> una <strong>de</strong> las variabl<strong>es</strong><br />
<strong>de</strong> la cláusula, elegida aleatoriamente.<br />
El principal componente <strong>de</strong>l algoritmo evolutivo, junto con el operador <strong>de</strong> mutación,<br />
<strong>es</strong> la función <strong>de</strong> referencia<br />
r(x) = 1<br />
⎛<br />
n<br />
⎞<br />
⎜ K(xj)vj ⎟<br />
⎜<br />
⎟<br />
⎜ j =1 ⎟<br />
⎜1<br />
+<br />
2 ⎜<br />
n<br />
⎟<br />
⎝ 1 + |vj| ⎠<br />
j =1<br />
don<strong>de</strong> vj ∈ R <strong>es</strong> el p<strong>es</strong>o asociado a la variable xj y K : B −→ {−1, 1} viene <strong>de</strong>finida<br />
por K(0) = −1 y K(1) = 1.<br />
La adaptación <strong>de</strong> vj tiene como objeto <strong>es</strong>capar <strong>de</strong>l óptimo local y se <strong>de</strong>fine como<br />
sigue<br />
vj ← vj − K(x ∗ j) · |Uj(x ∗ )|<br />
don<strong>de</strong> x ∗ <strong>es</strong> el actual individuo mejor adaptado y |Uj(x ∗ )| <strong>de</strong>nota el cardinal <strong>de</strong>l<br />
conjunto <strong>de</strong> cláusulas que no se satisfacen y que contienen la corr<strong>es</strong>pondiente variable<br />
x ∗ j .<br />
Existen otras formas <strong>de</strong> aproximar los p<strong>es</strong>os pero que no vamos a mencionarlas pu<strong>es</strong><br />
no serán <strong>de</strong> utilidad en nu<strong>es</strong>tro trabajo.<br />
FlipGA ( Flip Heuristic )<br />
Se trata <strong>de</strong> un algoritmo evolutivo con búsqueda local, <strong>de</strong>sarrollado por Marchiori y<br />
Rossi [17] en 1999, que genera nuevos individuos mediante los operador<strong>es</strong> genéticos<br />
usual<strong>es</strong> y luego los mejora aplicando un proc<strong>es</strong>o <strong>de</strong> búsqueda local.<br />
45
Este algoritmo utiliza un tamaño <strong>de</strong> población tp = 10, proc<strong>es</strong>o <strong>de</strong> selección propor-<br />
cional al fitn<strong>es</strong>s, y un <strong>es</strong>quema <strong>de</strong> reemplazamiento generacional elitista, copiando<br />
los dos mejor<strong>es</strong> individuos <strong>de</strong> la población actual en la población siguiente. Siempre<br />
se aplica cruce uniforme y un proc<strong>es</strong>o <strong>de</strong> mutación con probabilidad 0,9, <strong>de</strong> modo<br />
que, cada bit <strong>de</strong>l individuo que muta cambia <strong>de</strong> valor con probabilidad 0,5.<br />
La clave <strong>de</strong> <strong>es</strong>te algoritmo <strong>es</strong> la aplicación <strong>de</strong> un proc<strong>es</strong>o <strong>de</strong> búsqueda local a cada<br />
individuo <strong>de</strong>spués <strong>de</strong> realizar el cruce y la mutación. Este proc<strong>es</strong>o consiste en reco-<br />
rrer <strong>de</strong> izquierda a <strong>de</strong>recha los bits <strong>de</strong> un individuo y cambiar el valor <strong>de</strong> cada bit<br />
seleccionado si el número <strong>de</strong> cláusulas que se satisfacen <strong>de</strong>spués <strong>de</strong>l cambio menos el<br />
número <strong>de</strong> cláusulas que se satisfacen ant<strong>es</strong> <strong>de</strong> cambiar el valor <strong>de</strong> dicho bit <strong>es</strong> mayor<br />
o igual que cero. Cuando se han consi<strong>de</strong>rado todos los bits <strong>de</strong>l individuo, se mira si<br />
el fitn<strong>es</strong>s asociado a <strong>es</strong>e individuo ha mejorado, en <strong>es</strong>e caso, se repite el proc<strong>es</strong>o.<br />
La i<strong>de</strong>a <strong>de</strong> <strong>es</strong>te algoritmo <strong>es</strong> conseguir explotación y exploración mediante dos módu-<br />
los bien diferenciados: búsqueda local y operador<strong>es</strong> genéticos. De <strong>es</strong>ta forma, se pue<strong>de</strong><br />
controlar mejor el efecto <strong>de</strong> los distintos módulos y modificarlos facilmente para la<br />
inv<strong>es</strong>tigación experimental.<br />
ASAP ( Flip Heuristic and Adaptation )<br />
Es una versión <strong>de</strong> FlipGA, introducida por Rossi [22] en 2000, <strong>de</strong>nominada como<br />
algoritmo evolutivo adaptado para el problema <strong>de</strong> satisfactibilidad. Se obtiene <strong>de</strong><br />
FlipGA al consi<strong>de</strong>rar un único individuo, <strong>es</strong>to <strong>es</strong>, tamaño <strong>de</strong> población tp = 1, un<br />
<strong>es</strong>quema <strong>de</strong> reemplazamiento, <strong>de</strong>notado por (1 + 1), en el cual <strong>de</strong> cada individuo se<br />
genera un hijo mediante mutación que sustituye al padre si <strong>es</strong> mejor y un mecanismo<br />
adaptado para controlar la diversificación en el proc<strong>es</strong>o <strong>de</strong> búsqueda.<br />
ASAP actua sobre el individuo como sigue: primero, se aplica siempre el proc<strong>es</strong>o<br />
<strong>de</strong> mutación y se cambia, para cada j ∈ {1 . . . n}, el valor <strong>de</strong>l j ésimo bit con pro-<br />
babilidad µj ∈ [0, 0,5], don<strong>de</strong> µj <strong>es</strong> adaptado durante la ejecución. Luego, el nuevo<br />
individuo <strong>es</strong> mejorado mediante búsqueda local como en FlipGA. A<strong>de</strong>más, un meca-<br />
nismo <strong>de</strong> adaptación basado en la búsqueda tabu <strong>es</strong> usado para prohibir que cambie<br />
el valor <strong>de</strong> algunas variabl<strong>es</strong> y para controlar la probabilidad <strong>de</strong> mutación µj.<br />
En la siguiente tabla aparecen las principal<strong>es</strong> características <strong>de</strong> los algoritmos evolu-<br />
tivos, más conocidos, para r<strong>es</strong>olver SAT.<br />
46
Características SAWEA RFEA FlipGA ASAP<br />
Reemplazamiento (1, λ ∗ ) elimina el peor generacional (1 + 1)<br />
Selección — torneo proporcional al fitn<strong>es</strong> —<br />
fitn<strong>es</strong>s fSAW fREF fMAXSAT fMAXSAT<br />
Inicialización aleatorio aleatorio aleatorio aleatorio<br />
Cruce — — uniforme —<br />
Mutación muta uno muta uno aleatorio aleatorio adaptado<br />
Búsqueda local — — heurístico heurístico<br />
Nota 9<br />
Adaptación fitn<strong>es</strong>s fitn<strong>es</strong>s — lista tabu<br />
Todos los algoritmos propu<strong>es</strong>tos utilizan poblacion<strong>es</strong> inicial<strong>es</strong> puramente aleatorias.<br />
Por último, hablaremos <strong>de</strong> la búsqueda local para los problemas SAT. Con <strong>es</strong>te proc<strong>es</strong>o<br />
se preten<strong>de</strong> explorar el <strong>es</strong>pacio <strong>de</strong> búsqueda <strong>de</strong> las asignacion<strong>es</strong> <strong>de</strong> valor<strong>es</strong> para encontrar<br />
una solución que maximice el número <strong>de</strong> cláusulas que se verifican. Se empieza con una<br />
asignación generada <strong>de</strong> forma aleatoria y se van generando nuevas asignacion<strong>es</strong> al cambiar<br />
el valor <strong>de</strong> verdad <strong>de</strong> una variable simple. La fase crucial <strong>de</strong> <strong>es</strong>te proc<strong>es</strong>o <strong>es</strong> la selección <strong>de</strong><br />
la variable que cambia. Existen muchas teorías y todas incluyen aleatoriedad y memoria.<br />
Uno <strong>de</strong> los más popular<strong>es</strong> métodos <strong>de</strong> búsqueda local para SAT <strong>es</strong> WSAT. Fue <strong>de</strong>sa-<br />
rrollado por Selman [23] en 1994 y McAll<strong>es</strong>ter [18] en 1997. En <strong>es</strong>te caso, la selección <strong>de</strong><br />
una variable para ser cambiada se realiza en dos etapas. Primero, una cláusula <strong>de</strong> entre las<br />
que no se verifican <strong>es</strong> elegida aleatoriamente. Luego, una <strong>de</strong> las variabl<strong>es</strong> <strong>de</strong> <strong>es</strong>ta clausula<br />
se selecciona para cambiar su valor (pasa <strong>de</strong> cero a uno o <strong>de</strong> uno a cero) obteniendose una<br />
nueva asignación <strong>de</strong> valor<strong>es</strong>.<br />
Para finalizar, observ<strong>es</strong>e que WSAT y FlipGA, y en consecuencia ASAP, adoptan<br />
diferent<strong>es</strong> <strong>es</strong>trategias <strong>de</strong> búsqueda. Mientras que una iteración <strong>de</strong> WSAT actua localmente<br />
sobre una cláusula que no se verifica, modificandola sin afectar al r<strong>es</strong>to <strong>de</strong> cláusulas que<br />
si se verifican, en FlipGA, cada iteración actua globalmente sobre el problema con el fin<br />
<strong>de</strong> reducir el número total <strong>de</strong> cláusulas que no se verifican.<br />
47
Capítulo 4<br />
<strong>Sistemas</strong> <strong>de</strong> <strong>“Word</strong> <strong>Equations”</strong>: el<br />
Algoritmo <strong>de</strong> Makanin<br />
4.1. Introducción<br />
A lo largo <strong>de</strong> <strong>es</strong>te capítulo <strong>es</strong>tudiaremos el tipo <strong>de</strong> problemas que preten<strong>de</strong>mos r<strong>es</strong>olver<br />
con ayuda <strong>de</strong> la teoría <strong>de</strong>sarrollada sobre los algoritmos genéticos.<br />
Introduciremos el concepto <strong>de</strong> sistema <strong>de</strong> “word equations” y algunos <strong>de</strong> los r<strong>es</strong>ultados<br />
conocidos hasta la fecha para su r<strong>es</strong>olución. (ver [9, 21])<br />
Pensemos en un sencillo problema que consiste en <strong>de</strong>terminar si dos ca<strong>de</strong>nas dadas<br />
sobre un alfabeto coinci<strong>de</strong>n. No r<strong>es</strong>ulta difícil diseñar métodos capac<strong>es</strong> <strong>de</strong> r<strong>es</strong>olver <strong>es</strong>te<br />
problema.<br />
Ejemplo 22<br />
Sea A = { a, b} un alfabeto.<br />
Consi<strong>de</strong>ramos las ca<strong>de</strong>nas<br />
Es evi<strong>de</strong>nte que ω1 = ω2.<br />
ω1 = abbabbab<br />
ω2 = abbabab<br />
Una i<strong>de</strong>a tan sencilla como la <strong>de</strong> recorrer ambas ca<strong>de</strong>nas símbolo a símbolo (<strong>de</strong> forma<br />
simultánea) y comparar ambos símbolos, nos permite diseñar un método que <strong>de</strong>termina si<br />
ω1 coinci<strong>de</strong> con ω2.<br />
48
ω1<br />
ω2<br />
✲<br />
✲<br />
a b b a b b a · · ·<br />
a b b a b b b · · ·<br />
✻<br />
⇒ ω1 = ω2<br />
Un problema más difícil surge cuando se preten<strong>de</strong>n encontrar patron<strong>es</strong> en ca<strong>de</strong>nas<br />
dadas. Pensemos en ecuacion<strong>es</strong> formadas por ca<strong>de</strong>nas que contienen los símbolos <strong>de</strong> un<br />
alfabeto dado, y las variabl<strong>es</strong> que repr<strong>es</strong>entan los patron<strong>es</strong> a <strong>de</strong>terminar. El caso más<br />
sencillo se dá cuando en un lado <strong>de</strong> la ecuación sólo hay símbolos <strong>de</strong>l alfabeto y las<br />
variabl<strong>es</strong> aparecen en el otro lado.<br />
Ejemplo 23<br />
Tenemos que encontrar dos ca<strong>de</strong>nas ω1 y ω2 sobre el alfabeto A = { a, b} tal que al<br />
reemplazar x por ω1 e y por ω2 en la ecuación<br />
ambos lados <strong>de</strong> la igualdad sean idénticos.<br />
xabbxy = aabbaabaaa<br />
De nuevo, existen muchas formas <strong>de</strong> calcular ω1 y ω2. En <strong>es</strong>te caso, <strong>es</strong> evi<strong>de</strong>nte que ω1 = a<br />
y ω2 = abaaa son solución <strong>de</strong> la ecuación. Pero, no tiene por que ser la única posibilidad.<br />
Nota 10<br />
La búsqueda <strong>de</strong> patron<strong>es</strong> en ecuacion<strong>es</strong> don<strong>de</strong> uno <strong>de</strong> los lados <strong>es</strong> constante (formado<br />
por la ca<strong>de</strong>na texto) y en el otro aparecen los patron<strong>es</strong> a encontrar (repr<strong>es</strong>entados por<br />
variabl<strong>es</strong>) ha sido muy <strong>es</strong>tudiado y existen algoritmos bastante eficient<strong>es</strong> que lo r<strong>es</strong>uelven.<br />
En general, po<strong>de</strong>mos plantear el problema <strong>de</strong> encontrar la solución <strong>de</strong> una ecuación<br />
formada por ca<strong>de</strong>nas <strong>de</strong> un alfabeto y tal que en ambos lados aparecen variabl<strong>es</strong> a <strong>de</strong>ter-<br />
minar. Como veremos, la r<strong>es</strong>olución <strong>de</strong> <strong>es</strong>tos problemas no <strong>es</strong> tan sencilla.<br />
Ejemplo 24<br />
Determinar la solución <strong>de</strong> la ecuación<br />
no r<strong>es</strong>ulta una tarea fácil.<br />
xaxbya = bybyax<br />
Solucion<strong>es</strong> parcial<strong>es</strong> <strong>de</strong> <strong>es</strong>te problema se conocen <strong>de</strong>s<strong>de</strong> hace tiempo. En 1972, Lentin [15],<br />
Plotkin [20] y Siekmann [25] diseñaron procedimientos <strong>de</strong> semi <strong>de</strong>cisión, <strong>es</strong> <strong>de</strong>cir, algorit-<br />
mos que encuentran una solución si existe alguna pero que podrían no terminar si no existe<br />
49
solución. En 1971 Hmelevski [11] r<strong>es</strong>uelve el problema para ecuacion<strong>es</strong> con tr<strong>es</strong> variabl<strong>es</strong>.<br />
Finalmente, en 1977 Makanin [16] r<strong>es</strong>uelve el problema mediante el primer algoritmo (y<br />
único conocido hasta la fecha) que encuentra solución si existe alguna y a<strong>de</strong>más <strong>es</strong> capaz<br />
<strong>de</strong> <strong>de</strong>terminar la no existencia <strong>de</strong> solución.<br />
Los documentos original<strong>es</strong> <strong>de</strong> Makanin <strong>es</strong>taban enfocados a <strong>de</strong>terminar si la existencia<br />
<strong>de</strong> solución <strong>de</strong> <strong>es</strong>te tipo <strong>de</strong> ecuacion<strong>es</strong>, <strong>de</strong>nominadas “word equation”, <strong>es</strong> un problema<br />
<strong>de</strong>cidible. No <strong>es</strong>taba inter<strong>es</strong>ado en la complejidad o en la implementación <strong>de</strong>l algoritmo.<br />
Aunque posteriormente se han realizado mejoras (Pécuchet [19], Abdulrab [1], Jaf-<br />
far [13], Schuld [24], Koscielski, Pachóski [14], entre otros, consiguieron simplificar algunos<br />
<strong>de</strong> los <strong>de</strong>tall<strong>es</strong> técnicos <strong>de</strong> la <strong>de</strong>mostración, empezaron a aproximar el problema <strong>de</strong>s<strong>de</strong> un<br />
punto <strong>de</strong> vista computacional y realizaron un <strong>es</strong>tudio sistemático <strong>de</strong> su complejidad) el<br />
algoritmo <strong>de</strong> Makanin sigue siendo inviable en la práctica.<br />
El <strong>de</strong>sarrollo teórico <strong>de</strong>l algoritmo <strong>de</strong> Makanin que aparece en <strong>es</strong>te documento nos<br />
permitirá compren<strong>de</strong>r su funcionamiento y nos dará una i<strong>de</strong>a <strong>de</strong> su complejidad computa-<br />
cional.<br />
4.2. Conceptos Básicos<br />
Sean A = { a1, . . . , ar} un alfabeto y V = { v1, v2, . . .} un conjunto infinito <strong>de</strong> varia-<br />
bl<strong>es</strong> tal que A ∩ V = ∅.<br />
Definición 23<br />
Se llama “word equation” al par<br />
(L, R) ∈ (A ∪ Ω) ∗ × (A ∪ Ω) ∗<br />
don<strong>de</strong> Ω ⊆ V <strong>es</strong> un conjunto finito (<strong>de</strong> variabl<strong>es</strong>).<br />
Se <strong>de</strong>notará por L = R.<br />
Definición 24<br />
Se llama longitud <strong>de</strong> la ecuación E ≡ (L, R) al número dado por |E| = |L| + |R|.<br />
Nota 11<br />
Aunque V <strong>es</strong> un conjunto infinito <strong>de</strong> variabl<strong>es</strong>, en una ecuación E aparecen sólo un número<br />
finito <strong>de</strong> variabl<strong>es</strong> que, en genral, <strong>de</strong>notaremos por Ω = {x1, . . . , xn} ⊆ V.<br />
50
Definición 25<br />
Se llama sistema <strong>de</strong> “word equations” a cualquier conjunto <strong>de</strong> ecuacion<strong>es</strong><br />
{ L1 = R1, . . . , Lk = Rk}<br />
don<strong>de</strong> (Li, Ri) ∈ (A ∪ Ω) ∗ × (A ∪ Ω) ∗ para cada i = 1, . . . , k.<br />
Definición 26<br />
Un homomorfismo<br />
σ : (A ∪ Ω) ∗ −→ A ∗<br />
se dice solución <strong>de</strong> un sistema <strong>de</strong> “word equations” cuando <strong>de</strong>ja invariant<strong>es</strong> los elementos<br />
<strong>de</strong>l alfabeto A y a<strong>de</strong>más<br />
para todo i = 1, . . . , k.<br />
Definición 27<br />
σ(Li) = σ(Ri)<br />
Una solución σ <strong>de</strong> un sistema se dice mínimal si la suma <br />
|σ(x)| <strong>es</strong> mínima en el<br />
conjunto <strong>de</strong> longitu<strong>de</strong>s <strong>de</strong> las solucion<strong>es</strong>.<br />
Definición 28<br />
Dado un sistema <strong>de</strong> “word equations” sobre un alfabeto A, <strong>de</strong> conjunto <strong>de</strong> variabl<strong>es</strong><br />
Ω = {x1, . . . , xn}, se llama exponente <strong>de</strong> periodicidad <strong>de</strong> una solución σ al máximo<br />
x∈ Ω<br />
exponente <strong>de</strong> periodicidad <strong>de</strong> las ca<strong>de</strong>nas σ(xi) para i = 1, . . . , n.<br />
4.3. El Algoritmo <strong>de</strong> Makanin<br />
4.3.1. Repr<strong>es</strong>entación Gráfica<br />
Será muy importante compren<strong>de</strong>r la siguiente repr<strong>es</strong>entación <strong>de</strong> las “word equations”<br />
para justificar los conceptos utilizados en el algoritmo <strong>de</strong> Makanin, así como para enten<strong>de</strong>r<br />
su <strong>de</strong>sarrollo. Esta repr<strong>es</strong>entación <strong>es</strong> el punto <strong>de</strong> arranque <strong>de</strong> dicho algoritmo.<br />
Consi<strong>de</strong>ramos la ecuación<br />
xaby = ybax<br />
sobre el alfabeto A = {a, b} y don<strong>de</strong> x e y repr<strong>es</strong>entan las variabl<strong>es</strong>. Gráficamente, la<br />
ca<strong>de</strong>na xaby será repr<strong>es</strong>entada por<br />
51
x b<br />
a y<br />
siendo la longitud <strong>de</strong> las lineas horizontal<strong>es</strong> <strong>de</strong>sconocida en cada caso, excepto, las co-<br />
rr<strong>es</strong>pondient<strong>es</strong> a las constant<strong>es</strong> que son siempre <strong>de</strong> longitud uno. Las lineas vertical<strong>es</strong> se<br />
llamaran fronteras.<br />
La ecuación posee solución si existe una forma consistente <strong>de</strong> superponer ambos lados<br />
<strong>de</strong> la igualdad <strong>de</strong> manera que los trozos (repr<strong>es</strong>entados mediante segmentos horizontal<strong>es</strong>)<br />
entre las fronteras coincidan.<br />
dada<br />
En general, existen muchas posibilida<strong>de</strong>s para hacer las superposicion<strong>es</strong>. Para la ecuación<br />
xaby = ybax<br />
se tienen por ejemplo <strong>es</strong>tas dos posibilida<strong>de</strong>s, entre muchas otras,<br />
Nota 12<br />
x b<br />
a y<br />
y a<br />
b x<br />
x b<br />
y a<br />
a y<br />
b x<br />
Dibujamos los símbolos en distintos nivel<strong>es</strong> para <strong>de</strong>stacar las fronteras <strong>de</strong> cada uno.<br />
En la siguiente etapa, se eliminan los símbolos que coinci<strong>de</strong>n <strong>de</strong>s<strong>de</strong> la izquierda hasta<br />
la <strong>de</strong>recha. Por ejemplo, en la repr<strong>es</strong>entación<br />
x b<br />
a y<br />
y a<br />
b x<br />
52
po<strong>de</strong>mos reemplazar y = xa en el otro suc<strong>es</strong>o <strong>de</strong> y, para obtener<br />
b a<br />
x<br />
a<br />
b x<br />
=⇒<br />
b a<br />
x<br />
a<br />
b x<br />
=⇒ xa = ax<br />
La i<strong>de</strong>a básica <strong>de</strong>l funcionamiento <strong>de</strong>l algoritmo <strong>de</strong> Makanin <strong>es</strong> como sigue:<br />
1. Suponer un or<strong>de</strong>n <strong>de</strong> fronteras, <strong>es</strong> <strong>de</strong>cir, cuál viene primero, cuál <strong>es</strong> la segunda, . . .<br />
para todas las fronteras inicial<strong>es</strong> <strong>de</strong> ambos lados <strong>de</strong> la ecuación.<br />
2. Proce<strong>de</strong>r <strong>de</strong> izquierda a <strong>de</strong>recha reemplazando igualda<strong>de</strong>s por igualda<strong>de</strong>s.<br />
Sin embargo, <strong>es</strong>te ingenioso método tiene algunos inconvenient<strong>es</strong>:<br />
El número <strong>de</strong> vec<strong>es</strong> que aparece una variable pue<strong>de</strong> aumentar <strong>de</strong>spués <strong>de</strong>l reemplaza-<br />
miento.<br />
No siempre son evi<strong>de</strong>nt<strong>es</strong> los reemplazamientos. En el siguiente ejemplo,<br />
x b<br />
y a<br />
no existe un reemplazamiento evi<strong>de</strong>nte.<br />
a y<br />
b x<br />
Este proc<strong>es</strong>o pue<strong>de</strong> entrar en un bucle infinito. En uno <strong>de</strong> los ejemplos anterior<strong>es</strong>, se<br />
llega a ax = xa.<br />
53
Por <strong>es</strong>tos motivos <strong>es</strong> nec<strong>es</strong>ario un <strong>es</strong>tudio más elaborado <strong>de</strong> la repr<strong>es</strong>entación.<br />
Empezamos construyendo, para cada “word equation”, una repr<strong>es</strong>entación como la<br />
anterior. Es conveniente, para evitar que el número <strong>de</strong> ocurrencias <strong>de</strong> una variable aumente<br />
con los reemplazamientos, trabajar con un sistema equivalente <strong>de</strong> ecuacion<strong>es</strong> en el cual<br />
cada variable aparece no más <strong>de</strong> dos vec<strong>es</strong> en cada ecuación.<br />
Nota 13<br />
Siempre <strong>es</strong> posible pasar <strong>de</strong> un sistema <strong>de</strong> “word equations” dado a otro equivalente don<strong>de</strong><br />
todas las variabl<strong>es</strong> ocurren a lo sumo dos vec<strong>es</strong>.<br />
Ejemplo 25<br />
Sea la ecuación bxyx = yaxz.<br />
Las variabl<strong>es</strong> <strong>de</strong> <strong>es</strong>ta ecuación son<br />
Construimos el sistema equivalente<br />
x que ocurre tr<strong>es</strong> vec<strong>es</strong><br />
y que ocurre dos vec<strong>es</strong><br />
z que ocurre una vez<br />
bx1yx1 = yax2z<br />
x1 = x2<br />
para evitar que la variable x aparezca tr<strong>es</strong> vec<strong>es</strong>. Ahora, todas las variabl<strong>es</strong> suce<strong>de</strong>n no<br />
más <strong>de</strong> dos vec<strong>es</strong> en cada ecuación. Una posible repr<strong>es</strong>entación <strong>de</strong> <strong>es</strong>te sistema equivalente,<br />
con fronteras or<strong>de</strong>nadas, vendría dada como sigue:<br />
bx1yx1 = yax2z =⇒<br />
b y<br />
x1<br />
y x2<br />
x1<br />
a z<br />
x1 = x2 =⇒<br />
Notar que ambas ecuacion<strong>es</strong> pue<strong>de</strong>n ser repr<strong>es</strong>entada en la misma gráfica <strong>de</strong> la siguiente<br />
forma:<br />
54<br />
x1<br />
x2
y<br />
x1<br />
y x2<br />
x2<br />
x1<br />
a z<br />
1 2 3 4 5 6 7<br />
A<strong>de</strong>más, r<strong>es</strong>ulta conveniente tener exactamente dos copias <strong>de</strong> cada variable en la repre-<br />
sentación. En <strong>es</strong>te caso, tenemos que añadir una copia <strong>de</strong> la variable z. Así, la repre-<br />
sentación final <strong>de</strong>l sistema viene dada por<br />
b y<br />
x1<br />
y x2<br />
x2<br />
x1<br />
z<br />
a z<br />
1 2 3 4 5 6 7<br />
Esta repr<strong>es</strong>entación <strong>es</strong> el punto <strong>de</strong> arranque <strong>de</strong>l algoritmo <strong>de</strong> Makanin.<br />
4.3.2. Las Ecuacion<strong>es</strong> Generalizadas<br />
Introducimos los conceptos utilizados por Makanin [16, 13, 24] para po<strong>de</strong>r compren<strong>de</strong>r<br />
dicho algoritmo.<br />
Definición 29<br />
Sea (BD, ≤) un conjunto finito <strong>de</strong> números natural<strong>es</strong> que <strong>de</strong>nominaremos conjunto <strong>de</strong><br />
fronteras.<br />
Se llama base a una tupla<br />
bs = (t, (e1, . . . , en))<br />
don<strong>de</strong> n ≥ 2, t ∈ A ∪ Ω y Ebs = (e1, . . . , en) <strong>es</strong> una secuencia <strong>de</strong> fronteras or<strong>de</strong>nados por<br />
≤.<br />
BS <strong>de</strong>notará un conjunto finito <strong>de</strong> bas<strong>es</strong>.<br />
55
Definición 30<br />
Una base bs = (t, Ebs) ∈ BS se dice constante si t ∈ A. En otro caso, <strong>es</strong> <strong>de</strong>cir, si t ∈ Ω se<br />
dirá base variable.<br />
Definición 31<br />
Sea bs ∈ BS, cualquiera.<br />
Se llama frontera izquierda <strong>de</strong> la base bs al primer elemento en Ebs.<br />
Se <strong>de</strong>notará Izq(bs).<br />
Se llama frontera <strong>de</strong>recha <strong>de</strong> la base bs al último elemento en Ebs.<br />
Se <strong>de</strong>notará Der(bs).<br />
Nota 14<br />
Las letras i, j,. . . se usarán para <strong>de</strong>notar las fronteras.<br />
Ejemplo 26<br />
Sea BD = {1, 2, 3, 4, 5, 6}, A = {a, b} y Ω = {x, y, z}.<br />
Consi<strong>de</strong>ramos las bas<strong>es</strong><br />
bs1 = (a, (1, 3, 5, 7))<br />
bs2 = (y, (1, 2, 4, 6))<br />
R<strong>es</strong>ulta que bs1 <strong>es</strong> una base constante con Izq(bs1) = 1 y Der(bs1) = 7, mientras que bs2<br />
<strong>es</strong> una base variable con Izq(bs2) = 1 y Der(bs2) = 6.<br />
Definición 32<br />
Se llama ecuación generalizada (EG) a la tupla (A, Ω, BD, BS) tal que<br />
1. Para cada x ∈ Ω hay exactamente dos bas<strong>es</strong>, llamadas dual<strong>es</strong> y <strong>de</strong>notadas por x y<br />
¯x, r<strong>es</strong>pectivamente.<br />
A<strong>de</strong>más, las secuencias <strong>de</strong> fronteras asociadas, Ex y E¯x, <strong>de</strong>ben tener la misma lon-<br />
gitud.<br />
2. La secuencia <strong>de</strong> fronteras <strong>de</strong> cada base constante tiene exactamente dos elementos<br />
que son consecutivos en el or<strong>de</strong>n ≤.<br />
Ejemplo 27<br />
Sea A = {a, b} y Ω = {x, y}.<br />
Se tiene la siguiente ecuación generalizada:<br />
56
x y<br />
b a<br />
a b<br />
y x<br />
1 2 3 4 5 6 7<br />
siendo el conjunto <strong>de</strong> fronteras BD = {1, 2, 3, 4, 5, 6, 7} y el conjunto <strong>de</strong> bas<strong>es</strong><br />
BS = {(x, (1, 3)), (x, (5, 7)), (y, (4, 6)), (y, (2, 4)), (a, (3, 4)), (a, (4, 5)), (b, (6, 7)), (b, (1, 2))}.<br />
Definición 33<br />
Se llama columna <strong>de</strong> una EG a un par (i, j) <strong>de</strong> fronteras tal que i ≤ j.<br />
Para todo i, la columna (i, i) se dice vacía y la columna (i, i+1) se dice in<strong>de</strong>scomponible.<br />
Dada una base bs, cualquiera. Se <strong>de</strong>fine<br />
col(bs) = (Izq(bs), Der(bs))<br />
Por lo tanto, una base <strong>es</strong> vacía si su columna <strong>es</strong> vacía.<br />
Definición 34<br />
Una EG se dice que <strong>es</strong>tá r<strong>es</strong>uelta si todas sus bas<strong>es</strong> variabl<strong>es</strong> son vacías.<br />
Definición 35<br />
Se llama unificador <strong>de</strong> una EG a una función σ que asigna a cada columna in<strong>de</strong>scomponible<br />
<strong>de</strong> la EG una ca<strong>de</strong>na ω ∈ A ∪ Ω (extendida por concatenación a todas las columnas no<br />
vacías <strong>de</strong> la EG) verificando las siguient<strong>es</strong> propieda<strong>de</strong>s:<br />
1. Para cada base constante bs = (a, Ebs),<br />
σ(col(bs)) = a<br />
2. Para todo par <strong>de</strong> variabl<strong>es</strong> dual<strong>es</strong>, x y ¯x, y para todo elemento ej ∈ Ex,<br />
Nota 15<br />
En particular, σ(col(x)) = σ(col(¯x)).<br />
Si ej ∈ Ex entonc<strong>es</strong> ēj ∈ E¯x.<br />
σ(e1, ej) = σ(ē1, ēj)<br />
57
Veamos algunas <strong>de</strong> las propieda<strong>de</strong>s que verifica el unificador σ <strong>de</strong> una EG.<br />
Si σ(i, i + 1) <strong>es</strong> no vacío para todo i ∈ BD entonc<strong>es</strong> σ se dirá unificador <strong>es</strong>tricto.<br />
|σ(b1, bm)|, don<strong>de</strong> b1 y bm <strong>de</strong>notan el primer y último elemento <strong>de</strong> BD, r<strong>es</strong>pectiva-<br />
mente, <strong>es</strong> el índice <strong>de</strong>l unificador σ.<br />
El exponente <strong>de</strong> periocidad σ <strong>es</strong> el máximo exponente <strong>de</strong> periocidad <strong>de</strong> las ca<strong>de</strong>nas<br />
σ(col(x)), don<strong>de</strong> x <strong>es</strong> una variable base.<br />
Para compren<strong>de</strong>r la complejidad <strong>de</strong> r<strong>es</strong>olver las ecuacion<strong>es</strong> generalizadas, veremos<br />
que el problema <strong>de</strong> r<strong>es</strong>olución <strong>de</strong> sistemas <strong>de</strong> ecuacion<strong>es</strong> lineal<strong>es</strong> diofánticas, que <strong>es</strong> NP-<br />
completo, se reduce a r<strong>es</strong>olver una EG. Por lo tanto, encontrar solución <strong>de</strong> una EG <strong>es</strong> un<br />
problema NP duro.<br />
Definición 36<br />
Dada una EG.<br />
Para cada constante a ∈ A se <strong>de</strong>fine el sistema asociado <strong>de</strong> ecuacion<strong>es</strong> lineal<strong>es</strong> diofánticas,<br />
L(GE, a), dado <strong>de</strong> la siguiente forma:<br />
1. para cada columna in<strong>de</strong>scomponible (i, i+1) <strong>de</strong> la EG introducimos una variable zi.<br />
2. para cada par <strong>de</strong> bas<strong>es</strong> <strong>de</strong> variabl<strong>es</strong> dual<strong>es</strong><br />
construimos (n-1) ecuacion<strong>es</strong> dadas por<br />
<br />
ej≤i
Definición 37<br />
Una EG se dice que <strong>es</strong> admisible si su sistema asociado L(EG, a) <strong>es</strong> r<strong>es</strong>oluble para cada<br />
a ∈ A.<br />
Para finalizar <strong>es</strong>ta sección veremos que cualquier “word equation” se pue<strong>de</strong> <strong>es</strong>cribir<br />
como un conjunto finito <strong>de</strong> ecuacion<strong>es</strong> generalizadas.<br />
Lema 2<br />
Dada E una “word equation”, existe un algoritmo GEN que proporciona un conjunto finito<br />
<strong>de</strong> ecuacion<strong>es</strong> generalizadas GEN(E) verificando las siguient<strong>es</strong> propieda<strong>de</strong>s:<br />
1. E tiene un unificador con exponente <strong>de</strong> periocidad p sí y sólo si alguna EG ∈ GEN(E)<br />
posee un unificador <strong>es</strong>tricto con exponente <strong>de</strong> periocidad p.<br />
2. Para cada EG ∈ GEN(E), toda frontera <strong>es</strong> la frontera <strong>de</strong>recha o izquierda <strong>de</strong> una<br />
base.<br />
A<strong>de</strong>más, toda secuencia <strong>de</strong> fronteras contiene exactamente a <strong>es</strong>tas dos fronteras.<br />
3. Para cada EG ∈ GEN(E) el número <strong>de</strong> bas<strong>es</strong> <strong>de</strong> la EG no supera 2|E|.<br />
4. Toda EG ∈ GEN(E) <strong>es</strong> admisible.<br />
Ejemplo 28<br />
Sean A = {a, b} y Ω = {x, y, z}.<br />
La “word equation” E ≡ (bxyx, yaxz) tiene asociado el conjunto finito <strong>de</strong> ecuacion<strong>es</strong><br />
generalizadas GEN(E).<br />
Ant<strong>es</strong> <strong>de</strong> <strong>de</strong>terminar <strong>es</strong>te conjunto GEN(E) notar que <strong>es</strong> conveniente trabajar con un<br />
sistema equivalente <strong>de</strong> ecuacion<strong>es</strong> en el que cada variable ocurre no más <strong>de</strong> dos vec<strong>es</strong> en<br />
cada ecuación. Esto siempre <strong>es</strong> posible, basta con re<strong>de</strong>finir las variabl<strong>es</strong>.<br />
En <strong>es</strong>te caso, la ecuación E <strong>es</strong> equivalente al sistema<br />
bx1yx1 = yax2z<br />
x1 = x2<br />
don<strong>de</strong> cada variable ocurre a lo sumo dos vec<strong>es</strong>.<br />
Por lo tanto, una EG viene dada por<br />
A = {a, b}<br />
˜Ω = {x1, x2, y, z}<br />
59
BD = {1, . . . , 7}<br />
Gráficamente se repr<strong>es</strong>enta como sigue:<br />
BS = {(b, (1, 2)), (a, (3, 4)), (x1, (2, 3)), (x1, (5, 7)), (y, (3, 5)),<br />
(y, (1, 3)), (x2, (4, 6)), (x2(5, 7)), (z, (6, 7)), (z, (6, 7))}<br />
b y<br />
x1<br />
y x2<br />
x2<br />
x1<br />
z<br />
a z<br />
1 2 3 4 5 6 7<br />
4.3.3. EL Algoritmo <strong>de</strong> Transformación<br />
Como toda “word equation” E posee un conjunto <strong>de</strong> ecuacion<strong>es</strong> generalizadas GEN(E)<br />
equivalente, po<strong>de</strong>mos reducir nu<strong>es</strong>tro problema al <strong>es</strong>tudio <strong>de</strong> la r<strong>es</strong>olución <strong>de</strong> ecuacion<strong>es</strong><br />
generalizadas.<br />
Dada una EG la i<strong>de</strong>a <strong>de</strong>l algoritmo <strong>de</strong> transformación <strong>es</strong> ir reemplazando suc<strong>es</strong>iva-<br />
mente, <strong>de</strong> izquierda a <strong>de</strong>recha, las variabl<strong>es</strong> igual<strong>es</strong>. Se empieza con la variable situada<br />
más a la izquierda y más gran<strong>de</strong>, que se <strong>de</strong>nomina portadora, y se transporta toda su<br />
columna a la posición <strong>de</strong> su dual. Sin embargo, no siempre <strong>es</strong> posible mover todas las<br />
columnas sin per<strong>de</strong>r parte <strong>de</strong> la información <strong>es</strong>encial.<br />
Ejemplo 29<br />
Consi<strong>de</strong>ramos la repr<strong>es</strong>entación <strong>de</strong> la ecuación xaby = ybax dada por<br />
x b<br />
y a<br />
a y<br />
b x<br />
1 2 3 4 5 6 7 8<br />
60
El conjunto <strong>de</strong> bas<strong>es</strong> viene dado por<br />
BS = {(x, (1, 5)), (x, (4, 8)), (y, (7, 8)), (y, (1, 2)), (a, (5, 6)), (a, (3, 4)), (b, (2, 3)), (b, (6, 7))}<br />
Las variabl<strong>es</strong> situadas más a la izquierda son x e y, pero la más gran<strong>de</strong> <strong>es</strong> x. Así que,<br />
tomamos x como variable portadora y al intentar trasladar toda su columna, (1, 5), a<br />
la posición <strong>de</strong> su dual nos encontramos con dificulta<strong>de</strong>s en cuanto a la i<strong>de</strong>ntificación <strong>de</strong><br />
nuevas fronteras. Dichas dificulta<strong>de</strong>s motivan las siguient<strong>es</strong> <strong>de</strong>finicion<strong>es</strong>:<br />
Definición 38<br />
Se llama portadora <strong>de</strong> la EG a la base <strong>de</strong> variable no vacía con frontera izquierda más<br />
pequeña.<br />
Si hay más <strong>de</strong> una, se toma la que tiene mayor frontera <strong>de</strong>recha.<br />
Si todavía hay más <strong>de</strong> una candidata, se elige una al azar entre <strong>es</strong>tas.<br />
Se <strong>de</strong>notará por xc la portadora <strong>de</strong> la EG. Sus fronteras serán lc = Izq(xc) y rc = Der(xc).<br />
Se <strong>de</strong>fine la frontera crítica <strong>de</strong> la EG como sigue<br />
⎧<br />
⎨ min{Izq(y) : rc ∈ col(y)} si {Izq(y) : rc ∈ col(y)} = ∅<br />
cr =<br />
⎩<br />
si {Izq(y) : rc ∈ col(y)} = ∅<br />
Definición 39<br />
rc<br />
Dada bs una base cualquiera <strong>de</strong> EG tal que bs no <strong>es</strong> portadora.<br />
Se dice que bs <strong>es</strong> superfluo si col(bs) = (i, i) < lc.<br />
Se dice que bs <strong>es</strong> transporte si lc ≤ Izq(bs) < cr o bien col(bs) = (cr, cr).<br />
En otro caso, la base bs se dice fija.<br />
Nota 16<br />
Todas las bas<strong>es</strong> variabl<strong>es</strong> con Izq(x) < lc son vacias como consecuencia <strong>de</strong> la <strong>de</strong>finición<br />
<strong>de</strong> base portadora. A<strong>de</strong>más, cada base, excepto la portadora, <strong>es</strong> exactamente superflua,<br />
transporte o fija, <strong>de</strong>pendiendo <strong>de</strong> la región que ocupe por <strong>de</strong>bajo <strong>de</strong> su frontera <strong>de</strong>recha<br />
en el diagrama.<br />
b1 lc cr rc bm<br />
superfluo transporte<br />
(col(b1) < lc) (lc ≤ Izq(bs) < cr) fijo fijo<br />
61
Ejemplo 30<br />
1. En <strong>es</strong>te diagrama<br />
la variable portadora <strong>es</strong> y.<br />
x b<br />
a y<br />
y a<br />
b x<br />
1 2 3 4 5 6<br />
Para <strong>es</strong>ta variable, lc = 1 y rc = 3. Por lo tanto,<br />
{Izq(y) : rc ∈ col(y)} = {Izq(y) : 3 ∈ col(y)} = ∅ ⇒ cr = rc = 3,<br />
<strong>es</strong> <strong>de</strong>cir, la frontera crítica <strong>de</strong> <strong>es</strong>ta EG <strong>es</strong> cr = 3.<br />
2. En el siguiente diagrama<br />
la variable portadora <strong>es</strong> x.<br />
x b<br />
y a<br />
a y<br />
b x<br />
1 2 3 4 5 6 7 8<br />
Para <strong>es</strong>ta variable, lc = 1 y rc = 5. Por lo tanto,<br />
{Izq(y) : rc ∈ col(y)} = {Izq(y) : 5 ∈ col(y)} = {Izq(x) : 5 ∈ col(x) = (4, 8)} = 4<br />
<strong>es</strong> <strong>de</strong>cir, la frontera crítica <strong>de</strong> <strong>es</strong>ta EG <strong>es</strong> cr = 4.<br />
Hemos obtenido un método para <strong>de</strong>terminar las bas<strong>es</strong> que <strong>de</strong>beríamos mover, las bas<strong>es</strong><br />
transporte. Ahora, vamos a <strong>es</strong>tudiar hacía don<strong>de</strong> se <strong>de</strong>ben trasladar <strong>es</strong>tas bas<strong>es</strong>.<br />
Definición 40<br />
Se llama impr<strong>es</strong>ión <strong>de</strong> una EG a una or<strong>de</strong>nación lineal ≤ en el conjunto<br />
BD ∪ {i tr : i ∈ [lc, rc]}<br />
62
verificando las siguient<strong>es</strong> propieda<strong>de</strong>s:<br />
1. ≤ extien<strong>de</strong> el or<strong>de</strong>n <strong>de</strong> BD y a<strong>de</strong>más j tr < k tr para lc ≤ j < k ≤ rc.<br />
2. tr(Ec) = Ēc, <strong>es</strong> <strong>de</strong>cir, la <strong>es</strong>tructura <strong>de</strong> la portadora superpone a su dual.<br />
3. Si x <strong>es</strong> transporte y ¯x <strong>es</strong> fijo, entonc<strong>es</strong> se cumple<br />
e tr<br />
i = ēi para algún ei ∈ Ex ⇒ tr(Ex) = Ēx<br />
Es <strong>de</strong>cir, el or<strong>de</strong>n ≤ <strong>es</strong> consistente con la información <strong>de</strong> secuencias <strong>de</strong> fronteras.<br />
4. Si (c, (i, j)) <strong>es</strong> una base constante, entonc<strong>es</strong> i, j son consecutivos en el or<strong>de</strong>n ≤.<br />
Nota 17<br />
A<strong>de</strong>más, i tr y j tr tambien son consecutivos cuando i, j ∈ [lc, rc].<br />
Es <strong>de</strong>cir, las constant<strong>es</strong> se conservan.<br />
Para cada frontera i ∈ [lc, rc] <strong>de</strong>notamos por i tr al nuevo lugar que ocupa la frontera i tras<br />
el transporte. En general,<br />
tr(Ex) = tr(e1, · · · , en) = (e tr<br />
1 , · · · , e tr<br />
n )<br />
Una vez realizada la clasificación <strong>de</strong> las bas<strong>es</strong> y una impr<strong>es</strong>ión <strong>de</strong> la EG, <strong>es</strong> <strong>de</strong>cir, una<br />
guía <strong>de</strong> a don<strong>de</strong> vá cada frontera transportada, se <strong>de</strong>jan las bas<strong>es</strong> fijas (intactas) y se<br />
mueven todas las bas<strong>es</strong> transporte. De <strong>es</strong>ta forma <strong>es</strong>tamos reemplazando igualda<strong>de</strong>s por<br />
igualda<strong>de</strong>s <strong>de</strong> izquierda a <strong>de</strong>recha.<br />
Por lo tanto, el algoritmo <strong>de</strong> Makanin se guía mediante la variable portadora y su dual.<br />
Ejemplo 31<br />
Consi<strong>de</strong>ramos la siguiente EG:<br />
u<br />
xc<br />
¯y<br />
y<br />
¯xc<br />
1 2 3 4 5 6 7 8<br />
don<strong>de</strong> BS = {(u, (1, 3)), (ū, (6, 8)), (xc, (1, 5)), (¯xc, (5, 8)), (y, (3, 5, 7)), (¯y, (2, 4, 5))}<br />
63<br />
ū
xc <strong>es</strong> la variable portadora tal que lc = 1 y rc = 5.<br />
Calculamos la frontera crítica,<br />
Por lo tanto,<br />
u<br />
cr = min{Izq(y) : rc ∈ col(y)} = 3<br />
lc cr rc<br />
xc<br />
¯y<br />
y<br />
¯xc<br />
1 2 3 4 5 6 7 8<br />
Veamos como se transportan las variabl<strong>es</strong> transporte (ver [9]):<br />
Como cr < rc, entonc<strong>es</strong> xc y ¯xc se reducen <strong>de</strong> la siguiente forma,<br />
ū<br />
Ec = Ec ∩ {i ∈ BD : cr = 3 ≤ i} = {3, 4, 5}<br />
Ēc = Ēc ∩ {i ∈ BD : c tr<br />
r = 7 ≤ i} = {7, 8}<br />
Hemos obtenido las nuevas bas<strong>es</strong> <strong>de</strong> la variable portadora y <strong>de</strong> su dual.<br />
lc cr rc<br />
u<br />
¯y<br />
xc<br />
y<br />
ū<br />
¯xc<br />
1 2 3 4 5 6 7 8<br />
Recordar que si cr = rc entonc<strong>es</strong> Ec = tr(Ec), <strong>es</strong> <strong>de</strong>cir, en <strong>es</strong>te caso xc <strong>es</strong> transportada<br />
completamente.<br />
Estudiamos el comportamiento <strong>de</strong> las bas<strong>es</strong> transporte bs,<br />
Ec = Ec ∪ {i : i ∈ Ebs y cr = 3 < i} = {3, 4, 5} ∪ {4} = {3, 4, 5}<br />
Ēc = Ēc ∪ {i tr : i ∈ Ebs y cr < i} = {7, 8} ∪ {4 tr } = {7, 4 tr , 8}<br />
Hemos introducido una nueva frontera, 4 tr .<br />
Notar que 1 tr = 5 y 5 tr = 8.<br />
64
lc cr rc<br />
u<br />
¯y<br />
xc<br />
y<br />
ū<br />
¯xc<br />
1 2 3 4 5 6 7 4 tr 8<br />
Ya sólo queda por transportar u y ¯y. Como las variable y y su dual tienen un segmento<br />
en común, se pier<strong>de</strong> parte <strong>de</strong> la información al transportar ¯y. Teniendo en cuenta que<br />
obtenemos la gráfica<br />
lc cr rc<br />
xc<br />
y<br />
1 tr = 5, 2 tr = 6, 3 tr = 7<br />
u<br />
ū<br />
¯y<br />
¯xc<br />
1 2 3 4 5 6 7 4 tr 8<br />
Ahora, po<strong>de</strong>mos eliminar las fronteras inferior<strong>es</strong> a la frontera crítica.<br />
Definición 41 (El Árbol <strong>de</strong> Makanin)<br />
Dada E una “word equation”, se <strong>de</strong>fine recursivamente el árbol <strong>de</strong> Makanin T (E) asociado<br />
a E como sigue:<br />
1. La raiz <strong>de</strong> T (E) <strong>es</strong> E.<br />
2. Los hijos <strong>de</strong> E son GEN(E).<br />
3. Para cada nodo EG (distinto <strong>de</strong> la raiz), el conjunto <strong>de</strong> sus hijos <strong>es</strong> un número finito<br />
<strong>de</strong> ecuacion<strong>es</strong> generalizadas, T RANS(EG).<br />
65
Teorema 2<br />
Sea E una “word equation”.<br />
E tiene un unificador si y sólo si T (E) tiene un nodo etiquetado con una ecuación gener-<br />
alizada r<strong>es</strong>oluble.<br />
Este teorema proporciona el siguiente procedimiento <strong>de</strong> semi <strong>de</strong>cisión:<br />
Nota 18<br />
Examinar todos los nodos <strong>de</strong>l árbol T (E) para averiguar si E tiene solución.<br />
En general, el árbol <strong>de</strong> Makanin asociado a una “word equation” pue<strong>de</strong> ser infinito. Sin<br />
embargo <strong>es</strong>tá <strong>de</strong>mostrado que existe un número finito kE que acota el número <strong>de</strong> nodos<br />
que hay que visitar. Si no se encuentra solución tras la visita <strong>de</strong> dichos kE nodos, se pue<strong>de</strong><br />
concluir que no existe solución. kE <strong>es</strong> <strong>de</strong> carácter doblemente exponencial en la longitud<br />
<strong>de</strong> la ecuación E.<br />
4.4. Casos Particular<strong>es</strong> <strong>de</strong> <strong>Sistemas</strong> <strong>de</strong> <strong>“Word</strong> <strong>Equations”</strong><br />
Para finalizar <strong>es</strong>te capítulo vamos a exponer algunos r<strong>es</strong>ultados conocidos para casos<br />
particular <strong>de</strong> sistemas <strong>de</strong> “word equations”.<br />
Definición 42<br />
Un sistema <strong>de</strong> “word equations” se dice cuadrático si cada variable aparece a lo sumo dos<br />
vec<strong>es</strong> en el sistema.<br />
Hablaremos <strong>de</strong> sistemas cuadráticos para referirnos a los sistemas <strong>de</strong> “word equations” <strong>de</strong><br />
tipo cuadrático.<br />
El algoritmo más sencillo que los r<strong>es</strong>uelve usa un <strong>es</strong>pacio lineal no <strong>de</strong>terminístico. En la<br />
primera etapa se comprueba qué variabl<strong>es</strong> pue<strong>de</strong>n ser reemplazadas por la palabra vacía,<br />
<strong>de</strong> modo que po<strong>de</strong>mos suponer que las ecuacion<strong>es</strong> son <strong>de</strong> la forma<br />
don<strong>de</strong> y <strong>es</strong> una variable tal que x = y.<br />
x . . . = y . . .<br />
A<strong>de</strong>más, si asumimos que x <strong>es</strong> un prefijo <strong>de</strong> y po<strong>de</strong>mos reemplazar y (al menos dos ve-<br />
c<strong>es</strong>) por xy, y cancelar x en la parte izquierda <strong>de</strong> la primera ecuación. Ahora, comprobamos<br />
si y pue<strong>de</strong> ser sustituido por la palabra vacia, Λ.<br />
66
Repetimos el proc<strong>es</strong>o suc<strong>es</strong>ivamente.<br />
Aunque el tamaño <strong>de</strong>l sistema cuadrático nunca <strong>de</strong>crece, la longitud <strong>de</strong> una solución<br />
mínima <strong>de</strong>crece en cada etapa. Por lo tanto, el algoritmo no <strong>de</strong>terminístico encontrará una<br />
solución, si la hay.<br />
Teorema 3<br />
Sea |A| ≥ 2.<br />
El problema <strong>de</strong> <strong>de</strong>cidir la existencia <strong>de</strong> solución <strong>de</strong> una “word equation” cuadrática <strong>es</strong><br />
NP duro.<br />
Demostración 2<br />
Consi<strong>de</strong>ramos un problema 3 SAT dado por la función<br />
don<strong>de</strong> cada cláusula tiene la forma<br />
para la familia { ˜ Xj : j = 0, . . . , 3m − 1}.<br />
F = C0 ∧ · · · ∧ Cm−1<br />
Ci = ( ˜ X3i ∨ ˜ X3i+1 ∨ ˜ X3i+2)<br />
Sea V el conjunto <strong>de</strong> variabl<strong>es</strong> <strong>de</strong>l problema.<br />
Po<strong>de</strong>mos re<strong>es</strong>cribir <strong>es</strong>te problema como un sistema <strong>de</strong> “word equations” introduciendo<br />
nuevas variabl<strong>es</strong><br />
ci, di<br />
xj<br />
yv, zv<br />
para i = 0, . . . , m − 1<br />
para j = 0, . . . , 3m − 1<br />
para cada variable v ∈ V<br />
Tomamos las constant<strong>es</strong> a y b <strong>de</strong>l alfabeto A tal que a = b.<br />
Para cada cláusula Ci <strong>de</strong>finimos dos ecuacion<strong>es</strong>:<br />
cix3ix3i+1x3i+2 = a 3m<br />
cidi = a 3m−1<br />
Para cada v ∈ V consi<strong>de</strong>ramos el conjunto <strong>de</strong> posicion<strong>es</strong> {i1, . . . , ik} tal que<br />
v = ˜ Xi1 = · · · = ˜ Xik<br />
67
y el conjunto <strong>de</strong> posicion<strong>es</strong> {j1, . . . , jn} talque<br />
˜v = ˜ Xj1 = · · · = ˜ Xjn<br />
Suponemos que k ≤ n; el caso n ≤ k <strong>es</strong> simétrico.<br />
Para cada v <strong>de</strong>finimos dos nuevas ecuacion<strong>es</strong>:<br />
yvzv = b<br />
xi1 · · · xik yva n bxj1 · · · xjnzv = a n ba n b<br />
Por lo tanto, la fórmula F <strong>es</strong> satisfactible si y sólo si el sistema cuadrático<br />
tiene solución.<br />
cix3ix3i+1x3i+2 = a 3m<br />
cidi = a 3m−1<br />
yvzv = b<br />
xi1 · · · xik yva n bxj1 · · · xjnzv = a n ba n b<br />
Pero, cualquier sistema <strong>de</strong> k “word equations”, con k ≥ 1<br />
L1 = R1, . . . , Lk = Rk<br />
don<strong>de</strong> R1, . . . , Rk ∈ {a, b} ∗ , <strong>es</strong> equivalente a una ecuación <strong>de</strong> la forma<br />
siendo c una constante.<br />
L1c · · · Lk−1cLk = R1c · · · Rk−1cRk<br />
Luego, po<strong>de</strong>mos re<strong>es</strong>cribir el sistema cuadrático como una “word equation” sin más que<br />
aumentar el tamaño <strong>de</strong>l alfabeto en una constante. Incluso, po<strong>de</strong>mos eliminar <strong>es</strong>ta nueva<br />
constante c, sin incrementar el número <strong>de</strong> vec<strong>es</strong> que aparece cada variable <strong>de</strong>l sistema,<br />
codificando las tr<strong>es</strong> letras como aba, abba y abbba y reemplazando cada variable xi <strong>de</strong>l<br />
problema por axia.<br />
Por lo tanto, hemos reducido un problema 3 SAT , cualquiera, a una “word equation”<br />
cuadrática y sabemos que 3 SAT <strong>es</strong> NP completo, <strong>es</strong> <strong>de</strong>cir, hemos probado que el problema<br />
<strong>de</strong> existencia <strong>de</strong> solución <strong>de</strong> una “word equation” cuadrática sobre un alfabeto binario <strong>es</strong><br />
NP duro.<br />
68
D<strong>es</strong>tacar que <strong>es</strong> posible reducir un problema <strong>de</strong> tipo 3 SAT a un sistema <strong>de</strong> “word<br />
equations”, <strong>de</strong> forma análoga al <strong>es</strong>quema utilizado en la anterior <strong>de</strong>mostración.<br />
Proposición 2 Todo problema 3 SAT se reduce a un sistema <strong>de</strong> “word equations” sobre<br />
el alfabeto unario A = {1}.<br />
Demostración 3<br />
Consi<strong>de</strong>ramos un problema 3 SAT dado por la función<br />
don<strong>de</strong> cada cláusula tiene la forma<br />
F = C0 ∧ · · · ∧ Cm−1<br />
Ci = ˜ X3i ∨ ˜ X3i+1 ∨ ˜ X3i+2<br />
para la familia <strong>de</strong> literal<strong>es</strong> { ˜ Xj : j = 0, . . . , 3m − 1}.<br />
Sea V el conjunto <strong>de</strong> variabl<strong>es</strong> <strong>de</strong>l problema.<br />
Po<strong>de</strong>mos re<strong>es</strong>cribir <strong>es</strong>te problema como un sistema <strong>de</strong> “word equations” sobre el alfabeto<br />
unario A = {1} introduciendo nuevas variabl<strong>es</strong>:<br />
ci, di<br />
yv, zv<br />
Para cada v ∈ V <strong>de</strong>finimos la ecuación:<br />
para i = 0, . . . , m − 1<br />
para cada variable v ∈ V<br />
yvzv = 1<br />
Para cada cláusula Ci = ˜ X3i ∨ ˜ X3i+1 ∨ ˜ X3i+2 <strong>de</strong>finimos dos ecuacion<strong>es</strong>:<br />
don<strong>de</strong><br />
civ3iv3i+1v3i+2 = 111<br />
cidi = 11<br />
⎧<br />
⎨ yv si<br />
vj =<br />
⎩<br />
˜ Xj = v<br />
zv si ˜ Xj = ˜v<br />
En <strong>es</strong>tas condicion<strong>es</strong> se pue<strong>de</strong> ver que la fórmula F <strong>es</strong> satisfactible si y sólo si el sistema<br />
formado por las ecuacion<strong>es</strong><br />
civ3iv3i+1v3i+2 = 111<br />
69
cidi = 11<br />
yvzv = 1<br />
para i = 0, . . . , m − 1 y v ∈ V tiene solución.<br />
Por último, consi<strong>de</strong>ramos un problema particular <strong>de</strong> sistema <strong>de</strong> “word equations” que<br />
se obtiene al imponer r<strong>es</strong>triccion<strong>es</strong> en la longitud <strong>de</strong> las solucion<strong>es</strong>.<br />
Definición 43<br />
Dado un sistema S <strong>de</strong> n “word equations” sobre un alfabeto A y con variabl<strong>es</strong> en el<br />
conjunto Ω = {x1, . . . , xm}.<br />
Se llama l sistema <strong>de</strong> “word equations” al problema <strong>de</strong> <strong>de</strong>terminar si existe una solución<br />
<strong>de</strong> S<br />
tal que |σ(xi)| ≤ l, para cada i = 1, . . . , m.<br />
Esta problema se <strong>de</strong>notará por l SW ES.<br />
σ : (A ∪ Ω) ∗ −→ A ∗<br />
Proposición 3 El problema l SW ES <strong>es</strong> NP completo para l ≥ 2.<br />
Demostración 4<br />
Es fácil ver que l SW ES <strong>es</strong>tá en NP.<br />
Tomando como cota l = 2, se obtiene el r<strong>es</strong>ultado <strong>de</strong> forma análoga a como se probó la<br />
proposición 2, pero en <strong>es</strong>te caso se pue<strong>de</strong>n suprimir <strong>de</strong>l sistema equivalente a F las ecua-<br />
cion<strong>es</strong> <strong>de</strong> la forma cidi = 11 para cada i = 0, . . . , m − 1.<br />
En consecuencia 3 SAT se reduce ha 2 SW ES.<br />
Nota 19<br />
Nu<strong>es</strong>tro trabajo se centrará en la búsqueda <strong>de</strong> solución <strong>de</strong> los problemas l SW ES sobre<br />
el alfabeto binario A = {0, 1}.<br />
70
Capítulo 5<br />
Un Algoritmo Genético Simple<br />
para R<strong>es</strong>olver l SW ES<br />
5.1. Introducción<br />
Una vez <strong>es</strong>tudiado el problema <strong>de</strong> encontrar solución <strong>de</strong> un sistema <strong>de</strong> “word equations”<br />
y tras observar la enorme complejidad (triplemente exponencial) <strong>de</strong>l algoritmo <strong>de</strong> Makanin,<br />
intentaremos construir un algoritmo genético que proporcione una solución si existe.<br />
La motivación <strong>de</strong> <strong>es</strong>te trabajo son los buenos r<strong>es</strong>ultados que se han obtenido en la<br />
r<strong>es</strong>olución <strong>de</strong> los problemas SAT mediante el uso <strong>de</strong> los algoritmos evolutivos y el hecho<br />
<strong>de</strong> que los problemas SAT se reducen a sistemas <strong>de</strong> “word equations”, como hemos visto.<br />
Empezamos nu<strong>es</strong>tro trabajo diseñando un algoritmo genético simple con la <strong>es</strong>peranza<br />
<strong>de</strong> obtener r<strong>es</strong>ultados más o menos satisfactorios.<br />
5.2. Codificación <strong>de</strong> los Individuos<br />
Sea A = {0, 1} el alfabeto binario y Ω = {x1, . . . , xm} el conjunto <strong>de</strong> variabl<strong>es</strong> <strong>de</strong>l<br />
problema l SW ES formado por n “word equations”<br />
S = { L1 = R1, . . . , Ln = Rn}<br />
siendo l una cota para la longitud <strong>de</strong> las variabl<strong>es</strong>.<br />
Recordar que un homomorfismo σ <strong>es</strong> una solución candidata <strong>de</strong> S si |σ(xi)| ≤ l para<br />
cada i = 1, . . . , m. Por lo tanto, tenemos que codificar m variabl<strong>es</strong> como ca<strong>de</strong>nas <strong>de</strong><br />
71
longuitud menor o igual que l sobre el alfabeto A.<br />
Definimos un nuevo símbolo B, que llamaremos símbolo blanco, <strong>de</strong> modo que, todas las<br />
variabl<strong>es</strong> <strong>de</strong>l problema l SW ES se pue<strong>de</strong>n codificar como ca<strong>de</strong>nas <strong>de</strong> longitud exactamente<br />
igual a l sobre el nuevo alfabeto B = {0, 1, B} <strong>de</strong> la siguiente forma:<br />
para cada i = 1, . . . , m, sea αi la codificación <strong>de</strong> la variable xi sobre B, <strong>es</strong>ta codificación<br />
<strong>es</strong> una ca<strong>de</strong>na formada por símbolos <strong>de</strong> B que se lee <strong>de</strong> izquierda a <strong>de</strong>recha y cada vez que<br />
se encuentra el símbolo blanco B se pasa al siguiente símbolo sin hacer nada.<br />
Ejemplo 32<br />
Las ca<strong>de</strong>nas sobre B = {0, 1, B} dadas por<br />
se leen como<br />
α1 = 01BB0B011BBB<br />
α2 = BB01BB0BB0BB<br />
α3 = 111B11BB0<br />
β1 = 010011<br />
β2 = 0100<br />
β3 = 111110<br />
A<strong>de</strong>más, ca<strong>de</strong>nas distintas sobre el alfabeto B pue<strong>de</strong>n repr<strong>es</strong>entar la misma ca<strong>de</strong>na<br />
sobre el alfabeto A.<br />
Ejemplo 33<br />
Las siguient<strong>es</strong> ca<strong>de</strong>nas sobre B<br />
α1 = 01B011BBB<br />
α2 = B01BB0B1BB1<br />
α3 = 0101B1BB<br />
repr<strong>es</strong>entan la misma ca<strong>de</strong>na sobre A dada por<br />
α4 = BB0B1B0B1B1B<br />
01011<br />
Por lo tanto, una misma variable candidata a formar parte <strong>de</strong> la solución <strong>de</strong>l problema<br />
pue<strong>de</strong> tener distintas codificacion<strong>es</strong>. Así que, con el fin <strong>de</strong> unificar la codificación <strong>de</strong> las<br />
variabl<strong>es</strong> y para po<strong>de</strong>r simplificar los proc<strong>es</strong>os <strong>de</strong> cruce y mutación que <strong>es</strong>tudiaremos más<br />
72
tar<strong>de</strong>, reor<strong>de</strong>naremos <strong>de</strong> la siguiente forma las codificacion<strong>es</strong>:<br />
recorriendo <strong>de</strong> izquierda a <strong>de</strong>recha la codificación <strong>de</strong>splazamos los símbolos B al final <strong>de</strong><br />
la ca<strong>de</strong>na.<br />
Con <strong>es</strong>ta reor<strong>de</strong>nación conseguimos construir un repr<strong>es</strong>entante <strong>de</strong> todas las posibl<strong>es</strong><br />
codificacion<strong>es</strong> <strong>de</strong> una misma variable.<br />
Ejemplo 34<br />
Sea la codificación dada por<br />
tras la reor<strong>de</strong>nación obtenemos la ca<strong>de</strong>na<br />
0B10B00B1BB1B001<br />
0100011001BBBBBB<br />
que repr<strong>es</strong>enta todas las posibl<strong>es</strong> codificacion<strong>es</strong> <strong>de</strong> la variable 0100011001.<br />
Nota 20<br />
La ca<strong>de</strong>na formada sólo por símbolos blancos repr<strong>es</strong>enta la ca<strong>de</strong>na vacia, Λ.<br />
Una vez codificadas las variabl<strong>es</strong> <strong>de</strong>l problema, <strong>de</strong>finimos un individuo como la con-<br />
catenación <strong>de</strong> las ca<strong>de</strong>nas αi para i = 1, . . . , m que se obtienen al codificar las m variabl<strong>es</strong><br />
x1, . . . , xm.<br />
Ejemplo 35<br />
Supongamos que tenemos que codificar 4 variabl<strong>es</strong> <strong>de</strong> longitud menor o igual a 6 sobre el<br />
alfabeto binario A. Sean<br />
α1 = B01B10<br />
α2 = BB1BB0<br />
α3 = 11BB1B<br />
Lo primero que tenemos que hacer <strong>es</strong> reor<strong>de</strong>nar los símbolos, obteniendo<br />
α1 = 0110BB<br />
α2 = 10BBBB<br />
α3 = 111BBB<br />
Un individuo o solución candidata <strong>de</strong>l problema viene dada por la ca<strong>de</strong>na<br />
I = α1α2α3 = 0110BB 10BBBB 111BBB <br />
α1 α2 α3<br />
73
Nota 21<br />
No tiene sentido reor<strong>de</strong>nar las ca<strong>de</strong>nas que repr<strong>es</strong>entan individuos <strong>de</strong> la población, pu<strong>es</strong><br />
per<strong>de</strong>ríamos la información <strong>de</strong> las variabl<strong>es</strong> que componen <strong>es</strong>as posibl<strong>es</strong> solucion<strong>es</strong> <strong>de</strong>l<br />
problema.<br />
Para finalizar <strong>es</strong>ta sección, queremos <strong>de</strong>stacar que con <strong>es</strong>ta codificación <strong>de</strong> los indivi-<br />
duos conseguimos que todos tengan la misma longitud, m · l. A<strong>de</strong>más, todas las variabl<strong>es</strong><br />
son codificadas como ca<strong>de</strong>nas <strong>de</strong> longitud igual a l, aunque la longitud real <strong>de</strong> la variable<br />
que se repr<strong>es</strong>enta <strong>es</strong> menor o igual que l, pu<strong>es</strong> el símbolo B no aporta nada al valor <strong>de</strong> las<br />
variabl<strong>es</strong>. Por lo tanto, buscamos solucion<strong>es</strong> en un <strong>es</strong>pacio <strong>de</strong> búsqueda <strong>de</strong> tamaño<br />
<br />
l<br />
2 i<br />
m<br />
= (2 l+1 − 1) m<br />
5.3. Generación <strong>de</strong> la Población Inicial<br />
i=0<br />
Trabajaremos con poblacion<strong>es</strong> <strong>de</strong> tamaño fijo, tp. Aunque el algoritmo que diseñaremos<br />
permitirá al usuario elegir el tamaño <strong>de</strong> la población con el que quiere r<strong>es</strong>olver el problema,<br />
uno <strong>de</strong> nu<strong>es</strong>tro primeros objetivos será <strong>de</strong>terminar el tamaño <strong>de</strong> la población más a<strong>de</strong>cuado<br />
para la r<strong>es</strong>olución <strong>de</strong> los problemas l SW ES.<br />
Una vez fijado el tamaño tp, la población inicial será generada <strong>de</strong> forma aleatoria.<br />
Para la implementación <strong>de</strong> <strong>es</strong>te proc<strong>es</strong>o proponemos dos métodos.<br />
Método 1.<br />
Cada individuo <strong>de</strong> la población inicial se genera como sigue:<br />
para cada i = 1, . . . , m eligimos <strong>de</strong> forma aleatoria un número entre 0 y l, que <strong>de</strong>no-<br />
taremos por lr(i). D<strong>es</strong>pués, construimos aleatoriamente una ca<strong>de</strong>na βi <strong>de</strong> longitud<br />
lr(i) sobre el alfabeto A y una ca<strong>de</strong>na ¯ βi formada por el símbolo B <strong>de</strong> longitud igual<br />
a l − lr(i). La ca<strong>de</strong>na αi se obtiene como la concatenación <strong>de</strong> βi y ¯ βi.<br />
Finalmente, <strong>de</strong>finimos el individuo<br />
Ejemplo 36<br />
αi = βi ¯ βi<br />
I = α1 · · · αm<br />
Generamos una población <strong>de</strong> tamaño tp = 3 para r<strong>es</strong>olver un problema 4 SW ES<br />
con dos variabl<strong>es</strong>. (l = 4)<br />
74
Empezamos <strong>de</strong>finiendo el primer individuo <strong>de</strong> la población inicial, I1.<br />
Para i = 1 elegimos al azar la longitud <strong>de</strong> la subca<strong>de</strong>na β1, sea lr(1) = 2 ∈ {0, 1, . . . , 4}.<br />
Construimos aleatorimente β1 = 01. Definimos ¯ β1 = BB.<br />
Se obtiene la ca<strong>de</strong>na α1 = β1 ¯ β1 = 01BB.<br />
Para i = 2 elegimos al azar la longitud <strong>de</strong> la subca<strong>de</strong>na β2, sea lr(2) = 4 ∈ {0, 1, . . . , 4}.<br />
Construimos aleatoriamente β2 = 0110. Definimos ¯ β2 = Λ.<br />
Se obtiene la ca<strong>de</strong>na α2 = β2 ¯ β2 = 0110Λ = 0110.<br />
Por lo tanto, se tiene que<br />
I1 = α1α2 = 01BB0110<br />
Definimos ahora el segundo individuo <strong>de</strong> la población inicial, I2.<br />
Para i = 1 elegimos al azar la longitud <strong>de</strong> la subca<strong>de</strong>na β1, sea lr(1) = 1 ∈ {0, 1, . . . , 4}.<br />
Construimos aleatoriamente β1 = 1. Definimos ¯ β1 = BBB.<br />
Se obtiene la ca<strong>de</strong>na α1 = β1 ¯ β1 = 1BBB.<br />
Para i = 2 elegimos al azar la longitud <strong>de</strong> la subca<strong>de</strong>na β2, sea lr(2) = 0 ∈ {0, 1, . . . , 4}.<br />
Construimos aleatoriamente β2 = Λ. Definimos ¯ β2 = BBBB.<br />
Se obtiene la ca<strong>de</strong>na α2 = β2 ¯ β2 = ΛBBBB = BBBB.<br />
Por lo tanto, se tiene que<br />
I2 = α1α2 = 1BBBBBBB<br />
Finalmente, generamos el último individuo, I3.<br />
Para i = 1 elegimos al azar la longitud <strong>de</strong> la subca<strong>de</strong>na β1, sea lr(1) = 3 ∈ {0, 1, . . . , 4}.<br />
Construimos aleatoriamente β1 = 101. Definimos ¯ β1 = B.<br />
Se obtiene la ca<strong>de</strong>na α1 = β1 ¯ β1 = 101B.<br />
Para i = 2 elegimos al azar la longitud <strong>de</strong> la subca<strong>de</strong>na β2, sea lr(2) = 3 ∈ {0, 1, . . . , 4}.<br />
Construimos aleatoriamente β2 = 111. Definimos ¯ β2 = B.<br />
Se obtiene la ca<strong>de</strong>na α2 = β2 ¯ β2 = 111B.<br />
Por lo tanto, se tiene que<br />
I3 = α1α2 = 101B111B<br />
De <strong>es</strong>ta forma, hemos generado al azar una población inicial <strong>de</strong> tamaño tp = 3.<br />
Método 2.<br />
Cada individuo <strong>de</strong> la población inicial se genera como sigue:<br />
para cada i = 1, . . . , m construimos al azar una ca<strong>de</strong>na αi <strong>de</strong> longitud l sobre el<br />
75
alfabeto B y luego reor<strong>de</strong>namos dicha ca<strong>de</strong>na para que todos los símbolos blancos<br />
<strong>es</strong>tén situados al final <strong>de</strong> la misma. Finalmente, <strong>de</strong>finimos el individuo<br />
Ejemplo 37<br />
I = α1 · · · αm<br />
Generamos una población <strong>de</strong> tamaño tp = 3 para r<strong>es</strong>olver un problema 4 SW ES<br />
con dos variabl<strong>es</strong>. (l = 4)<br />
Empezamos <strong>de</strong>finiendo el primer individuo <strong>de</strong> la población inicial, I1.<br />
Para i = 1 construimos aleatorimente la ca<strong>de</strong>na α1 = B1B0, <strong>de</strong>spués <strong>de</strong> la reor<strong>de</strong>-<br />
nación se tiene que α1 = 10BB.<br />
Para i = 2 construimos aleatoriamente la ca<strong>de</strong>na α2 = BB1B, <strong>de</strong>spués <strong>de</strong> la reor<strong>de</strong>-<br />
nación se tiene que α2 = 1BBB.<br />
Por lo tanto,<br />
I1 = α1α2 = 10BB1BBB<br />
Definimos ahora el segundo individuo <strong>de</strong> la población inicial, I2.<br />
Para i = 1 construimos aleatorimente la ca<strong>de</strong>na α1 = 1BB1, <strong>de</strong>spués <strong>de</strong> la reor<strong>de</strong>-<br />
nación se tiene que α1 = 11BB.<br />
Para i = 2 construimos aleatoriamente la ca<strong>de</strong>na α2 = 0B01, <strong>de</strong>spués <strong>de</strong> la reor<strong>de</strong>-<br />
nación se tiene que α2 = 001B.<br />
Por lo tanto,<br />
I1 = α1α2 = 11BB001B<br />
Finalmente, generamos el último individuo, I3.<br />
Para i = 1 construimos aleatorimente la ca<strong>de</strong>na α1 = 0000, <strong>de</strong>spués <strong>de</strong> la reor<strong>de</strong>-<br />
nación se tiene que α1 = 0000.<br />
Para i = 2 construimos aleatoriamente la ca<strong>de</strong>na α2 = BBBB, <strong>de</strong>spués <strong>de</strong> la reor-<br />
<strong>de</strong>nación se tiene que α2 = BBBB.<br />
Por lo tanto,<br />
I1 = α1α2 = 0000BBBB<br />
De <strong>es</strong>ta forma, hemos generado al azar una población inicial <strong>de</strong> tamaño tp = 3.<br />
76
5.4. Evaluación <strong>de</strong> los Individuos<br />
Este <strong>es</strong> un paso muy importante en el diseño <strong>de</strong>l algoritmo genético, pu<strong>es</strong> tenemos<br />
que encontrar una función fitn<strong>es</strong>s sencilla, <strong>es</strong> <strong>de</strong>cir, con poco coste a la hora <strong>de</strong> evaluar<br />
los individuos, y que al mismo tiempo nos permita guiar el proc<strong>es</strong>o <strong>de</strong> búsqueda <strong>de</strong> las<br />
solucion<strong>es</strong> <strong>de</strong> la forma más eficiente posible.<br />
Un individuo I = α1 · · · αm <strong>es</strong> solución <strong>de</strong>l problema l SW ES si al sustituir las sub-<br />
ca<strong>de</strong>nas αi por las variabl<strong>es</strong> xi, para i = 1, . . . , m, en el sistema <strong>de</strong> “word equations” se<br />
obtienen i<strong>de</strong>ntida<strong>de</strong>s.<br />
Ejemplo 38<br />
Consi<strong>de</strong>ramos el problema 3 SW ES dado por el sistema<br />
01x11 = x21x1<br />
x101x2 = 10x21<br />
Generamos una población <strong>de</strong> tamaño tp = 2 dada por<br />
I1 = 11B01B<br />
I2 = 1BB01B<br />
Veamos si alguno <strong>de</strong> los individuos <strong>de</strong> <strong>es</strong>ta población <strong>es</strong> solución <strong>de</strong>l problema. Empezamos<br />
sustituyendo el individuo I1.<br />
Como,<br />
r<strong>es</strong>ulta que<br />
Es <strong>de</strong>cir, I1 no <strong>es</strong> solución.<br />
I1 = 11B01B ✲<br />
Ahora, comprobamos si I2 <strong>es</strong> solución.<br />
Como,<br />
α1 = 11B ✲ x1 = 11<br />
α2 = 01B ✲ x2 = 01<br />
01x11 = x21x1 ✲ 01111 = 01111<br />
x101x2 = 10x21 ✲ 110101 = 10011<br />
I2 = 1BB01B ✲<br />
α1 = 1BB ✲ x1 = 1<br />
α2 = 01B ✲ x2 = 01<br />
77
<strong>es</strong>ulta que<br />
I2 tampoco <strong>es</strong> solución.<br />
01x11 = x21x1 ✲ 0111 = 0111<br />
x101x2 = 10x21 ✲ 10101 = 10011<br />
Observamos que aunque ninguno <strong>de</strong> los dos individuos <strong>de</strong> la población son solución, ambos<br />
hacen que se verifique la primera <strong>de</strong> las ecuacion<strong>es</strong> <strong>de</strong>l sistema. Sin embargo, parece <strong>es</strong>tar<br />
más proximo a la solución el individuo I2 pu<strong>es</strong> sólo dos símbolos <strong>de</strong> la segunda ecuación<br />
<strong>de</strong>l sistema no coinci<strong>de</strong>n.<br />
Este ejemplo, nos sugiere <strong>de</strong>finir el fitn<strong>es</strong>s asociado a un individuo como el número<br />
<strong>de</strong> símbolos que no coinci<strong>de</strong>n al sustituir dicho individuo en el sistema. De <strong>es</strong>ta forma,<br />
nu<strong>es</strong>tro objetivo será minimizar el valor <strong>de</strong> la función fitn<strong>es</strong>s, <strong>es</strong> <strong>de</strong>cir, conseguir que nigún<br />
símbolo sea distinto <strong>de</strong>l corr<strong>es</strong>pondiente situado en el otro lado <strong>de</strong> la ecuación.<br />
Definición 44<br />
Sea S = {L1 = R1, . . . , Ln = Rn} un l SW ES.<br />
Se <strong>de</strong>fine el fitn<strong>es</strong>s asociado a un individuo I como el valor dado por<br />
n<br />
f(I) = (max{lk, rk} − ck)<br />
k=1<br />
siendo lk = |Lk(I)|, rk = |Rk(I)| y ck el número <strong>de</strong> símbolos que coinci<strong>de</strong>n al sustituir el<br />
individuo I en la k ecuación <strong>de</strong>l sistema, para cada k = 1, . . . , n.<br />
Nota 22<br />
Al sustituir en cada ecuación Lk = Rk el individuo I, obtenemos dos ca<strong>de</strong>nas Lk(I) y<br />
Rk(I) sobre el alfabeto A cuyas longitu<strong>de</strong>s hemos <strong>de</strong>notado por lk y rk, r<strong>es</strong>pectivamente.<br />
El individuo I será solución <strong>de</strong>l sistema si Lk(I) = Rk(I) para cada k = 1, . . . , n.<br />
Ejemplo 39<br />
Volviendo al sistema <strong>de</strong>l anterior ejemplo<br />
Teníamos una población dada por<br />
01x11 = x21x1<br />
x101x2 = 10x21<br />
I1 = 11B01B<br />
I2 = 1BB01B<br />
78
Veamos quien <strong>es</strong> el fitn<strong>es</strong>s asociado a cada uno <strong>de</strong> <strong>es</strong>tos individuos:<br />
Al sustituir I1 en el sistema se obtiene<br />
L1(I1) = 01111 con l1 = 5<br />
R1(I1) = 01111 con r1 = 5<br />
L2(I1) = 110101 con l2 = 6<br />
R2(I1) = 10011 con r2 = 5<br />
Como L1(I1) = R1(I1), todos los símbolos <strong>de</strong>l lado izquierdo <strong>de</strong> la ecuación coinci<strong>de</strong>n con<br />
los <strong>de</strong>l lado <strong>de</strong>recho, por lo tanto, c1 = 5. Luego, f1(I1) = max{l1, r1} − c1 = 5 − 5 = 0.<br />
En la segunda ecuación r<strong>es</strong>ulta que L2(I1) = R2(I1). Contamos los símbolos que ocupando<br />
la misma posición en ambas ca<strong>de</strong>nas coinci<strong>de</strong>n.<br />
L2(I1) = 1 1 01 01<br />
R2(I1) = 1 0 01 1<br />
Se obtiene que c2 = 3. Luego, f2(I1) = max{l2, r2} − c2 = max{6, 5} − 3 = 6 − 3 = 3.<br />
Por lo tanto,<br />
f(I1) =<br />
2<br />
fk(I1) =<br />
k=1<br />
Al sustituir I2 en el sistema se obtiene<br />
2<br />
(max{lk, rk} − ck) = 0 + 3 = 3<br />
k=1<br />
L1(I2) = 0111 con l1 = 4<br />
R1(I2) = 0111 con r1 = 4<br />
L2(I2) = 10101 con l2 = 5<br />
R2(I2) = 10011 con r2 = 5<br />
Como L1(I2) = R1(I2) todos los símbolos <strong>de</strong>l lado izquierdo <strong>de</strong> la ecuación coinci<strong>de</strong>n con<br />
los <strong>de</strong>l lado <strong>de</strong>recho, por lo tanto, c1 = 4. Luego, f1(I2) = max{l1, r1} − c4 = 4 − 4 = 0.<br />
En la segunda ecuación r<strong>es</strong>ulta que L2(I2) = R2(I1). Contamos los símbolos que ocupando<br />
la misma posición en ambas ca<strong>de</strong>nas coinci<strong>de</strong>n.<br />
L2(I2) = 10 10 1<br />
R2(I2) = 10 01 1<br />
79
Se obtiene que c2 = 3. Luego, f2(I2) = max{l2, r2} − c2 = max{5, 5} − 3 = 5 − 3 = 2.<br />
Por lo tanto,<br />
f(I2) =<br />
2<br />
fk(I2) =<br />
k=1<br />
2<br />
(max{lk, rk} − ck) = 0 + 2 = 2<br />
k=1<br />
Como el fitn<strong>es</strong>s asociado a I2 <strong>es</strong> menor que el asociado a I1 po<strong>de</strong>mos concluir que <strong>es</strong> mejor<br />
candidata a solución la ca<strong>de</strong>na I2.<br />
Nota 23<br />
Cuando sustituimos un individuo en una ecuación obtenemos dos ca<strong>de</strong>nas sobre el alfabeto<br />
A, las corr<strong>es</strong>pondient<strong>es</strong> al lado <strong>de</strong>recho e izquierdo <strong>de</strong> la ecuación, que no tienen por que<br />
tener la misma longitud. Una condición nec<strong>es</strong>aria para que ambas ca<strong>de</strong>nas coincidan <strong>es</strong><br />
que tengan la misma longitud, por <strong>es</strong>o a la hora <strong>de</strong> calcular el fitn<strong>es</strong>s no sólo contamos<br />
los símbolos que ocupando las mismas posicion<strong>es</strong> en ambas ca<strong>de</strong>nas no coinci<strong>de</strong>n sino que<br />
también contamos los símbolos que hacen que una ca<strong>de</strong>na tenga mayor longitud, <strong>es</strong> <strong>de</strong>cir,<br />
los símbolos situados entre la posición min{lk, rk} + 1 y max{lk, rk}.<br />
5.5. Los Operador<strong>es</strong> Genéticos<br />
Selección<br />
Usaremos un criterio <strong>de</strong> selección elitista que mantiene en la población al mejor<br />
individuo alcanzado hasta <strong>es</strong>e momento. A<strong>de</strong>más, la selección <strong>de</strong> los individuos que<br />
darán lugar a una nueva población se hará <strong>de</strong> acuerdo al fitn<strong>es</strong>s asociado mediante<br />
el método <strong>de</strong> la ruleta. En <strong>es</strong>te caso, preten<strong>de</strong>mos minizar la función fitn<strong>es</strong>s, por lo<br />
que los individuos con un fitn<strong>es</strong>s más pequeño son los que mayor probabilidad tiene<br />
<strong>de</strong> contribuir en la siguinte población.<br />
La probabilidad <strong>de</strong> contribuir en la siguiente población viene dada por<br />
P(i) =<br />
para cada individuo i = 1, . . . , tp.<br />
Ejemplo 40<br />
tp<br />
j=1<br />
tp<br />
tp<br />
l=1<br />
(<br />
j=1<br />
f(j) − f(i)<br />
f(j) − f(l))<br />
Supongamos que tenemos una población <strong>de</strong> tamaño tp = 4 y hemos evaluado los<br />
individuos obteniendo la siguiente tabla<br />
80
Cruce<br />
Individuo fitn<strong>es</strong>s<br />
I1<br />
I2<br />
I3<br />
I4<br />
Es evi<strong>de</strong>nte que el individuo con mayor probabilidad <strong>de</strong> contribuir en la siguiente<br />
generación <strong>es</strong> I1. Luego, la probabilidad <strong>de</strong> contribuir en la siguiente población <strong>es</strong><br />
inversamente proporcional al fitn<strong>es</strong>s.<br />
Construimos una ruleta <strong>de</strong> la siguiente forma:<br />
sea sum la suma <strong>de</strong> los fitn<strong>es</strong>s <strong>de</strong> la población,<br />
sum =<br />
2<br />
12<br />
5<br />
7<br />
4<br />
f(Ii)<br />
i=1<br />
<strong>de</strong>finimos para cada individuo un nuevo fitn<strong>es</strong>s dado por<br />
f(Ii) = sum − f(Ii)<br />
Ahora, la probabilidad <strong>de</strong> que un individuo contribuya en la siguiente población <strong>es</strong><br />
directamente proporcional al nuevo fitn<strong>es</strong>s. En <strong>es</strong>te ejemplo,<br />
Para cada par <strong>de</strong> individuos<br />
sum = 2 + 12 + 5 + 7 = 26<br />
Individuo fitn<strong>es</strong>s <br />
fitn<strong>es</strong>s f(Ii)/ 4<br />
j=1 f(Ij)<br />
I1 2 24 24/78 = 0,31<br />
I2 12 14 14/78 = 0,18<br />
I3 5 21 21/78 = 0,27<br />
I4 7 19 19/78 = 0,24<br />
I1 = α 1 1 · · · α1 m<br />
I2 = α 2 1 · · · α2 m<br />
se <strong>de</strong>fine el operador <strong>de</strong> cruce como un proc<strong>es</strong>o que cruza cada subca<strong>de</strong>na α 1 i = β1 i ¯ β 1 i<br />
con la subca<strong>de</strong>na α2 i = β2 i ¯ β2 i , para i = 1, . . . , m, en dos etapas, obteniendose un<br />
81
nuevo individuo.<br />
Recordar que cada subca<strong>de</strong>na αi sobre el alfabeto B = {0, 1, B} <strong>es</strong>tá formada por<br />
dos subca<strong>de</strong>nas βi y ¯ βi siendo βi una ca<strong>de</strong>na <strong>de</strong> longitud menor o igual que l sobre<br />
el alfabeto A = {0, 1} y ¯ βi una ca<strong>de</strong>na <strong>de</strong> símbolos blancos.<br />
En la primera etapa, se aplica un cruce uniforme como sigue:<br />
1. Se calcula la posición k = min{|β 1 i |, |β2 i |}<br />
2. Para cada j = 1, . . . , k elijo con probabilidad p el símbolo que ocupa la posición<br />
j ésima <strong>de</strong> α1 i y con probabilidad 1 − p tomamos el <strong>de</strong> la subca<strong>de</strong>na α2 i , <strong>es</strong>te<br />
símbolo pasa a ocupar la posición j ésima <strong>de</strong> la subca<strong>de</strong>na αi en el nuevo<br />
individuo, <strong>es</strong> <strong>de</strong>cir, <strong>es</strong>tamos aplicando un cruce uniforme a las ca<strong>de</strong>nas α1 i (1, k)<br />
y α2 i (1, k).<br />
En nu<strong>es</strong>tro algoritmo tomaremos p = 0,5.<br />
Ejemplo 41<br />
Vamos a aplicar la primera etapa <strong>de</strong>l cruce a las subca<strong>de</strong>nas<br />
Calculamos la posición<br />
α 1 i<br />
α 2 i<br />
= 011101 BB<br />
<br />
β 1 i<br />
<br />
¯β 1 i<br />
= 1101 BBBB<br />
<br />
β 2 i<br />
<br />
¯β 2 i<br />
k = min{|β 1 i |, |β 2 i |} = min{6, 4} = 4<br />
Por lo tanto, aplicamos un cruce uniforme a las ca<strong>de</strong>na<br />
Obteniendo, por ejemplo, la ca<strong>de</strong>na<br />
α1 i (1, 4) = 0111<br />
α2 i (1, 4) = 1101<br />
αi(1, 4) = 0101<br />
En la segunda etapa, aplicamos un cruce en un punto como sigue:<br />
1. Elegimos una posición q ∈ {k, . . . , l}, siendo l la longitud <strong>de</strong> las ca<strong>de</strong>nas α 1 i y<br />
α2 i , para i = 1, . . . , m.<br />
82
2. Si una <strong>de</strong> las dos ca<strong>de</strong>nas α1 i (k + 1, l) ó α2 i (k + 1, l) contiene algun símbolo<br />
Nota 24<br />
Mutación<br />
distinto <strong>de</strong> B, <strong>de</strong>finimos αi(k + 1, q) con las q − k primeras posicion<strong>es</strong> <strong>de</strong> <strong>es</strong>a<br />
ca<strong>de</strong>na y completamos la subca<strong>de</strong>na αi con l − q símbolos blancos, <strong>es</strong> <strong>de</strong>cir,<br />
αi(q + 1, l) = B l−q .<br />
En otro caso, se <strong>de</strong>fine αi(k + 1, l) = B l−k<br />
Si q = k entonc<strong>es</strong> αi = (k + 1, l) = B l−k<br />
Ejemplo 42<br />
En el ejemplo anterior aplicamos la primera etapa <strong>de</strong>l cruce a las subca<strong>de</strong>nas<br />
α 1 i<br />
α 2 i<br />
= 011101BB<br />
= 1101BBBB<br />
Obtuvimos αi(1, 4) = 0101. Ahora aplicamos la segunda etapa <strong>de</strong>l cruce para <strong>de</strong>finir<br />
αi(5, 8). Para ello, tenemos que eligir una posición entre 4 y 8, sea q = 7.<br />
Como α 1 i (5, 8) = 01BB tiene símbolos distintos <strong>de</strong>l blanco, <strong>de</strong>finimos αi(k+1, q) = αi(5, 7)<br />
con los q − k = 3 primeros símbolos <strong>de</strong> α 1 i (5, 8) = 01BB, <strong>es</strong> <strong>de</strong>cir, αi(5, 7) = 01B.<br />
Finalmente, completamos la ca<strong>de</strong>na αi con l − q = 1 símbolos blancos.<br />
Hemos construido la subca<strong>de</strong>na<br />
αi = 010101BB<br />
Repitiendo <strong>es</strong>te proc<strong>es</strong>o para cada par <strong>de</strong> subca<strong>de</strong>nas α 1 i y α2 i<br />
un nuevo individuo a partir <strong>de</strong> los individuos I1 e I2.<br />
conseguimos <strong>de</strong>finir<br />
Cada individuo <strong>de</strong> la población será mutado con probabilidad p, fijada. La prob-<br />
abilidad <strong>de</strong> mutación será otro <strong>de</strong> los datos que el usuario fija para r<strong>es</strong>olver los<br />
problemas. En nu<strong>es</strong>tro caso, buscaremos la probabilidad <strong>de</strong> mutación más a<strong>de</strong>cuada<br />
para r<strong>es</strong>olver los problemas l SW ES.<br />
Si un individuo I = α1 · · · αm <strong>es</strong> seleccionado para la mutación, entonc<strong>es</strong> se aplica un<br />
proc<strong>es</strong>o <strong>de</strong> mutación a cada subca<strong>de</strong>na αi = βi ¯ βi <strong>de</strong> la siguiente forma: cada símbolo<br />
<strong>de</strong> la subca<strong>de</strong>na αi cambia con probabilidad 1<br />
l , siendo l la longitud <strong>de</strong> la subca<strong>de</strong>na<br />
αi.<br />
83
Recordar que la subca<strong>de</strong>na αi toma valor<strong>es</strong> en el alfabeto B. Así pu<strong>es</strong>, tras el proc<strong>es</strong>o<br />
<strong>de</strong> mutación <strong>es</strong> nec<strong>es</strong>ario reor<strong>de</strong>nar <strong>de</strong> nuevo para situar los símbolos blancos al final.<br />
Hemos <strong>de</strong>finido todas los elementos nec<strong>es</strong>arios para el diseño <strong>de</strong>l algoritmo genético<br />
simple. En el apendice A se encuentra el código <strong>de</strong> <strong>es</strong>te algoritmo <strong>es</strong>crito en el lenguaje<br />
C++.<br />
Veamos con un sencillo ejemplo su funcionamiento.<br />
Ejemplo 43<br />
Consi<strong>de</strong>ramos el problema 3 SW ES dado por las ecuacion<strong>es</strong><br />
Codificación <strong>de</strong> los individuos<br />
x2x1 = 10x2<br />
x210x1 = 1x10x1<br />
Cada individuo se obtiene como la concatenación <strong>de</strong> dos ca<strong>de</strong>nas <strong>de</strong> longitud l = 3<br />
sobre el alfabeto B.<br />
Población inicial<br />
Trabajaremos con poblacion<strong>es</strong> <strong>de</strong> tamaño tp = 4.<br />
La población inicial será generada usando el método 2.<br />
Usaremos el fitn<strong>es</strong>s y los operador<strong>es</strong> genéticos que acabamos <strong>de</strong> <strong>de</strong>finir.<br />
Empezamos a r<strong>es</strong>olver el problema ejecutando el algoritmo genético simple así diseñado.<br />
Generamos la población inicial:<br />
α1 1 = 0B1 ✲ α1 1 = 01B<br />
α1 2 = B11 ✲ α1 2 = 11B<br />
α2 1 = 011 ✲ α2 1 = 011<br />
α2 2 = B1B ✲ α2 2 = 1BB<br />
α3 1 = 101 ✲ α3 1 = 101<br />
α3 2 = BB0 ✲ α3 2 = 0BB<br />
84<br />
✲<br />
✲<br />
✲<br />
I 0 1<br />
I 0 2<br />
I 0 3<br />
= 01B11B<br />
= 0111BB<br />
= 1010BB
α4 1 = BB1 ✲ α4 1 = 1BB<br />
α4 2 = 1B0 ✲ α4 2 = 10B<br />
Obtenemos la pobalción inicial P0 dada por los individuos:<br />
Evaluamos la población inicial:<br />
x210x1 = 1x10x1<br />
x2x1 = 10x2<br />
x210x1 = 1x10x1<br />
x2x1 = 10x2<br />
x210x1 = 1x10x1<br />
x2x1 = 10x2<br />
x210x1 = 1x10x1<br />
x2x1 = 10x2<br />
I 0 1<br />
I 0 2<br />
I 0 3<br />
I 0 4<br />
= 01B11B<br />
= 0111BB<br />
= 1010BB<br />
= 1BB10B<br />
✲<br />
I0 1 1101 = 1011<br />
✲<br />
✲<br />
I0 1 111001 = 101001<br />
✲<br />
I0 2 110011 = 10110011<br />
✲<br />
I0 2 1011 = 101<br />
✲<br />
I0 3 010101 = 11010101<br />
✲<br />
I0 3 0101 = 100<br />
✲<br />
I0 4 10101 = 1101<br />
✲<br />
I0 4 101 = 1010<br />
Se tiene la siguiente tabla asociada a la población inicial P0<br />
I 0 4<br />
= 1BB10B<br />
Individuo P0 fitn<strong>es</strong>s <br />
fitn<strong>es</strong>s P (Ii)<br />
I 0 1 01B11B 3 20 0.29<br />
I 0 2 0111BB 8 15 0.22<br />
I 0 3 1010BB 7 16 0.23<br />
I 0 4 1BB10B 5 18 0.26<br />
✲<br />
✲<br />
✲<br />
✲<br />
f1 = 3<br />
f2 = 8<br />
f3 = 7<br />
f4 = 5<br />
El mejor individuo <strong>de</strong> P0, I0 1 , pasa directamente a la siguiente población, P1.<br />
Individuo P1 fitn<strong>es</strong>s<br />
I 1 1 01B11B 3<br />
· · · · · · · · ·<br />
85
Tenemos que generar otros tr<strong>es</strong> individuos mediante los operador<strong>es</strong> genéticos para com-<br />
pletar la población P1.<br />
Generación <strong>de</strong> I 1 2 :<br />
Selección<br />
Cruce<br />
I 0 1 = 01B11B −→ α1 1 = 01B α1 2<br />
I 0 3 = 1010BB −→ α3 1 = 101 α3 2<br />
Empezamos aplicando el cruce a las ca<strong>de</strong>nas α 1 1 = 01B y α3 1<br />
= 11B<br />
= 0BB<br />
= 101.<br />
De aplicar el cruce uniforme a las subca<strong>de</strong>nas 01 y 10 r<strong>es</strong>ulta la subca<strong>de</strong>na 00.<br />
De aplicar el cruce en un punto a las subca<strong>de</strong>nas B y 1 r<strong>es</strong>ulta la subca<strong>de</strong>na B.<br />
Por lo tanto, hemos obtenido<br />
α 3 1<br />
α 1 1<br />
= 101<br />
= 01B<br />
Repetimos el proc<strong>es</strong>o para las ca<strong>de</strong>nas α 1 2 = 11B y α3 2<br />
✲<br />
α1 = 00B<br />
= 0BB.<br />
De aplicar el cruce uniforme a las subca<strong>de</strong>nas 1 y 0 r<strong>es</strong>ulta la subca<strong>de</strong>na 0.<br />
De aplicar el cruce en un punto a las subca<strong>de</strong>nas 1B y BB r<strong>es</strong>ulta la subca<strong>de</strong>na 1B.<br />
Por lo tanto, hemos obtenido<br />
Luego, I 1 2<br />
Mutación<br />
= 00B01B.<br />
α 3 2<br />
α 1 2<br />
= 0BB<br />
= 11B<br />
✲<br />
α2 = 01B<br />
Este individuo <strong>es</strong> sometido al proc<strong>es</strong>o <strong>de</strong> mutación, r<strong>es</strong>ultando<br />
Generación <strong>de</strong> I 1 3 :<br />
Selección<br />
00B −→ B0B −→ 0BB<br />
01B −→ 01B −→ 01B<br />
✲<br />
I 0 2 = 0111BB −→ α2 1 = 011 α2 2<br />
I 0 1 = 10B11B −→ α1 1 = 01B α1 2<br />
86<br />
I 1 2<br />
= 0BB01B<br />
= 1BB<br />
= 11B
Cruce<br />
Empezamos aplicando el cruce a las ca<strong>de</strong>nas α 2 1 = 011 y α1 1<br />
= 01B.<br />
De aplicar el cruce uniforme a las subca<strong>de</strong>nas 01 y 01 r<strong>es</strong>ulta la subca<strong>de</strong>na 01.<br />
De aplicar el cruce en un punto a las subca<strong>de</strong>nas 1 y B r<strong>es</strong>ulta la subca<strong>de</strong>na 1.<br />
Por lo tanto, hemos obtenido<br />
α 1 1<br />
α 2 1<br />
= 01B<br />
= 011<br />
Repetimos el proc<strong>es</strong>o para las ca<strong>de</strong>nas α 2 2 = 1BB y α1 2<br />
✲<br />
α1 = 011<br />
= 11B.<br />
De aplicar el cruce uniforme a las subca<strong>de</strong>nas 1 y 1 r<strong>es</strong>ulta la subca<strong>de</strong>na 1.<br />
De aplicar el cruce en un punto a las subca<strong>de</strong>nas BB y 1B r<strong>es</strong>ulta la subca<strong>de</strong>na BB.<br />
Por lo tanto, hemos obtenido<br />
Luego, I 1 2<br />
Mutación<br />
= 0111BB.<br />
α 1 2<br />
α 2 2<br />
= 11B<br />
= 1BB<br />
✲<br />
α2 = 1BB<br />
Este individuo <strong>es</strong> sometido al proc<strong>es</strong>o <strong>de</strong> mutación, r<strong>es</strong>ultando<br />
011 −→ B01 −→ 01B<br />
0BB −→ 0B1 −→ 01B<br />
✲<br />
I 1 2<br />
= 01B01B<br />
Repitiendo <strong>es</strong>te proc<strong>es</strong>o generamos los otros individuos <strong>de</strong> la población. Tras la evaluación<br />
<strong>de</strong> los nuevos individuos se obtine la siguiente tabla para la población P1,<br />
Individuo P0 fitn<strong>es</strong>s<br />
I 1 1 01B11B 3<br />
I 1 2 01B01B 4<br />
I 1 3 1BB11B 5<br />
I 1 4 01B10B 0<br />
Como uno <strong>de</strong> los individuos <strong>de</strong> la nueva población tiene fitn<strong>es</strong>s 0, el algoritmo ha finalizado.<br />
La solución propu<strong>es</strong>ta <strong>es</strong><br />
x1 = 01<br />
x2 = 10<br />
87
Capítulo 6<br />
El Algoritmo Genero Problema<br />
Estamos en condicion<strong>es</strong> <strong>de</strong> empezar a experimentar con el algoritmo genético simple,<br />
pero nos encontramos con un inconveniente: no existen documentos don<strong>de</strong> aparezcan pro-<br />
blemas <strong>de</strong>l tipo <strong>de</strong> los que preten<strong>de</strong>mos r<strong>es</strong>olver, así que nos vemos obligados a construir<br />
los problemas l SW ES.<br />
Para facilitar <strong>es</strong>te trabajo hemos <strong>de</strong>cidido diseñar un algoritmo que construye un sis-<br />
tema <strong>de</strong> “word equations” sobre el alfabeto A = {0, 1} con un número <strong>de</strong> ecuacion<strong>es</strong> y <strong>de</strong><br />
variabl<strong>es</strong> fijado. Este algoritmo también proporcionará una solución <strong>de</strong>l problema, pero<br />
no tiene por que ser la única.<br />
pasos:<br />
La primera i<strong>de</strong>a para el diseño <strong>de</strong> <strong>es</strong>te algoritmo consistía en realizar los siguient<strong>es</strong><br />
1. Generar un sistema <strong>de</strong> i<strong>de</strong>ntida<strong>de</strong>s sobre el alfabeto A.<br />
2. Generar las variabl<strong>es</strong> como ca<strong>de</strong>nas <strong>de</strong> longitud menor o igual que lmax sobre el<br />
alfabeto A.<br />
3. Para cada variable generada, recorrer el sistema buscando una subca<strong>de</strong>na que coinci-<br />
da con la variable. Si la encuentro, sustituyo con probabilidad p la subca<strong>de</strong>na por la<br />
letra que repr<strong>es</strong>enta a la variable y lo sigo recorriendo en busca <strong>de</strong> otra coinci<strong>de</strong>ncia.<br />
Sin embargo, <strong>es</strong>ta i<strong>de</strong>a tan sencilla no nos garantiza que, al final, el sistema generado<br />
contenga todas las variabl<strong>es</strong> pu<strong>es</strong>, por ejemplo, una variable pue<strong>de</strong> ser generada como una<br />
ca<strong>de</strong>na sobre A que no <strong>es</strong> subca<strong>de</strong>na en ninguna <strong>de</strong> las ecuacion<strong>es</strong> <strong>de</strong>l sistema.<br />
Logicamente, fijado un número <strong>de</strong> ecuacion<strong>es</strong>, n, y un número <strong>de</strong> variabl<strong>es</strong>, m, nu<strong>es</strong>tro<br />
interés <strong>es</strong> construir un sistema <strong>de</strong> n “word equations” sobre el alfabeto A que contenga<br />
88
exactamente m variabl<strong>es</strong>, x1, . . . , xm. Por lo tanto, nos vemos obligados a modificar <strong>es</strong>ta<br />
primera i<strong>de</strong>a y construimos un algoritmo con los siguient<strong>es</strong> pasos:<br />
1. Generar un sistema <strong>de</strong> i<strong>de</strong>ntida<strong>de</strong>s sobre el alfabeto A = {0, 1}.<br />
2. Para cada variable xi,<br />
a) elegimos una ecuación <strong>de</strong>l sistema,<br />
b) elegimos el lado <strong>de</strong>recho o izquierdo <strong>de</strong> la ecuación,<br />
c) <strong>de</strong>finimos la variable xi como una subca<strong>de</strong>na <strong>de</strong> la parte elegida (<strong>de</strong>recha o<br />
izquierda) <strong>de</strong> la ecuación, <strong>es</strong>ta subca<strong>de</strong>na será <strong>de</strong> longitud menor o igual que<br />
lmax sobre A,<br />
d) sustituimos la subca<strong>de</strong>na <strong>de</strong> la ecuación por la letra que repr<strong>es</strong>enta a la variable<br />
generada. De <strong>es</strong>ta forma se consigue que cada variable generada aparezca al<br />
menos una vez en el sistema.<br />
3. Una vez que se han generado todas las variabl<strong>es</strong>, recorremos el sistema en busca <strong>de</strong><br />
Nota 25<br />
coinci<strong>de</strong>ncias para cada variable xi, i = 1, . . . , m. Si se encuentra una subca<strong>de</strong>na en el<br />
sistema que coincida con la variable xi, se cambia con probabilidad p la subca<strong>de</strong>na<br />
por la letra que repr<strong>es</strong>enta a la variable. Con <strong>es</strong>te paso preten<strong>de</strong>mos aumentar el<br />
número <strong>de</strong> vec<strong>es</strong> que aparece una variable en el sistema.<br />
A medida que se van generando las variabl<strong>es</strong>, el sistema <strong>de</strong> i<strong>de</strong>ntida<strong>de</strong>s sobre el alfabeto<br />
A se convierte en un sistema <strong>de</strong> ecuacion<strong>es</strong> sobre el conjunto A ∪ {x1, . . . , xm}.<br />
El paso crítico <strong>de</strong> <strong>es</strong>te algoritmo se encuentra al <strong>de</strong>finir las variabl<strong>es</strong> <strong>de</strong>l sistema. In-<br />
tentaremos explicar un poco más <strong>es</strong>te paso. El algoritmo que diseñamos nec<strong>es</strong>ita, a<strong>de</strong>más<br />
<strong>de</strong>l número <strong>de</strong> ecuacion<strong>es</strong> y el número <strong>de</strong> variabl<strong>es</strong>, dos cotas le y lmax. La primera <strong>de</strong> ellas,<br />
le, indica la longitud máxima <strong>de</strong> las ca<strong>de</strong>nas que generamos sobre A para construir las<br />
i<strong>de</strong>ntida<strong>de</strong>s (paso 1). La segunda cota, indica la longitud máxima <strong>de</strong> las variabl<strong>es</strong>. Por lo<br />
tanto, una vez que se ha elegido el lado <strong>de</strong> la ecuación don<strong>de</strong> se vá a <strong>de</strong>finir la variable xi,<br />
se selecciona al azar una posición q <strong>de</strong> la misma y se cuentan los símbolos (consecutivos)<br />
<strong>de</strong>l alfabeto A que hay a la <strong>de</strong>recha <strong>de</strong> q. Si <strong>de</strong>notamos por lq al número <strong>de</strong> símbolos <strong>de</strong>l<br />
alfabeto A que hay a la <strong>de</strong>recha <strong>de</strong> q, entonc<strong>es</strong> la variable xi se <strong>de</strong>fine como un subca<strong>de</strong>na<br />
89
<strong>de</strong> longitud lr ∈ {0, min{lmax, lq}} que coinci<strong>de</strong> con el trozo <strong>de</strong> subca<strong>de</strong>na <strong>de</strong> la ecuación<br />
que vá <strong>de</strong> q a q + lr.<br />
Notar que si lr = 0, entonc<strong>es</strong> la variable xi <strong>es</strong> la palabra vacía.<br />
Nota 26<br />
En general, el problema(n m lmax) <strong>de</strong>notará un sistema <strong>de</strong> n “word equations” con m<br />
variabl<strong>es</strong>, <strong>de</strong> modo que cada variable (al menos en una solución <strong>de</strong>l sistema) tiene longitud<br />
menor o igual que lmax.<br />
En la última versión <strong>de</strong> <strong>es</strong>te algoritmo, hemos añadido un proc<strong>es</strong>o para controlar<br />
el tipo <strong>de</strong> ecuacion<strong>es</strong> que constituyen el sistema. Con <strong>es</strong>te proc<strong>es</strong>o se preten<strong>de</strong>n evitar<br />
las ecuacion<strong>es</strong> don<strong>de</strong> el lado <strong>de</strong>recho coinci<strong>de</strong> con el izquierdo. Por ejemplo, la ecuación<br />
0x110 = 0x110 pue<strong>de</strong> ser eliminada <strong>de</strong>l sistema por tratarse <strong>de</strong> una igualdad. De modo<br />
que una vez generado el sistema lo sometemos a los siguient<strong>es</strong> pasos:<br />
1. Recorremos el sistema en busca <strong>de</strong> ecuacion<strong>es</strong> con la misma ca<strong>de</strong>na en ambos lados.<br />
2. Para ecuación <strong>de</strong> <strong>es</strong>te tipo,<br />
a) Recorremos la ecuación para cada variable xi buscando una coinci<strong>de</strong>ncia. Si<br />
hay coinci<strong>de</strong>ncia, se sustituye con probabilidad p la subca<strong>de</strong>na <strong>de</strong> la ecuación<br />
por la letra que repr<strong>es</strong>enta dicha variable.<br />
b) Si <strong>de</strong>pués <strong>de</strong> recorrer la ecuación para cada variable ambos lados siguen siendo<br />
igual<strong>es</strong>, sustituimos dicha ecuación por una nueva i<strong>de</strong>ntidad sobre el alfabeto<br />
A y volvemos al paso a).<br />
De <strong>es</strong>ta forma conseguimos que el sistema contenga exactamente n ecuacion<strong>es</strong> (con<br />
ambos lados distintos).<br />
En el apéndice C se encuentran algunos <strong>de</strong> los problemas que hemos generado con <strong>es</strong>te<br />
algoritmo. A<strong>de</strong>más, en el apéndice B se encuentra el código <strong>de</strong>l algoritmo Genero Problema<br />
<strong>es</strong>crito en el lenguaje C++.<br />
90
Capítulo 7<br />
Primeros R<strong>es</strong>ultados<br />
Experimental<strong>es</strong><br />
7.1. Introducción<br />
Cada experimento consistirá en la r<strong>es</strong>olución, cincuenta vec<strong>es</strong>, <strong>de</strong> un problema dado y<br />
con unos parámetros fijos. Estos parámetros serán:<br />
1. El tamaño <strong>de</strong> la población. (tp)<br />
2. La longitud máxima <strong>de</strong> las variabl<strong>es</strong> (l). Así, cada individuo <strong>es</strong>tará constituido por<br />
subca<strong>de</strong>nas <strong>de</strong> longitud l sobre el alfabeto B.<br />
3. El número máximo <strong>de</strong> evaluacion<strong>es</strong> a realizar en una ejecución. (NMax. Eval.)<br />
4. La probabilidad <strong>de</strong> mutación. (Mutación)<br />
5. La selección <strong>de</strong>l método para la generación <strong>de</strong> la población inicial. (Método)<br />
Nota 27<br />
Con el fin <strong>de</strong> comparar los r<strong>es</strong>ultados obtenidos hemos acotado el número <strong>de</strong> evaluacion<strong>es</strong><br />
que pue<strong>de</strong> realizar el algoritmo para r<strong>es</strong>olver cada problema.<br />
Llamaremos Media Eval. al número medio <strong>de</strong> evaluacion<strong>es</strong> que fueron nec<strong>es</strong>arias para<br />
encontrar solución en las pruebas exitosas <strong>de</strong> las cincuenta realizadas.<br />
Llamaremos Éxito al número <strong>de</strong> vec<strong>es</strong> que se encuentra solución para un problema. Se<br />
expr<strong>es</strong>ará en tanto por cien.<br />
91
7.2. Tamaño <strong>de</strong> Población<br />
Nu<strong>es</strong>tro primer objetivo <strong>es</strong> <strong>de</strong>terminar el tamaño <strong>de</strong> población más a<strong>de</strong>cuado para la<br />
r<strong>es</strong>olución <strong>de</strong> los diferent<strong>es</strong> problemas.<br />
No sabemos nada acerca <strong>de</strong> cuál <strong>es</strong> la mejor probabilidad <strong>de</strong> mutación, así que hemos<br />
<strong>de</strong>cidido tomar 0,6. Acotamos el proc<strong>es</strong>o con 150000 evaluacion<strong>es</strong> y tomamos l = 5.<br />
Aprovecharemos también <strong>es</strong>te experimento para <strong>es</strong>tablecer, si <strong>es</strong> posible, una diferencia<br />
entre el método 1 y el método 2 usados para generar la población inicial.<br />
R<strong>es</strong>olvemos el Problema15-12-4<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 60<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 60 % 150000 22 % 106887<br />
2 2 5 60 % 150000 34 % 107556<br />
3 1 5 60 % 150000 12 % 108542<br />
3 2 5 60 % 150000 6 % 109582<br />
4 1 5 60 % 150000 2 % 88213<br />
4 2 5 60 % 150000 0 % 0<br />
6 1 5 60 % 150000 0 % 0<br />
6 2 5 60 % 150000 0 % 0<br />
8 1 5 60 % 150000 0 % 0<br />
8 2 5 60 % 150000 0 % 0<br />
10 1 5 60 % 150000 0 % 0<br />
10 2 5 60 % 150000 0 % 0<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados obtenidos corr<strong>es</strong>pon<strong>de</strong>n a tamaño <strong>de</strong> población igual a dos.<br />
A<strong>de</strong>más, no se observa una diferencia entre el método 1 y el método 2 que nos permita<br />
<strong>de</strong>cir que uno <strong>es</strong> mejor que el otro, al menos en <strong>es</strong>te problema concreto.<br />
Nota 28<br />
Siempre encuentra la misma solución y la mayoría <strong>de</strong> las variabl<strong>es</strong> que la forman son la<br />
ca<strong>de</strong>na vacía, Λ.<br />
92
R<strong>es</strong>olvemos el Problema25-8-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 48<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 60 % 150000 88 % 27667.5<br />
2 2 5 60 % 150000 94 % 22222.3<br />
3 1 5 60 % 150000 86 % 23132.5<br />
3 2 5 60 % 150000 74 % 29488.7<br />
4 1 5 60 % 150000 70 % 26295.2<br />
4 2 5 60 % 150000 70 % 23354.7<br />
6 1 5 60 % 150000 62 % 48727<br />
6 2 5 60 % 150000 64 % 48273.5<br />
8 1 5 60 % 150000 62 % 65029.6<br />
8 2 5 60 % 150000 56 % 75479.5<br />
10 1 5 60 % 150000 40 % 87881.9<br />
10 2 5 60 % 150000 32 % 95393.1<br />
Otra vez los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para tamaño <strong>de</strong> población igual a dos.<br />
Tampoco parece que sea <strong>de</strong>terminante la elección <strong>de</strong>l método que genera la población<br />
inicial.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados corr<strong>es</strong>pon<strong>de</strong>n a<br />
Nota 29<br />
Usando el método 1<br />
tp Exito Media Eval.<br />
2 88 % 27667.5<br />
3 86 % 23132.5<br />
4 70 % 26295.2<br />
Usando el método 2<br />
tp Exito Media Eval.<br />
2 94 % 22222.3<br />
3 74 % 29488.7<br />
4 70 % 23354.7<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
93
R<strong>es</strong>olvemos el Problema10-3-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 12<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 60 % 150000 100 % 278.08<br />
2 2 5 60 % 150000 100 % 223.78<br />
3 1 5 60 % 150000 100 % 345.96<br />
3 2 5 60 % 150000 100 % 282.84<br />
4 1 5 60 % 150000 100 % 332.08<br />
4 2 5 60 % 150000 100 % 407.8<br />
6 1 5 60 % 150000 100 % 649.7<br />
6 2 5 60 % 150000 100 % 615.6<br />
8 1 5 60 % 150000 100 % 845.9<br />
8 2 5 60 % 150000 100 % 757.98<br />
10 1 5 60 % 150000 100 % 1033.48<br />
10 2 5 60 % 150000 100 % 1261.54<br />
Problema aparentemente sencillo que nos permite comprobar que mayor tamaño <strong>de</strong><br />
población no mejora los r<strong>es</strong>ultados pero sí produce un aumento en el número <strong>de</strong> evalua-<br />
cion<strong>es</strong>, por ejemplo, pasamos <strong>de</strong> 1261 evaluacion<strong>es</strong> para una población tp = 10 a tan sólo<br />
223 evaluacion<strong>es</strong> para una población tp = 2.<br />
Parece que el método 2 reduce el número <strong>de</strong> evaluacion<strong>es</strong> pero no <strong>es</strong> una diferencia lo<br />
suficientemente gran<strong>de</strong> como para <strong>de</strong>cantarnos por <strong>es</strong>te método en lugar <strong>de</strong>l método 1.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados corr<strong>es</strong>pon<strong>de</strong>n a<br />
Nota 30<br />
Usando el método 1<br />
tp Exito Media Eval.<br />
2 100 % 278.08<br />
4 100 % 332.08<br />
3 100 % 345.96<br />
Usando el método 2<br />
tp Exito Media Eval.<br />
2 100 % 223.78<br />
3 100 % 282.84<br />
4 100 % 407.8<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
94
R<strong>es</strong>olvemos el Problema10-5-2<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 15<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 60 % 150000 100 % 1118.56<br />
2 2 5 60 % 150000 100 % 1323.76<br />
3 1 5 60 % 150000 100 % 2261.4<br />
3 2 5 60 % 150000 100 % 2412.48<br />
4 1 5 60 % 150000 100 % 4590.82<br />
4 2 5 60 % 150000 100 % 4229.5<br />
6 1 5 60 % 150000 100 % 13627.5<br />
6 2 5 60 % 150000 100 % 16416.7<br />
8 1 5 60 % 150000 100 % 27001.4<br />
8 2 5 60 % 150000 100 % 31674.5<br />
10 1 5 60 % 150000 100 % 36888.2<br />
10 2 5 60 % 150000 100 % 47870.9<br />
Como en el problema anterior, el algoritmo ha encontrado solución en todas las oca-<br />
sion<strong>es</strong> pero el número <strong>de</strong> evaluacion<strong>es</strong> ha ido creciendo a medida que hemos aumentado<br />
el tamaño <strong>de</strong> la población. Y <strong>es</strong>te aumento <strong>es</strong> consi<strong>de</strong>rable, pu<strong>es</strong> hemos pasado <strong>de</strong> 2261.4<br />
evaluacion<strong>es</strong> con una población tp = 3 a 36888.2 evaluacion<strong>es</strong> con una población tp = 10.<br />
R<strong>es</strong>pecto a la elección <strong>de</strong>l método para la generación <strong>de</strong> la población inicial nos encon-<br />
tramos en la misma situación <strong>de</strong>l problema10-3-3.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados corr<strong>es</strong>pon<strong>de</strong>n a<br />
Nota 31<br />
Usando el método 1<br />
tp Exito Media Eval.<br />
2 100 % 1118.56<br />
3 100 % 2261.4<br />
4 100 % 4590.82<br />
Usando el método 2<br />
tp Exito Media Eval.<br />
2 100 % 1323.76<br />
3 100 % 2412.48<br />
4 100 % 4229.5<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
95
R<strong>es</strong>olvemos el Problema12-6-4<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 30<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 60 % 150000 100 % 706.18<br />
2 2 5 60 % 150000 100 % 702.72<br />
3 1 5 60 % 150000 100 % 1089.4<br />
3 2 5 60 % 150000 100 % 1080.08<br />
4 1 5 60 % 150000 100 % 2279.8<br />
4 2 5 60 % 150000 100 % 2313.4<br />
6 1 5 60 % 150000 100 % 5529.3<br />
6 2 5 60 % 150000 100 % 6020.5<br />
8 1 5 60 % 150000 100 % 9966.48<br />
8 2 5 60 % 150000 100 % 10437<br />
10 1 5 60 % 150000 100 % 15989.1<br />
10 2 5 60 % 150000 100 % 17786.8<br />
Como en los dos casos anterior<strong>es</strong> el problema12-6-4 ha r<strong>es</strong>ultado ser sencillo y el número<br />
<strong>de</strong> evaluacion<strong>es</strong> aumenta a medida que crece el tamaño <strong>de</strong> la población.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados corr<strong>es</strong>pon<strong>de</strong>n a<br />
Nota 32<br />
Usando el método 1<br />
tp Exito Media Eval.<br />
2 100 % 706.18<br />
3 100 % 1089.4<br />
4 100 % 2279.8<br />
Encuentra distintas solucion<strong>es</strong>.<br />
96<br />
Usando el método 2<br />
tp Exito Media Eval.<br />
2 100 % 702.72<br />
3 100 % 1080.08<br />
4 100 % 2313.4
R<strong>es</strong>olvemos el Problema5-3-2<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 9<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 60 % 150000 100 % 338.6<br />
2 2 5 60 % 150000 100 % 611.4<br />
3 1 5 60 % 150000 100 % 622.68<br />
3 2 5 60 % 150000 100 % 890.12<br />
4 1 5 60 % 150000 100 % 858.7<br />
4 2 5 60 % 150000 100 % 1664.44<br />
6 1 5 60 % 150000 100 % 1487<br />
6 2 5 60 % 150000 100 % 2822.7<br />
8 1 5 60 % 150000 100 % 3280.5<br />
8 2 5 60 % 150000 100 % 5467.16<br />
10 1 5 60 % 150000 100 % 4207.6<br />
10 2 5 60 % 150000 100 % 6347.44<br />
Otra vez el número <strong>de</strong> evaluacion<strong>es</strong> aumenta a medida que crece el tamaño <strong>de</strong> la<br />
población.<br />
En <strong>es</strong>ta ocasión si existe una diferencia clara entre los dos métodos propu<strong>es</strong>tos para<br />
generar la población inicial, llegando a ser <strong>de</strong> casi la mitad <strong>de</strong> evaluacion<strong>es</strong> con el método<br />
1.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados corr<strong>es</strong>pon<strong>de</strong>n a<br />
Nota 33<br />
Usando el método 1<br />
tp Exito Media Eval.<br />
2 100 % 338.6<br />
3 100 % 622.68<br />
4 100 % 858.7<br />
Usando el método 2<br />
tp Exito Media Eval.<br />
2 100 % 611.4<br />
3 100 % 890.12<br />
4 100 % 1664.44<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
97
Conclusión 1<br />
D<strong>es</strong>pués <strong>de</strong> <strong>es</strong>te primer contacto con el algoritmo genético r<strong>es</strong>ulta evi<strong>de</strong>nte que el tamaño<br />
<strong>de</strong> población más a<strong>de</strong>cuado <strong>es</strong> tp = 2 pu<strong>es</strong> a medida que crece el número <strong>de</strong> individuos <strong>de</strong><br />
la población disminuye la probabilidad <strong>de</strong> éxito y aumenta el número <strong>de</strong> evaluacion<strong>es</strong>.<br />
Sin embargo, no <strong>es</strong>tamos en condicion<strong>es</strong> <strong>de</strong> afirmar que uno <strong>de</strong> los dos métodos propu<strong>es</strong>-<br />
tos para la generación <strong>de</strong> la población inicial sea mejor que el otro. Por <strong>es</strong>o, seguiremos<br />
realizando los experimentos con los dos métodos.<br />
R<strong>es</strong>umen <strong>de</strong> los mejor<strong>es</strong> r<strong>es</strong>ultados obtenidos:<br />
Nota 34<br />
Problema Esp. Búsq. tp Exito Media Eval. Método<br />
15-12-4 2 60 2 34 % 107556 2<br />
25-8-5 2 48 2 94 % 22222.3 2<br />
10-3-3 2 12 2 100 % 223.78 2<br />
10-5-2 2 15 2 100 % 1118.56 1<br />
12-6-4 2 30 2 100 % 702.72 2<br />
5-3-2 2 9 2 100 % 338.6 1<br />
En los suc<strong>es</strong>ivos experimentos tomaremos siempre tamaño <strong>de</strong> población tp = 2 y acotare-<br />
mos los proc<strong>es</strong>os por 1.5 millon<strong>es</strong> <strong>de</strong> evaluacion<strong>es</strong>.<br />
98
7.3. Probabilidad <strong>de</strong> mutación<br />
Nu<strong>es</strong>tro segundo objetivo <strong>es</strong> <strong>de</strong>terminar los valor<strong>es</strong> <strong>de</strong> la probabilidad <strong>de</strong> mutación<br />
más a<strong>de</strong>cuados para la r<strong>es</strong>olución <strong>de</strong> los problemas l SW ES. Para ello, fijamos todos los<br />
parámetros excepto la mutación que irá variando <strong>de</strong>s<strong>de</strong> el 20 % al 100 %.<br />
R<strong>es</strong>olvemos el Problema10-15-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 90<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 20 % 1.5e+06 0 % 0<br />
2 2 5 20 % 1.5e+06 0 % 0<br />
2 1 5 40 % 1.5e+06 2 % 1.06558e+06<br />
2 2 5 40 % 1.5e+06 0 % 0<br />
2 1 5 70 % 1.5e+06 0 % 0<br />
2 2 5 70 % 1.5e+06 2 % 1.12725e+06<br />
2 1 5 80 % 1.5e+06 2 % 1.37572e+06<br />
2 2 5 80 % 1.5e+06 0 % 0<br />
2 1 5 90 % 1.5e+06 2 % 801145<br />
2 2 5 90 % 1.5e+06 2 % 1.0302e+06<br />
2 1 5 100 % 1.5e+06 4 % 1.04644e+06<br />
2 2 5 100 % 1.5e+06 2 % 253817<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Nota 35<br />
Usando el método 1<br />
Mutación Exito Media Eval.<br />
100 % 4 % 1.04644e+06<br />
90 % 2 % 801145<br />
Usando el método 2<br />
Mutación Exito Media Eval.<br />
100 % 2 % 253817<br />
90 % 2 % 1.0302e+06<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
99
R<strong>es</strong>olvemos el Problema10-5-1<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 10<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 20 % 1.5e+06 100 % 22751.7<br />
2 2 5 20 % 1.5e+06 100 % 41875.7<br />
2 1 5 40 % 1.5e+06 100 % 11364.6<br />
2 2 5 40 % 1.5e+06 100 % 17492.3<br />
2 1 5 70 % 1.5e+06 100 % 7952.02<br />
2 2 5 70 % 1.5e+06 100 % 7800.06<br />
2 1 5 80 % 1.5e+06 100 % 7923.1<br />
2 2 5 80 % 1.5e+06 100 % 8119.02<br />
2 1 5 90 % 1.5e+06 100 % 8101.9<br />
2 2 5 90 % 1.5e+06 100 % 6422.6<br />
2 1 5 100 % 1.5e+06 100 % 5594.96<br />
2 2 5 100 % 1.5e+06 100 % 5600.88<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Mutación Exito Media Eval.<br />
100 % 100 % 5594.96<br />
80 % 100 % 7923.1<br />
Usando el método 2<br />
Mutación Exito Media Eval.<br />
100 % 100 % 5600<br />
90 % 100 % 6422.6<br />
Aunque el algoritmo siempre encuentra solución, el número <strong>de</strong> evaluacion<strong>es</strong> disminuye<br />
consi<strong>de</strong>rablemente para valor<strong>es</strong> <strong>de</strong> la probabilidad <strong>de</strong> mutación altos.<br />
Nota 36<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
100
R<strong>es</strong>olvemos el Problema10-8-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 48<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 20 % 1.5e+06 98 % 381874<br />
2 2 5 20 % 1.5e+06 94 % 304587<br />
2 1 5 40 % 1.5e+06 98 % 203427<br />
2 2 5 40 % 1.5e+06 100 % 180120<br />
2 1 5 70 % 1.5e+06 100 % 129486<br />
2 2 5 70 % 1.5e+06 100 % 179024<br />
2 1 5 80 % 1.5e+06 100 % 134950<br />
2 2 5 80 % 1.5e+06 100 % 114512<br />
2 1 5 90 % 1.5e+06 98 % 90263.3<br />
2 2 5 90 % 1.5e+06 100 % 93544.5<br />
2 1 5 100 % 1.5e+06 100 % 86991.9<br />
2 2 5 100 % 1.5e+06 100 % 73362.4<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Mutación Exito Media Eval.<br />
100 % 100 % 86991.9<br />
70 % 100 % 129486<br />
Usando el método 2<br />
Mutación Exito Media Eval.<br />
100 % 100 % 73362.4<br />
90 % 100 % 93544.5<br />
En <strong>es</strong>ta ocasión, los valor<strong>es</strong> <strong>de</strong> la probabilidad <strong>de</strong> mutación hacen que el algoritmo no<br />
siempre encuentre solución y a<strong>de</strong>más aumentan el número <strong>de</strong> evaluacion<strong>es</strong>.<br />
Nota 37<br />
Encuentra distintas solucion<strong>es</strong>.<br />
Una <strong>de</strong> las variabl<strong>es</strong> <strong>de</strong>l problema pue<strong>de</strong> tomar distintos valor<strong>es</strong>, el r<strong>es</strong>to <strong>de</strong> las variabl<strong>es</strong><br />
siempre toman el mismo valor.<br />
101
R<strong>es</strong>olvemos el Problema25-8-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 32<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 20 % 1.5e+06 100 % 117905<br />
2 2 5 20 % 1.5e+06 100 % 121339<br />
2 1 5 40 % 1.5e+06 100 % 47327.7<br />
2 2 5 40 % 1.5e+06 100 % 60389.5<br />
2 1 5 70 % 1.5e+06 100 % 41581.5<br />
2 2 5 70 % 1.5e+06 100 % 32645.8<br />
2 1 5 80 % 1.5e+06 100 % 31538.3<br />
2 2 5 80 % 1.5e+06 100 % 44212.9<br />
2 1 5 90 % 1.5e+06 100 % 31687.5<br />
2 2 5 90 % 1.5e+06 100 % 28286.8<br />
2 1 5 100 % 1.5e+06 100 % 26726.1<br />
2 2 5 100 % 1.5e+06 100 % 32858.1<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Mutación Exito Media Eval.<br />
100 % 100 % 26726.1<br />
80 % 100 % 31538.3<br />
Usando el método 2<br />
Mutación Exito Media Eval.<br />
90 % 100 % 28286.8<br />
70 % 100 % 32645.8<br />
Aunque siempre encuentra solución, el número <strong>de</strong> evaluacion<strong>es</strong> que fueron nec<strong>es</strong>arias<br />
para encontrar solución disminuye para valor<strong>es</strong> <strong>de</strong> la probabilidad <strong>de</strong> mutación entre el<br />
70 % y el 100 %.<br />
Nota 38<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
102
R<strong>es</strong>olvemos el Problema25-8-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 48<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 20 % 1.5e+06 100 % 140364<br />
2 2 5 20 % 1.5e+06 100 % 98455.6<br />
2 1 5 40 % 1.5e+06 100 % 57316.9<br />
2 2 5 40 % 1.5e+06 100 % 79764.9<br />
2 1 5 70 % 1.5e+06 100 % 26307.5<br />
2 2 5 70 % 1.5e+06 100 % 36819.7<br />
2 1 5 80 % 1.5e+06 100 % 32292.8<br />
2 2 5 80 % 1.5e+06 100 % 30747.8<br />
2 1 5 90 % 1.5e+06 100 % 20602.3<br />
2 2 5 90 % 1.5e+06 100 % 34846.2<br />
2 1 5 100 % 1.5e+06 100 % 35748.3<br />
2 2 5 100 % 1.5e+06 100 % 29859.6<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Mutación Exito Media Eval.<br />
90 % 100 % 20602.3<br />
70 % 100 % 26307.5<br />
Usando el método 2<br />
Mutación Exito Media Eval.<br />
100 % 100 % 29859.6<br />
80 % 100 % 30747.8<br />
De nuevo, el éxito <strong>es</strong> <strong>de</strong>l 100 % para todos los experimentos realizados con <strong>es</strong>te prob-<br />
lema, pero el número <strong>de</strong> evaluacion<strong>es</strong> mejora para valor<strong>es</strong> <strong>de</strong> la probabilidad <strong>de</strong> mutación<br />
entre el 70 % y el 100 %.<br />
Nota 39<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
103
R<strong>es</strong>olvemos el Problema5-15-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 60<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 20 % 1.5e+06 4 % 881354<br />
2 2 5 20 % 1.5e+06 0 % 0<br />
2 1 5 40 % 1.5e+06 4 % 750816<br />
2 2 5 40 % 1.5e+06 0 % 0<br />
2 1 5 70 % 1.5e+06 2 % 91868<br />
2 2 5 70 % 1.5e+06 10 % 273665<br />
2 1 5 80 % 1.5e+06 8 % 681722<br />
2 2 5 80 % 1.5e+06 0 % 0<br />
2 1 5 90 % 1.5e+06 2 % 374402<br />
2 2 5 90 % 1.5e+06 10 % 511213<br />
2 1 5 100 % 1.5e+06 10 % 743411<br />
2 2 5 100 % 1.5e+06 4 % 1.00708e+06<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Mutación Exito Media Eval.<br />
100 % 10 % 743411<br />
80 % 8 % 681722<br />
Usando el método 2<br />
Mutación Exito Media Eval.<br />
70 % 10 % 273665<br />
90 % 10 % 511213<br />
El algoritmo genético simple no siempre encuentra solución. Notar que el tamaño <strong>de</strong>l<br />
<strong>es</strong>pacio <strong>de</strong> búsqueda <strong>es</strong> <strong>de</strong> aprox. 2 60 . A p<strong>es</strong>ar <strong>de</strong> ello, los valor<strong>es</strong> <strong>de</strong> probabilidad <strong>de</strong><br />
mutación entre el 70 % y el 100 % proporcionan los mejor<strong>es</strong> r<strong>es</strong>ultados.<br />
Nota 40<br />
Encuentra distintas solucion<strong>es</strong>.<br />
La gran mayoría <strong>de</strong> las variabl<strong>es</strong>, aproximádamente 10 <strong>de</strong> las 15, pue<strong>de</strong>n tomar distintos<br />
valor<strong>es</strong>.<br />
104
R<strong>es</strong>olvemos el Problema15-12-4<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 60<br />
tp Método l Mutación NMax Eval. Exito Media Eval.<br />
2 1 5 20 % 1.5e+06 76 % 638268<br />
2 2 5 20 % 1.5e+06 80 % 658522<br />
2 1 5 40 % 1.5e+06 84 % 386301<br />
2 2 5 40 % 1.5e+06 86 % 496717<br />
2 1 5 70 % 1.5e+06 96 % 324814<br />
2 2 5 70 % 1.5e+06 98 % 313743<br />
2 1 5 80 % 1.5e+06 92 % 277741<br />
2 2 5 80 % 1.5e+06 98 % 288551<br />
2 1 5 90 % 1.5e+06 100 % 263719<br />
2 2 5 90 % 1.5e+06 100 % 204263<br />
2 1 5 100 % 1.5e+06 98 % 295557<br />
2 2 5 100 % 1.5e+06 96 % 255491<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Mutación Exito Media Eval.<br />
90 % 100 % 263719<br />
100 % 98 % 295557<br />
Usando el método 2<br />
Mutación Exito Media Eval.<br />
90 % 100 % 204263<br />
80 % 98 % 288551<br />
Po<strong>de</strong>mos observar que los valor<strong>es</strong> <strong>de</strong> probabilidad <strong>de</strong> mutación entre el 80 % y el 100 %<br />
no sólo mejoran el éxito sino que también reducen el número <strong>de</strong> evaluacion<strong>es</strong> nec<strong>es</strong>arias<br />
para encontrar solución.<br />
Nota 41<br />
Siempre encuentra la misma solución y coinci<strong>de</strong> con la propu<strong>es</strong>ta por Genero Problema.<br />
La mayoría <strong>de</strong> las variabl<strong>es</strong> son la ca<strong>de</strong>na vacia, Λ.<br />
105
Conclusión 2<br />
R<strong>es</strong>umen <strong>de</strong> los mejor<strong>es</strong> r<strong>es</strong>ultados obtenidos:<br />
Usando el método 1<br />
Problema Esp. Búsq. Mutación Exito Media Eval.<br />
10-15-5 2 90 100 % 4 % 1.04644e+06<br />
10-5-1 2 10 100 % 100 % 5594.96<br />
10-8-5 2 48 100 % 100 % 86991.9<br />
25-8-3 2 32 100 % 100 % 26726.1<br />
25-8-5 2 48 90 % 100 % 20602.3<br />
5-15-3 2 60 100 % 10 % 743411<br />
15-12-4 2 60 90 % 100 % 263719<br />
Usando el método 2<br />
Problema Esp. Búsq. Mutación Exito Media Eval.<br />
10-15-5 2 90 100 % 2 % 253817<br />
10-5-1 2 10 100 % 100 % 5600<br />
10-8-5 2 48 100 % 100 % 73362.4<br />
25-8-3 2 32 90 % 100 % 28286.8<br />
25-8-5 2 48 100 % 100 % 29859.6<br />
5-15-3 2 60 70 % 10 % 273665<br />
15-12-4 2 60 90 % 100 % 204263<br />
Se <strong>de</strong> duce que los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen con una probabilidad <strong>de</strong> mutación<br />
comprendida entre el 70 % y el 100 %.<br />
Aunque pue<strong>de</strong> parecer que la probabilidad <strong>de</strong> mutación <strong>es</strong> muy alta, hemos obtenido<br />
valor<strong>es</strong> similar<strong>es</strong> a los propu<strong>es</strong>tos en la r<strong>es</strong>olución <strong>de</strong> los problemas SAT , que en <strong>de</strong>finitiva<br />
<strong>es</strong> nu<strong>es</strong>tra única referencia.<br />
106
Capítulo 8<br />
<strong>Algoritmos</strong> <strong>Evolutivos</strong> para<br />
R<strong>es</strong>olver l SW ES<br />
A partir <strong>de</strong>l algoritmo genético simple, <strong>de</strong>finido en el capítulo 5, vamos a construir dos<br />
algoritmos evolutivos.<br />
La codificación <strong>de</strong> los individuos, la generación <strong>de</strong> la población inicial, el fitn<strong>es</strong>s y<br />
los operador<strong>es</strong> genéticos se <strong>de</strong>finen <strong>de</strong> la misma forma. A<strong>de</strong>más, seguiremos acotando la<br />
r<strong>es</strong>olución <strong>de</strong> los problemas por 1,5 millon<strong>es</strong> <strong>de</strong> evaluacion<strong>es</strong> y buscaremos solucion<strong>es</strong> cuyas<br />
variabl<strong>es</strong> sean <strong>de</strong> longitud menor o igual que cinco.<br />
8.1. A.E. Sólo Mutación<br />
Como consecuencia <strong>de</strong> los primeros r<strong>es</strong>ultados experimental<strong>es</strong>, el alto valor que toma<br />
la probabilidad <strong>de</strong> mutación y teniendo en cuenta los algoritmos evolutivos que fueron<br />
propu<strong>es</strong>tos para r<strong>es</strong>olver SAT (ver capítulo 2), r<strong>es</strong>ulta inter<strong>es</strong>ante modificar nu<strong>es</strong>tro al-<br />
goritmo genético para obtener un algoritmo evolutivo que trabaje con una población <strong>de</strong><br />
tamaño tp = 1.<br />
Este algoritmo evolutivo usará sólo el operador genético <strong>de</strong> mutación.<br />
Si los r<strong>es</strong>ultados que proporcionan <strong>es</strong>te algoritmo mejoran los <strong>de</strong>l algoritmo genético<br />
simple, seguiremos nu<strong>es</strong>tro <strong>es</strong>tudio con <strong>es</strong>te nuevo algoritmo o bien intentaremos modificar<br />
el operador <strong>de</strong> cruce para mejorar el algoritmo genético simple.<br />
El <strong>es</strong>quema <strong>de</strong> funcionamiento <strong>de</strong> <strong>es</strong>te algoritmo <strong>es</strong> el siguiente<br />
107
Seudocódigo<br />
I0 ← generar población inicial<br />
I0 ← evaluar (I0)<br />
para k = 1 hasta NIter hacer<br />
fin para<br />
I1 ← copiar (I0)<br />
I1 ← mutar (I1)<br />
E1 ← evaluar (I1)<br />
I0 ← mejor individuo (I0 , I1)<br />
En el apéndice D se encuentra <strong>es</strong>te algoritmo <strong>es</strong>crito en C++.<br />
En las siguient<strong>es</strong> tablas comparamos los r<strong>es</strong>ultados obtenidos al r<strong>es</strong>olver un mismo<br />
problema l SW ES con el algoritmo genético simple (AGS) y con <strong>es</strong>te nuevo algoritmo<br />
evolutivo (AE).<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Problema Esp. Búsq. Exito(AGS) Exito(AE) Eval.(AGS) Eval.(AE)<br />
10-5-1 2 10 100 % 100 % 5594.96 5599.28<br />
10-8-5 2 48 100 % 78 % 86991.9 366416<br />
25-8-3 2 32 100 % 88 % 26726.1 293262<br />
25-8-5 2 48 100 % 66 % 35748.3 39866<br />
5-15-3 2 60 10 % 6 % 743411 461058<br />
15-12-4 2 60 98 % 100 % 263719 203817<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Problema Esp. Búsq. Exito(AGS) Exito(AE) Eval.(AGS) Eval.(AE)<br />
10-5-1 2 10 100 % 100 % 5600 5155.18<br />
10-8-5 2 48 100 % 66 % 73362.4 405752<br />
25-8-3 2 32 100 % 88 % 32858.1 385027<br />
25-8-5 2 48 100 % 60 % 29859.6 14243.1<br />
5-15-3 2 60 4 % 0 % 1.00708e+06 0<br />
15-12-4 2 60 96 % 100 % 255491 250908<br />
108
R<strong>es</strong>ulta evi<strong>de</strong>nte que el AE no mejora los r<strong>es</strong>ultados obtenidos con el AGS. Por lo<br />
tanto, el operador <strong>de</strong> cruce que hemos <strong>de</strong>finido tiene influencia en la r<strong>es</strong>olución <strong>de</strong> los<br />
sistemas.<br />
8.2. A.E. Búsqueda Local<br />
Añadimos al algoritmo genético simple un proc<strong>es</strong>o <strong>de</strong> búsqueda local que se aplicará a<br />
cada individuo <strong>de</strong> las suc<strong>es</strong>ivas poblacion<strong>es</strong> generadas, con el fin <strong>de</strong> mejorar (localmente)<br />
el fitn<strong>es</strong>s <strong>de</strong> dichos individuos.<br />
Para la implementación <strong>de</strong> <strong>es</strong>te proc<strong>es</strong>o <strong>de</strong>finimos dos métodos:<br />
Búsqueda Local 1<br />
Dado un individuo I = α1 · · · αm, cualquiera. Se realizan dos etapas:<br />
1. Cada subca<strong>de</strong>na αi, para i = 1, . . . , m, se somete a un proc<strong>es</strong>o <strong>de</strong> busqueda local<br />
clásico que afecta unicamente a las ca<strong>de</strong>na βi, para i = 1, . . . , m. (Recordar que<br />
αi = βi ¯ βi siendo βi ∈ A ∗ y ¯ βi ∈ {B} ∗ )<br />
Este proc<strong>es</strong>o consiste en recorrer <strong>de</strong> izquierda a <strong>de</strong>recha los símbolos <strong>de</strong> las<br />
ca<strong>de</strong>nas βi, para i = 1, . . . , m, cambiando cada símbolo, <strong>es</strong> <strong>de</strong>cir, se pasa <strong>de</strong><br />
cero a uno o viceversa. Cada vez que se cambia un símbolo se evalua el nuevo<br />
individuo y nos quedamos con el mejor, <strong>es</strong> <strong>de</strong>cir, si al cambiar un símbolo <strong>de</strong> una<br />
<strong>de</strong> las ca<strong>de</strong>nas βi el fitn<strong>es</strong>s <strong>de</strong>l nuevo individuo mejora o iguala al <strong>de</strong>l individuo<br />
anterior, entonc<strong>es</strong> nos quedamos con el nuevo y pasamos a cambiar el siguiente<br />
símbolo situado más a la <strong>de</strong>recha (que pertenezca a una ca<strong>de</strong>na βi). Pero si<br />
el fitn<strong>es</strong>s <strong>de</strong>l individuo no mejora al cambiar un símbolo, entonc<strong>es</strong> se recupera<br />
el símbolo original y se pasa al siguiente. De <strong>es</strong>ta forma, se recorren todos los<br />
símbolos <strong>de</strong> βi, para i = 1, . . . , m y se cambiando aquellos símbolos que mejoren<br />
el fitn<strong>es</strong>s <strong>de</strong>l individuo.<br />
Si al final <strong>de</strong> <strong>es</strong>te proc<strong>es</strong>o el fitn<strong>es</strong>s <strong>de</strong>l individuo ha mejorado, entonc<strong>es</strong> volvemos<br />
a aplicar la búsqueda local clásica a las nuevas ca<strong>de</strong>nas βi.<br />
2. Cuando la búsqueda local clásica no permite mejorar el fitn<strong>es</strong>s <strong>de</strong>l individuo<br />
I = α1 · · · , αm, se aplica una búsqueda local que permite modificar en una<br />
unidad la longitud <strong>de</strong> las ca<strong>de</strong>nas βi, para i = 1, . . . , m.<br />
109
Notar que hasta ahora lo único que hacíamos era cambiar los símbolos, pasando<br />
<strong>de</strong> cero a uno o viceversa, pero la longitud <strong>de</strong> las ca<strong>de</strong>nas βi, para i = 1, . . . , m<br />
no cambiaba.<br />
Para modificar la longitud <strong>de</strong> la ca<strong>de</strong>na βi, para i = 1, . . . , m en una unidad,<br />
proce<strong>de</strong>mos como sigue:<br />
a) Disminuimos en una unidad la longitud <strong>de</strong> βi convirtiendo el último símbolo<br />
<strong>de</strong> <strong>es</strong>ta ca<strong>de</strong>na en un símbolo blanco, <strong>de</strong> modo que la longitud <strong>de</strong> la ca<strong>de</strong>na<br />
¯βi aumenta una unidad.<br />
Ejemplo 44<br />
Sea βi ¯ βi = 0010BBB con |βi| = 4 y | ¯ βi| = 3.<br />
Al disminuir la longitud <strong>de</strong> βi en una unidad se obtiene<br />
siendo ahora |βi| = 3 y | ¯ βi| = 4.<br />
βi ¯ βi = 001BBBB<br />
b) Aumentamos en una unidad la longitud <strong>de</strong> la ca<strong>de</strong>na βi convirtiendo el<br />
primer símbolo blanco <strong>de</strong> la ca<strong>de</strong>na ¯ βi en un símbolo <strong>de</strong>l alfabeto A, <strong>de</strong><br />
modo que la longitud <strong>de</strong> ¯ βi disminuye en una unidad.<br />
Como A = {0, 1}, tenemos dos posibilida<strong>de</strong>s para aumentar la longitud <strong>de</strong><br />
βi:<br />
1) convertir en un cero el primer símbolo blanco <strong>de</strong> ¯ βi,<br />
2) convertir en uno el primer símbolo blanco <strong>de</strong> ¯ βi.<br />
Ejemplo 45<br />
Sea βi ¯ βi = 0010BBB con |βi| = 4 y | ¯ βi| = 3.<br />
Al aumentar la longitud <strong>de</strong> βi en una unidad se obtiene dos ca<strong>de</strong>nas<br />
siendo ahora |βi| = 5 y | ¯ βi| = 2.<br />
00100BB<br />
00101BB<br />
Luego, para ca<strong>de</strong>na αi obtenemos tr<strong>es</strong> posibilida<strong>de</strong>s al modificar en una unidad<br />
la longitud <strong>de</strong> βi, si alguna <strong>de</strong> <strong>es</strong>tas nuevas ca<strong>de</strong>nas mejora el fitn<strong>es</strong>s <strong>de</strong>l indi-<br />
viduo, entonc<strong>es</strong> αi <strong>es</strong> sustituida por la nueva ca<strong>de</strong>na.<br />
110
Búsqueda Local 2<br />
Nota 42<br />
Cuando terminamos <strong>de</strong> modificar las longitu<strong>de</strong>s <strong>de</strong> todas las ca<strong>de</strong>nas βi en bus-<br />
ca <strong>de</strong> un individuo mejor, comprobamos si el fitn<strong>es</strong>s ha mejorado, en <strong>es</strong>e caso<br />
se vuelve a el paso 1. Si no hay mejora, se termina el proc<strong>es</strong>o <strong>de</strong> búsqueda local<br />
1 aplicado al individuo I.<br />
Dado un individuo I = α1 · · · αm, cualquiera.<br />
A cada subca<strong>de</strong>na αi, se le aplica el proc<strong>es</strong>o <strong>de</strong> búsqueda local clásica (que afecta<br />
unicamente a la ca<strong>de</strong>na βi) y <strong>de</strong>spués se le aplica el proc<strong>es</strong>o <strong>de</strong> búsqueda local que<br />
permite modificar en una unidad la longitud <strong>de</strong> βi, tomando aquella que mejore el<br />
fitn<strong>es</strong>s <strong>de</strong>l individuo.<br />
Una vez que hemos aplicado <strong>es</strong>tos dos proc<strong>es</strong>os a todas las subca<strong>de</strong>nas αi <strong>de</strong>l indi-<br />
viduo I, si el fitn<strong>es</strong>s <strong>de</strong>l individuo ha mejorado volvemos a repetir el proc<strong>es</strong>o. En<br />
otro caso, la búsqueda local 2 aplicada al individuo I finaliza.<br />
Observ<strong>es</strong>e que aunque ambos procedimientos <strong>de</strong> búsqueda local puedan parecer igual<strong>es</strong>,<br />
hay una importante diferencia:<br />
mientras que en el proc<strong>es</strong>o <strong>de</strong> búsqueda local 1 realizamos suc<strong>es</strong>ivas vec<strong>es</strong> (hasta que no<br />
se produzca mejora) lo que hemos <strong>de</strong>nominado búsqueda local clásica ant<strong>es</strong> <strong>de</strong> tratar <strong>de</strong><br />
modificar las longitu<strong>de</strong>s, en el proc<strong>es</strong>o <strong>de</strong> búsqueda local 2 realizamos en cada iteración<br />
una vez la búsqueda local clásica seguida <strong>de</strong> una posible modificación en una unidad <strong>de</strong><br />
las longitu<strong>de</strong>s.<br />
8.3. R<strong>es</strong>ultados experimental<strong>es</strong><br />
Hasta ahora hemos r<strong>es</strong>uelto los problemas con ayuda <strong>de</strong> un algoritmo genético simple.<br />
En <strong>es</strong>ta sección vamos a <strong>es</strong>tudiar los r<strong>es</strong>ultados obtenidos al añadir búsqueda local.<br />
Se intentará <strong>es</strong>tablecer, si fu<strong>es</strong>e posible, cuál <strong>de</strong> los dos métodos implementados para<br />
el proc<strong>es</strong>o <strong>de</strong> búsqueda local <strong>es</strong> mejor.<br />
También r<strong>es</strong>ultará inter<strong>es</strong>ante <strong>de</strong>terminar si la mutación sigue siendo importante cuan-<br />
do se usa búsqueda local. Para ello iremos tomando distintos valor<strong>es</strong> <strong>de</strong> probabilidad <strong>de</strong><br />
mutación.<br />
111
Finalmente, compararemos los r<strong>es</strong>ultados obtenidos al aplicar un algoritmo genético<br />
simple para r<strong>es</strong>olver los problemas l SW ES y los r<strong>es</strong>ultados obtenidos al utilizar un A.E.<br />
con búsqueda local.<br />
Para po<strong>de</strong>r comparar los r<strong>es</strong>ultados seguimos manteniendo tamaño <strong>de</strong> pobalción tp = 2,<br />
longitud máxima <strong>de</strong> las variabl<strong>es</strong> que forman los individuos igual a 5 y acotamos la ejecu-<br />
ción <strong>de</strong>l algoritmo por 1.5 millon<strong>es</strong> <strong>de</strong> evaluacion<strong>es</strong>.<br />
R<strong>es</strong>olvemos el Problema10-3-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 18<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 85.34 100 % 50.9<br />
2 5 70 % 100 % 79.94 100 % 50.26<br />
2 5 90 % 100 % 77.1 100 % 50.26<br />
2 5 100 % 100 % 77.1 100 % 50.26<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 90.06 100 % 44.06<br />
2 5 70 % 100 % 73.72 100 % 46.9<br />
2 5 90 % 100 % 75.96 100 % 50.32<br />
2 5 100 % 100 % 75.96 100 % 50.32<br />
Parece que la probabilidad <strong>de</strong> mutación no influye sobre los r<strong>es</strong>ultados. Sin embargo,<br />
si queda reflejado la superioridad <strong>de</strong> la búsqueda local 2 frente a la 1.<br />
Nota 43<br />
Siempre encuentra la misma solución.<br />
112
R<strong>es</strong>olvemos el Problema10-8-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 48<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 26705.3 100 % 19301.1<br />
2 5 70 % 100 % 15371.6 100 % 10368.7<br />
2 5 90 % 100 % 15947.3 100 % 10164.8<br />
2 5 100 % 100 % 16017.8 100 % 8220.76<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 27036.5 100 % 21981.9<br />
2 5 70 % 100 % 16879.7 100 % 12433.7<br />
2 5 90 % 100 % 15947.3 100 % 9702.92<br />
2 5 100 % 100 % 15585 100 % 9629.52<br />
Se observa que la búsqueda local 2 reduce el número <strong>de</strong> evaluacion<strong>es</strong>. A<strong>de</strong>más, a medida<br />
que aumenta la probabilidad <strong>de</strong> mutación disminuye el número <strong>de</strong> evaluacion<strong>es</strong>.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 44<br />
2 100 % 100 % 8220.76<br />
2 90 % 100 % 10164.8<br />
Admite distintas solucion<strong>es</strong>.<br />
Usando el método 2<br />
Búsq. L. Mut. Exito Media Eval.<br />
2 100 % 100 % 9629.52<br />
2 90 % 100 % 9702.92<br />
Una <strong>de</strong> las variabl<strong>es</strong> <strong>de</strong>l problema pue<strong>de</strong> tomar distintos valor<strong>es</strong>, el r<strong>es</strong>to <strong>de</strong> las variabl<strong>es</strong><br />
siempre toman el mismo valor.<br />
113
R<strong>es</strong>olvemos el Problema10-8-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 48<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 35040.2 100 % 22728.9<br />
2 5 70 % 100 % 19519.9 100 % 16844.7<br />
2 5 90 % 100 % 23727.3 100 % 20473.6<br />
2 5 100 % 100 % 22740 100 % 16484.9<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 49985.8 100 % 28200.4<br />
2 5 70 % 100 % 24295.2 100 % 22562<br />
2 5 90 % 100 % 27747.4 100 % 18935.5<br />
2 5 100 % 100 % 31129.4 100 % 16596.1<br />
De nuevo hay que <strong>de</strong>stacar la diferencia que existe entre los métodos <strong>de</strong> búsqueda local<br />
implementados.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 45<br />
2 100 % 100 % 16484.9<br />
2 70 % 100 % 16844.7<br />
Siempre encuentra la misma solución.<br />
Usando el método 2<br />
Búsq. L. Mutación Exito Media Eval.<br />
114<br />
2 100 % 100 % 16596.1<br />
2 90 % 100 % 18935.5
R<strong>es</strong>olvemos el Problema10-15-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 90<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 484850 100 % 593998<br />
2 5 70 % 100 % 474252 100 % 288598<br />
2 5 90 % 100 % 182997 100 % 104509<br />
2 5 100 % 100 % 457354 100 % 340361<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 831604 100 % 646195<br />
2 5 70 % 100 % 589418 100 % 338841<br />
2 5 90 % 100 % 472892 100 % 362079<br />
2 5 100 % 100 % 499089 100 % 340070<br />
En <strong>es</strong>te caso po<strong>de</strong>mos observar que no siempre la mejor probabilidad <strong>de</strong> mutación <strong>es</strong><br />
el 100 %, pu<strong>es</strong> aunque siempre se encuentra solución el número <strong>de</strong> evaluacion<strong>es</strong> nec<strong>es</strong>arias<br />
varía.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 46<br />
2 90 % 100 % 104509<br />
1 90 % 100 % 182997<br />
Siempre encuentra la misma solución.<br />
115<br />
Usando el método 2<br />
Búsq. L. Mut. Exito Media Eval.<br />
2 70 % 100 % 338841<br />
2 100 % 100 % 340070
R<strong>es</strong>olvemos el Problema10-15-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 90<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 44 % 611542 76 % 338663<br />
2 5 70 % 50 % 652274 94 % 327947<br />
2 5 90 % 68 % 642407 98 % 362663<br />
2 5 100 % 56 % 583024 92 % 264417<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 38 % 646377 72 % 614781<br />
2 5 70 % 48 % 616960 94 % 424924<br />
2 5 90 % 34 % 643584 86 % 401649<br />
2 5 100 % 64 % 573071 92 % 413873<br />
Como en todos los problemas anterior<strong>es</strong> la búsqueda local 2 <strong>es</strong> más efectiva.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 47<br />
2 90 % 98 % 362663<br />
2 70 % 94 % 327947<br />
Admite distintas solucion<strong>es</strong>.<br />
Usando el método 2<br />
Búsq. L. Mut. Exito Media Eval.<br />
2 70 % 94 % 424924<br />
2 100 % 92 % 413873<br />
Existen dos variabl<strong>es</strong> <strong>de</strong>l problema que pue<strong>de</strong> tomar distintos valor<strong>es</strong>, el r<strong>es</strong>to <strong>de</strong> las<br />
variabl<strong>es</strong> siempre toman el mismo valor.<br />
116
R<strong>es</strong>olvemos el Problema15-12-4<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 72<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 1676.5 100 % 1187.36<br />
2 5 70 % 100 % 1377.96 100 % 1154.76<br />
2 5 90 % 100 % 1484.46 100 % 860.82<br />
2 5 100 % 100 % 1254.8 100 % 1058.64<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 2289.98 100 % 1729.18<br />
2 5 70 % 100 % 1988.92 100 % 1456.82<br />
2 5 90 % 100 % 2110.4 100 % 1395.68<br />
2 5 100 % 100 % 2032.8 100 % 1431.26<br />
La búsqueda local r<strong>es</strong>ulta ser un proc<strong>es</strong>o tan potente que permite en muchas ocasion<strong>es</strong><br />
encontrar solución aplicandolo unicamente a la población inicial, <strong>es</strong> <strong>de</strong>cir, no se llega a<br />
usar el algoritmo genético simple.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 48<br />
2 90 % 100 % 860.82<br />
2 100 % 100 % 1058.64<br />
Siempre encuentra la misma solución.<br />
La mayoría <strong>de</strong> las variabl<strong>es</strong> son la ca<strong>de</strong>na vacia, Λ.<br />
117<br />
Usando el método 2<br />
Búsq. L. Mut. Exito Media Eval.<br />
2 90 % 100 % 1395.68<br />
2 100 % 100 % 1431.26
R<strong>es</strong>olvemos el Problema15-7-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 42<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 225.48 100 % 226.56<br />
2 5 70 % 100 % 225.48 100 % 225.26<br />
2 5 90 % 100 % 290.3 100 % 216.64<br />
2 5 100 % 100 % 290.3 100 % 225.64<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 354.9 100 % 374.8<br />
2 5 70 % 100 % 402.16 100 % 268.84<br />
2 5 90 % 100 % 347.18 100 % 322.48<br />
2 5 100 % 100 % 341.42 100 % 255.94<br />
En la mayoría <strong>de</strong> los casos la búsqueda local aplicada a la población inicial <strong>es</strong> sufi-<br />
ciente para encontrar la solución <strong>de</strong>l problema, sólo en algunos casos nec<strong>es</strong>ita unas pocas<br />
iteracion<strong>es</strong> <strong>de</strong>l algoritmo genético para encontrarla. Por <strong>es</strong>o no existe diferencia entre los<br />
r<strong>es</strong>ultados obtenidos para las distintas probabilida<strong>de</strong>s <strong>de</strong> mutación.<br />
Nota 49<br />
Admite distintas solucion<strong>es</strong>.<br />
Existen dos variabl<strong>es</strong> <strong>de</strong>l problema que pue<strong>de</strong> tomar distintos valor<strong>es</strong>, el r<strong>es</strong>to <strong>de</strong> las<br />
variabl<strong>es</strong> siempre toman el mismo valor.<br />
118
R<strong>es</strong>olvemos el Problema25-8-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 48<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 2938.72 100 % 2336.18<br />
2 5 70 % 100 % 1748.66 100 % 1525.2<br />
2 5 90 % 100 % 1280.28 100 % 1405.06<br />
2 5 100 % 100 % 1839.48 100 % 1054.16<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 3599.8 100 % 3011.56<br />
2 5 70 % 100 % 2282.54 100 % 1665.56<br />
2 5 90 % 100 % 2487.56 100 % 1630.5<br />
2 5 100 % 100 % 2375.56 100 % 2222.46<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 50<br />
2 100 % 100 % 1054.16<br />
1 90 % 100 % 1280.28<br />
Siempre encuentra la misma solución.<br />
119<br />
Usando el método 2<br />
Búsq. L. Mut. Exito Media Eval.<br />
2 90 % 100 % 1630.5<br />
2 70 % 100 % 1665.56
R<strong>es</strong>olvemos el Problema25-8-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 48<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 4674.82 100 % 2522.74<br />
2 5 70 % 100 % 2782.76 100 % 1517.26<br />
2 5 90 % 100 % 3174.1 100 % 1407.38<br />
2 5 100 % 100 % 2613.64 100 % 1189.84<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 100 % 3502.56 100 % 1710.58<br />
2 5 70 % 100 % 2591.5 100 % 1244<br />
2 5 90 % 100 % 2788.2 100 % 1145.1<br />
2 5 100 % 100 % 2468.54 100 % 1165.28<br />
D<strong>es</strong>tacar <strong>de</strong> nuevo la diferencia entre el número <strong>de</strong> evaluacion<strong>es</strong> nec<strong>es</strong>arias para encon-<br />
trar solución usando los distintos métodos <strong>de</strong> búsqueda local.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 51<br />
2 100 % 100 % 1189.84<br />
2 90 % 90 % 1407.38<br />
Siempre encuentra la misma solución.<br />
120<br />
Usando el método 2<br />
Búsq. L. Mut. Exito Media Eval.<br />
2 90 % 100 % 1145.1<br />
2 100 % 100 % 1165.28
R<strong>es</strong>olvemos el Problema5-15-3<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 90<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 94 % 535684 88 % 311136<br />
2 5 70 % 96 % 299938 96 % 171128<br />
2 5 90 % 94 % 246925 100 % 192842<br />
2 5 100 % 94 % 317776 98 % 246269<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. Local 1 Búsq. Local 2<br />
tp l Mutación Exito Media Eval. Exito Media Eval.<br />
2 5 20 % 62 % 541543 96 % 391371<br />
2 5 70 % 94 % 415857 94 % 284990<br />
2 5 90 % 88 % 341641 94 % 222077<br />
2 5 100 % 92 % 316503 96 % 218227<br />
En <strong>es</strong>te problema, la búsqueda local 2 no sólo mejora el número <strong>de</strong> evaluacion<strong>es</strong> sino<br />
que aumenta la probabilidad <strong>de</strong> éxito, <strong>es</strong> <strong>de</strong>cir, <strong>de</strong> encontrar solución.<br />
Los mejor<strong>es</strong> r<strong>es</strong>ultados se obtienen para<br />
Usando el método 1<br />
Búsq. L. Mut. Exito Media Eval.<br />
Nota 52<br />
2 90 % 100 % 192842<br />
2 100 % 98 % 246269<br />
Admite distintas solucion<strong>es</strong>.<br />
121<br />
Usando el método 2<br />
Búsq. L. Mut. Exito Media Eval.<br />
2 100 % 96 % 218227<br />
2 20 % 96 % 391371
Conclusión 3<br />
R<strong>es</strong>umen <strong>de</strong> los mejor<strong>es</strong> r<strong>es</strong>ultados obtenidos:<br />
Usando el método 1<br />
Problema Búsq. L. Mutación Exito Media Eval.<br />
10-8-5 2 100 % 100 % 8220.76<br />
10-8-3 2 100 % 100 % 16484.9<br />
10-3-3 2 — 100 % 50.26<br />
10-15-5 2 90 % 100 % 104509<br />
10-15-3 2 90 % 98 % 362663<br />
15-12-4 2 90 % 100 % 860.82<br />
15-7-5 2 — 100 % 216.64<br />
25-8-3 2 100 % 100 % 1054.16<br />
25-8-5 2 100 % 100 % 1189.84<br />
5-15-3 2 90 % 100 % 192842<br />
Usando el método 2<br />
Problema Búsq. L. Mutación Exito Media Eval.<br />
10-8-5 2 100 % 100 % 9629.52<br />
10-8-3 2 100 % 100 % 16596.1<br />
10-3-3 2 — 100 % 44.06<br />
10-15-5 2 70 % 100 % 338841<br />
10-15-3 2 70 % 94 % 424924<br />
15-12-4 2 90 % 100 % 1395.68<br />
15-7-5 2 — 100 % 255.94<br />
25-8-3 2 90 % 100 % 1630.5<br />
25-8-5 2 90 % 100 % 1145.1<br />
5-15-3 2 100 % 96 % 218227<br />
Estamos en condicion<strong>es</strong> <strong>de</strong> afirmar que la búsqueda local 2 <strong>es</strong> más efectiva que la 1<br />
y que la probabilidad <strong>de</strong> mutación sigue siendo una etapa <strong>de</strong>l proc<strong>es</strong>o importante en la<br />
r<strong>es</strong>olución <strong>de</strong> los problemas.<br />
122
Hemos podido obsevar que la búsqueda local r<strong>es</strong>ulta <strong>de</strong>cisiva en la primera etapa, cuan-<br />
do se genera la población inicial. Ant<strong>es</strong> <strong>de</strong> empezar a trabajar con el algoritmo genético,<br />
la población inicial <strong>es</strong> sometida a un proc<strong>es</strong>o <strong>de</strong> búsqueda local y, como consecuencia,<br />
<strong>es</strong>ta población experimenta una mejora consi<strong>de</strong>rable. Pero, una vez iniciado el algoritmo<br />
genético, el efecto que tiene la búsqueda local sobre las nuevas poblacion<strong>es</strong> generadas no <strong>es</strong><br />
significativo. Por <strong>es</strong>e motivo, creemos que <strong>es</strong> importante mantener valor<strong>es</strong> <strong>de</strong> probabilidad<br />
<strong>de</strong> mutación entre 70 % y el 100 %.<br />
Para concluir <strong>es</strong>ta sección comparamos algunos <strong>de</strong> los r<strong>es</strong>ultados obtenidos al aplicar<br />
el algoritmo genético simple (AGS) y el algoritmo genético con búsqueda local (AE).<br />
Como ya sabemos que la búsqueda local 2 <strong>es</strong> mejor que la 1, tomamos como refe-<br />
rencia los r<strong>es</strong>ultados obtenidos con busqueda local 2 para compararlos con los r<strong>es</strong>ultados<br />
obtenidos sin búsqueda local.<br />
Se tienen las siguient<strong>es</strong> tablas<br />
Usando el método 1<br />
Problema Mutación Éxito(AGS) Éxito(AE) Media Eval.(AGS) Media Eval.(AE)<br />
10-15-5 70 % 0 % 100 % 0 288598<br />
(2 90 ) 90 % 2 % 100 % 801145 104509<br />
100 % 4 % 100 % 1.04644e+06 340361<br />
10-8-5 70 % 100 % 100 % 129486 10368.7<br />
(2 48 ) 90 % 98 % 100 % 90263.3 10164.8<br />
100 % 100 % 100 % 86991.9 8220.76<br />
15-12-4 70 % 96 % 100 % 324814 1154.76<br />
(2 72 ) 90 % 100 % 100 % 263719 860.82<br />
100 % 98 % 100 % 295557 1058.64<br />
25-8-5 70 % 100 % 100 % 26307.5 1517.26<br />
(2 48 ) 90 % 100 % 100 % 20602.3 1407.38<br />
100 % 98 % 100 % 35748.3 1189.84<br />
5-15-3 70 % 2 % 96 % 91868 171128<br />
(2 90 ) 90 % 2 % 100 % 374402 192842<br />
100 % 10 % 98 % 743411 246269<br />
123
Usando el método 2<br />
Problema Mutación Éxito(AGS) Éxito(AE) Media Eval.(AGS) Media Eval.(AE)<br />
10-15-5 70 % 2 % 100 % 1.12728e+06 338841<br />
(2 90 ) 90 % 2 % 100 % 1.0302e+06 362079<br />
100 % 2 % 100 % 253817 340070<br />
10-8-5 70 % 100 % 100 % 179024 12433.7<br />
(2 48 ) 90 % 100 % 100 % 93544.5 9702.92<br />
100 % 100 % 100 % 73362.4 9629.52<br />
15-12-4 70 % 98 % 100 % 313743 1456.82<br />
(2 72 ) 90 % 100 % 100 % 204263 1395.68<br />
100 % 96 % 100 % 255491 1431.26<br />
25-8-5 70 % 100 % 100 % 36819.7 1244<br />
(2 48 ) 90 % 100 % 100 % 34846.2 1145.1<br />
100 % 100 % 100 % 29859.6 1165.28<br />
5-15-3 70 % 10 % 94 % 273665 284990<br />
(2 90 ) 90 % 10 % 94 % 511213 222077<br />
Conclusión 4<br />
100 % 4 % 96 % 1.00708e+06 218227<br />
La búsqueda local mejora la probabilidad <strong>de</strong> exito y reduce consi<strong>de</strong>rablemente el número<br />
<strong>de</strong> evaluacion<strong>es</strong> nec<strong>es</strong>arias para encontrar una solución <strong>de</strong>l problema.<br />
124
Capítulo 9<br />
Experimento final<br />
En <strong>es</strong>ta sección vamos a pr<strong>es</strong>entar los r<strong>es</strong>ultados obtenidos en la r<strong>es</strong>olución <strong>de</strong> un<br />
grupo <strong>de</strong> problemas clasificados como <strong>de</strong> gran dificultad por tener un <strong>es</strong>pacio <strong>de</strong> búsqueda<br />
gran<strong>de</strong>.<br />
Como ya hemos comprobado el mejor funcionamiento <strong>de</strong> la búsqueda local 2, en toda<br />
<strong>es</strong>ta sección usaremos <strong>es</strong>ta búsqueda con tamaño <strong>de</strong> población dos.<br />
R<strong>es</strong>olvemos el Problema15-25-5<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 150<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. L. tp l Mutación Exito Media Eval.<br />
2 2 5 70 % 92 % 414500<br />
2 2 5 80 % 98 % 384799<br />
2 2 5 90 % 96 % 359897<br />
2 2 5 100 % 86 % 417172<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. L. tp l Mutación Exito Media Eval.<br />
2 2 5 70 % 98 % 475580<br />
2 2 5 80 % 96 % 424660<br />
2 2 5 90 % 90 % 409549<br />
2 2 5 100 % 90 % 421117<br />
125
Mientras que con el método 1 los mejor<strong>es</strong> r<strong>es</strong>ultados se obtien<strong>es</strong> con probabilidad<br />
<strong>de</strong> mutación 80 % y 90 %, con el método 2 a medida que disminuye la probabilidad <strong>de</strong><br />
mutación mejoran los r<strong>es</strong>ultados, <strong>es</strong>to nos lleva a pensar en intentar r<strong>es</strong>olver el problema<br />
con menor probabilidad <strong>de</strong> mutación. Aunque según la experiencia no <strong>es</strong>peramos que haya<br />
mejora, pu<strong>es</strong> hemos <strong>es</strong>tablecido la probabilidad <strong>de</strong> mutación más a<strong>de</strong>cuada entre el 70 %<br />
y el 100 %.<br />
Nota 53<br />
Admite distintas solucion<strong>es</strong>.<br />
Existen dos variabl<strong>es</strong> <strong>de</strong>l problema que pue<strong>de</strong> tomar distintos valor<strong>es</strong>, el r<strong>es</strong>to <strong>de</strong> las<br />
variabl<strong>es</strong> siempre toman el mismo valor.<br />
R<strong>es</strong>olvemos el Problema25-23-4<br />
Tamaño <strong>de</strong>l <strong>es</strong>pacio <strong>de</strong> búsqueda: aprox. 2 138<br />
Usando el método 1 para generar la población inicial se obtuvo<br />
Búsq. L. tp l Mutación Exito Media Eval.<br />
2 2 5 70 % 68 % 375905<br />
2 2 5 80 % 78 % 549016<br />
2 2 5 90 % 78 % 593530<br />
2 2 5 100 % 76 % 601812<br />
Usando el método 2 para generar la población inicial se obtuvo<br />
Búsq. L. tp l Mutación Exito Media Eval.<br />
2 2 5 70 % 74 % 530816<br />
2 2 5 80 % 72 % 690505<br />
2 2 5 90 % 70 % 663918<br />
2 2 5 100 % 70 % 519235<br />
Se repite el comportamiento observado en el problema anterior, con el método 1 el<br />
mejor éxito se tiene con probabilidad <strong>de</strong> mutación igual a 80 %, seguido <strong>de</strong>l 90 %, mientras<br />
que con el método 2 va mejorando el r<strong>es</strong>ultado a medida que disminuye la probabilidad<br />
<strong>de</strong> mutación.<br />
Nota 54<br />
Siempre encuentra la misma solución.<br />
126
Para finalizar, en la siguiente tabla se comparan los r<strong>es</strong>ultados obtenidos al r<strong>es</strong>olver<br />
algunos problemas en distintos <strong>es</strong>pacios <strong>de</strong> búsqueda con el algoritmo genético simple<br />
(AGS) y con el A.E. Búsqueda Local (AE).<br />
Usamos el método 1 para generar la población inicial y mutación <strong>de</strong>l 90 %<br />
Problema l Esp. Búsq. Éxito(AE) Éxito(AGS) Eval.(AE) Eval.(AGS)<br />
p10-8-3 3 2 32 100 % 98 % 3593.14 243568<br />
p25-8-3 3 2 32 100 % 100 % 771.66 86942<br />
p10-8-3 4 2 40 100 % 72 % 7094 464914<br />
p25-8-3 5 2 48 100 % 74 % 1405.06 393360<br />
p25-8-3 6 2 56 100 % 42 % 2502.06 644780<br />
p5-15-3 3 2 60 100 % 50 % 19332.8 290949<br />
p10-15-3 3 2 60 100 % 62 % 9788.18 458878<br />
p15-12-4 4 2 60 100 % 100 % 644.94 193523<br />
p10-8-3 7 2 64 100 % 4 % 221302 60725<br />
p25-8-3 8 2 72 100 % 16 % 4946.56 389959<br />
p10-8-3 10 2 88 76 % 0 % 577926 –<br />
p5-15-3 5 2 90 100 % 6 % 192842 366681<br />
p10-15-3 5 2 90 98 % 10 % 362663 712000<br />
p10-15-5 5 2 90 100 % 2 % 104509 801145<br />
p25-23-4 4 2 115 96 % 0 % 493575 –<br />
p25-23-4 5 2 138 78 % 0 % 593530 –<br />
p15-25-5 5 2 150 96 % 0 % 359897 –<br />
p5-15-3 10 2 165 4 % 0 % 464710 –<br />
p25-8-3 20 2 168 100 % 0 % 31189.3 –<br />
Conclusión 5<br />
El algoritmo evolutivo que proponemos para r<strong>es</strong>olver los problemas l SW ES usa los o-<br />
perador<strong>es</strong> genéticos <strong>de</strong>finidos en el capítulo 5 y aplica búqueda local 2 a cada una <strong>de</strong> las<br />
poblacion<strong>es</strong> generadas.<br />
127
Apéndice A<br />
El Algoritmo Genético Simple<br />
// //////////////////////////////////////////////////////////// //<br />
// / / //<br />
// / Un Algoritmo Genético para R<strong>es</strong>olver el problema l_SWES / //<br />
// / / //<br />
// //////////////////////////////////////////////////////////// //<br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
using nam<strong>es</strong>pace std;<br />
fstream fsol("solucion.dat",ios::out);<br />
void Pedir_Datos(string &problema, int &TamPob, int &lMaxVsol,<br />
int &NMaxIter, int &ProMut, int &Metodo);<br />
void Lee_Prob(const string &problema, int &n_ec, int &m_var,<br />
void Simplifica(const int &n_ec, vector &l_ec,<br />
vector &l_ec, vector &Sist);<br />
vector &Sist);<br />
128
void Genera_PobIni(vector &PobIni,<br />
vector &lReVsol,<br />
vector &AuxPob,<br />
vector &AuxlRsol,<br />
const int &TamPob, const int &m_var,<br />
const int &lMaxVsol, const int &Metodo);<br />
void reor<strong>de</strong>no(const int &l, vector &v, int &lReVsol);<br />
void Evalua(const int &n_ec, const vector &l_ec,<br />
const vector &Sist,<br />
const vector &lReVsol,<br />
const vector &PobIni,<br />
vector &AuxIzq, vector &AuxDer,<br />
int &fitn<strong>es</strong>s, int &haysol);<br />
void sustituyo( const vector &Sist, int &lAux,<br />
vector &Aux, const vector &lVsol,<br />
const vector &PobIni);<br />
void Mejor_Sol(int &MejorFit, vector &fitn<strong>es</strong>s,<br />
const int &TamPob, const int &m_var,<br />
vector &AuxPob, const int &lMaxVsol,<br />
vector &PobIni,<br />
vector &AuxlRsol, vector &lReVsol);<br />
void Ruleta(int &Sumfit, const int &TamPob, vector &fitn<strong>es</strong>s);<br />
void eligo_padre(int &TamPob, int &Padre, vector &fitn<strong>es</strong>s);<br />
void Cruce(const int &m_var, const int &lMaxVsol,<br />
129
vector &AuxPob,<br />
vector &lReVsolIzq, vector &lReVsolDer,<br />
vector &AuxlRsol, vector &PobIniIzq,<br />
vector &PobIniDer);<br />
void Mutacion(const int &m_var, const int &lMaxVsol, int &muto,<br />
int main(void)<br />
{<br />
string problema;<br />
vector &AuxPob, vector &AuxlRsol);<br />
int TamPob, lMaxVsol, NMaxIter, ProMut, Metodo;<br />
int n_ec, m_var;<br />
int haysol, muto;<br />
int MejorFit, Sumfit, PadreIzq, PadreDer;<br />
int i, j, k, iter;<br />
vector l_ec;<br />
vector Sist;<br />
vector PobIni;<br />
vector lReVsol;<br />
vector AuxPob; //vector auxiliar<br />
vector AuxlRsol; //vector auxiliar<br />
vector fitn<strong>es</strong>s;<br />
vector AuxIzq; //Sólo se utiliza en la función evalua<br />
vector AuxDer; //Sólo se utiliaza en la función evalua<br />
randomize();<br />
Pedir_Datos(problema, TamPob, lMaxVsol, NMaxIter, ProMut, Metodo);<br />
Lee_Prob(problema, n_ec, m_var, l_ec, Sist);<br />
130
Simplifica(n_ec, l_ec, Sist);<br />
Genera_PobIni(PobIni, lReVsol, AuxPob,<br />
fitn<strong>es</strong>s.r<strong>es</strong>ize(TamPob);<br />
haysol= 0;<br />
for(k= 0; k
* Cruce *<br />
Cruce(m_var, lMaxVsol, AuxPob[k], lReVsol[PadreIzq], lReVsol[PadreDer],<br />
// * Mutación *<br />
if(ProMut!=0)<br />
{<br />
muto = rand() %100;<br />
AuxlRsol[k], PobIni[PadreIzq], PobIni[PadreDer]);<br />
if(muto< ProMut) // * Muto la solusión k_<strong>es</strong>ima *<br />
Mutacion(m_var, lMaxVsol, muto, AuxPob[k], AuxlRsol[k]);<br />
}//fin if(ProMut!=0)<br />
}//fin for(k)<br />
for(k= 0; k< TamPob; k++)<br />
for(i= 0; i< m_var; i++)<br />
{<br />
lReVsol[k][i]= AuxlRsol[k][i];<br />
for(j= 0;j< lMaxVsol; j++) PobIni[k][i][j]= AuxPob[k][i][j];<br />
}//fin for(i)<br />
fitn<strong>es</strong>s[0]= MejorFit;<br />
for(k= 1; k
for(k= 0; k< TamPob; k++) { for(i= 0; i< m_var; i++) {<br />
for(j= 0;j< lMaxVsol; j++) fsol
fsol
do{<br />
do{<br />
cout
cout
}//fin while<br />
if(coinci<strong>de</strong>ncia!=0)<br />
{<br />
l_ec[i]= l_ec[i]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i]; j++)<br />
Sist[i][j]= Sist[i][j+coinci<strong>de</strong>ncia];<br />
Sist[i].r<strong>es</strong>ize(l_ec[i]);<br />
l_ec[i+1]= l_ec[i+1]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i+1]; j++)<br />
Sist[i+1][j]= Sist[i+1][j+coinci<strong>de</strong>ncia];<br />
Sist[i+1].r<strong>es</strong>ize(l_ec[i+1]);<br />
}//fin if<br />
coinci<strong>de</strong>ncia= 0; columnas= 1; minimo= min (l_ec[i],l_ec[i+1]);<br />
while(columnas
{<br />
int longitud;<br />
PobIni.r<strong>es</strong>ize(TamPob);<br />
lReVsol.r<strong>es</strong>ize(TamPob);<br />
AuxPob.r<strong>es</strong>ize(TamPob); //vector auxiliar<br />
AuxlRsol.r<strong>es</strong>ize(TamPob); //vector auxiliar<br />
for(int k= 0; k< TamPob; k++)<br />
{<br />
PobIni[k].r<strong>es</strong>ize(m_var);<br />
lReVsol[k].r<strong>es</strong>ize(m_var);<br />
AuxPob[k].r<strong>es</strong>ize(m_var); //vector auxiliar<br />
AuxlRsol[k].r<strong>es</strong>ize(m_var); //vector auxiliar<br />
for(int i= 0; i< m_var; i++)<br />
{<br />
PobIni[k][i].r<strong>es</strong>ize(lMaxVsol);<br />
if(Metodo == 1)<br />
{<br />
longitud= lMaxVsol +1;<br />
lReVsol[k][i]= rand() % longitud;<br />
for(int j= 0; j< lReVsol[k][i]; j++) PobIni[k][i][j]= rand() % 2;<br />
for(int j= lReVsol[k][i]; j< lMaxVsol; j++) PobIni[k][i][j]= 2;<br />
}//fin if(Metodo==1)<br />
if(Metodo == 2)<br />
{<br />
lReVsol[k][i]= lMaxVsol;<br />
for(int j= 0; j< lMaxVsol; j++) PobIni[k][i][j] = rand() % 3;<br />
reor<strong>de</strong>no(lMaxVsol, PobIni[k][i],lReVsol[k][i]);<br />
}//fin if(Metodo==2)<br />
}//fin for(i)<br />
}//fin for(k)<br />
}//fin Genera_PobIni<br />
138
void reor<strong>de</strong>no(const int &l, vector &v,int &lReVsol)<br />
{<br />
// Reor<strong>de</strong>no la variable y calculo la longitud real <strong>de</strong> la misma<br />
int columna;<br />
for(int j= 0; j< l-1; j++)<br />
if(v[j] == 2)<br />
{<br />
columna= j+1;<br />
while(v[columna] == 2 && columna< l-1) columna = columna +1;<br />
if(v[columna]!= 2)<br />
{<br />
v[j]= v[columna];<br />
v[columna]= 2;<br />
}//fin if<br />
}//if(v[j] == 2)<br />
for(int j= 0; j< l; j++)<br />
if(v[j] == 2) lReVsol= lReVsol -1;<br />
}//fin reor<strong>de</strong>no<br />
void Evalua(const int &n_ec, const vector &l_ec,<br />
{<br />
const vector &Sist, const vector &lReVsol,<br />
const vector &PobIni, vector &AuxIzq,<br />
vector &AuxDer, int &fitn<strong>es</strong>s, int &haysol)<br />
int lAuxIzq, lAuxDer;<br />
int coinci<strong>de</strong>ncia, minimo;<br />
coinci<strong>de</strong>ncia = 0;<br />
for(int i= 0; i
AuxDer.r<strong>es</strong>ize(lAuxDer);<br />
sustituyo(Sist[2*i], lAuxIzq, AuxIzq, lReVsol, PobIni);<br />
sustituyo(Sist[2*i+1], lAuxDer, AuxDer, lReVsol, PobIni);<br />
minimo = min(lAuxIzq,lAuxDer);<br />
for(int j= 0;j< minimo; j++)<br />
if(AuxIzq[j] != AuxDer[j]) coinci<strong>de</strong>ncia= coinci<strong>de</strong>ncia+1;<br />
coinci<strong>de</strong>ncia= coinci<strong>de</strong>ncia + abs(lAuxIzq-lAuxDer);<br />
}//fin for(i)<br />
fitn<strong>es</strong>s= coinci<strong>de</strong>ncia;<br />
if(fitn<strong>es</strong>s == 0) haysol= 1;<br />
}//fin Evaluacion<br />
void sustituyo(const vector &Sist, int &lAux,<br />
{<br />
int auxiliar, variable;<br />
int j, l;<br />
auxiliar = 0;<br />
for(j= 0;j< lAux; j++)<br />
vector &Aux, const vector &lVsol,<br />
const vector &PobIni)<br />
if(Sist[j+auxiliar]==0 || Sist[j+auxiliar]==1) Aux[j] = Sist[j+auxiliar];<br />
else<br />
{<br />
variable = Sist[j+auxiliar] - 3;<br />
if(lVsol[variable]==0)<br />
{<br />
}<br />
else<br />
lAux=lAux-1;<br />
Aux.r<strong>es</strong>ize(lAux);<br />
auxiliar=auxiliar+1;<br />
j=j-1;<br />
140
{<br />
}<br />
lAux=lAux+lVsol[variable]-1;<br />
Aux.r<strong>es</strong>ize(lAux);<br />
for(l= 0; l< lVsol[variable]; l++) Aux[j+l] = PobIni[variable][l];<br />
auxiliar = auxiliar - lVsol[variable] + 1;<br />
j=j+lVsol[variable]-1;<br />
}//fin else<br />
}//fin sustituyo<br />
void Mejor_Sol(int &MejorFit, vector &fitn<strong>es</strong>s,<br />
{<br />
int minimo, variable;<br />
variable = 0;<br />
MejorFit = fitn<strong>es</strong>s[0];<br />
const int &TamPob, const int &m_var, vector &AuxPob,<br />
const int &lMaxVsol, vector &PobIni,<br />
vector &AuxlRsol, vector &lReVsol)<br />
for(int k= 1; k< TamPob; k++)<br />
{<br />
if(fitn<strong>es</strong>s[k]< MejorFit)<br />
{<br />
MejorFit= fitn<strong>es</strong>s[k];<br />
variable= k;<br />
}//fin if(fitn<strong>es</strong>s[k]< MejorFit)<br />
if(MejorFit == fitn<strong>es</strong>s[k])<br />
{<br />
minimo= rand() % 2;<br />
if(minimo == 0)<br />
{<br />
MejorFit= fitn<strong>es</strong>s[k];<br />
variable= k;<br />
141
}//fin if(minimo == 0)<br />
}//fin if(MejorFit == fitn<strong>es</strong>s[k])<br />
}//fin for(k)<br />
for(int i= 0; i< m_var; i++)<br />
{<br />
AuxPob[i].r<strong>es</strong>ize(lMaxVsol);<br />
AuxlRsol[i]= lReVsol[variable][i];<br />
for(int j= 0; j< lMaxVsol; j++) AuxPob[i][j]= PobIni[variable][i][j];<br />
}//fin for(i)<br />
}//fin Mejor_Sol<br />
void Ruleta(int &Sumfit, const int &TamPob, vector &fitn<strong>es</strong>s)<br />
{<br />
Sumfit = 0;<br />
for(int k= 0; k< TamPob; k++) Sumfit= Sumfit + fitn<strong>es</strong>s[k];<br />
for(int k= 0; k< TamPob; k++) fitn<strong>es</strong>s[k]= Sumfit - fitn<strong>es</strong>s[k];<br />
Sumfit = 0;<br />
for(int k= 0; k< TamPob; k++) Sumfit= Sumfit + fitn<strong>es</strong>s[k];<br />
}//fin Ruleta<br />
void eligo_padre(int &TamPob, int &Padre, vector &fitn<strong>es</strong>s)<br />
{<br />
int limInf, limSup, coinci<strong>de</strong>n;<br />
coinci<strong>de</strong>n= 0;<br />
limInf = 0;<br />
limSup = fitn<strong>es</strong>s[0];<br />
for(int i= 0; i
}<br />
else<br />
}<br />
{<br />
limInf = limInf + fitn<strong>es</strong>s[i];<br />
limSup = limSup + fitn<strong>es</strong>s[i+1];<br />
}<br />
}//fin eligo_padre<br />
void Cruce(const int &m_var, const int &lMaxVsol,<br />
{<br />
vector &AuxPob,<br />
vector &lReVsolIzq, vector &lReVsolDer,<br />
vector &AuxlRsol, vector &PobIniIzq,<br />
vector &PobIniDer)<br />
int minimo, columna, longitud;<br />
for(int i= 0; i< m_var; i++)<br />
{<br />
AuxPob[i].r<strong>es</strong>ize(lMaxVsol);<br />
minimo= min(lReVsolIzq[i],lReVsolDer[i]);<br />
AuxlRsol[i]= minimo;<br />
for(int j= 0; j< minimo; j++)<br />
{<br />
columna= rand() % 2;<br />
if(columna == 0) AuxPob[i][j]= PobIniIzq[i][j];<br />
else AuxPob[i][j]= PobIniDer[i][j];<br />
}//fin for(j)<br />
longitud= lMaxVsol - minimo;<br />
columna= longitud +1;<br />
columna= rand() % columna;<br />
if(lReVsolIzq[i]< lReVsolDer[i])<br />
{<br />
143
for(int j= 0; j< columna; j++)<br />
{<br />
AuxPob[i][minimo+j]= PobIniDer[i][minimo+j];<br />
if(AuxPob[i][minimo+j]!= 2) AuxlRsol[i]= AuxlRsol[i] +1;<br />
}//fin for(j)<br />
for(int j= columna; j< longitud; j++) AuxPob[i][minimo+j]= 2;<br />
}//fin if<br />
else<br />
{<br />
for(int j= 0; j< columna; j++)<br />
{<br />
AuxPob[i][minimo+j]= PobIniIzq[i][minimo+j];<br />
if(AuxPob[i][minimo+j]!= 2) AuxlRsol[i] = AuxlRsol[i] +1;<br />
}//fin for(j)<br />
for(int j= columna; j< longitud; j++) AuxPob[i][minimo+j] = 2;<br />
}//fin else<br />
}//fin for(i)<br />
}//fin cruce<br />
void Mutacion(const int &m_var, const int &lMaxVsol, int &muto,<br />
{<br />
vector &AuxPob, vector &AuxlRsol)<br />
for(int i= 0; i< m_var; i++){<br />
for(int j= 0; j< lMaxVsol; j++)<br />
{<br />
muto= rand() % lMaxVsol;<br />
if(muto == 0) AuxPob[i][j]= rand() % 3;<br />
}//fin for (j)<br />
AuxlRsol[i]= lMaxVsol;<br />
reor<strong>de</strong>no(lMaxVsol, AuxPob[i],AuxlRsol[i]);<br />
}//fin for(i)<br />
}//fin Mutacion<br />
144
Apéndice B<br />
El Algoritmo Genero Problema<br />
// //////////////////////////////////////////////////////////// //<br />
// / / //<br />
// / Un Algoritmo que Genera <strong>Sistemas</strong> <strong>de</strong> ‘‘Word Ecuations’’ / //<br />
// / / //<br />
// //////////////////////////////////////////////////////////// //<br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
using nam<strong>es</strong>pace std;<br />
void Pedir_Datos(string &sistema, string &solucion<strong>es</strong>,<br />
int &n_ec, int &lmax_ec,<br />
int &m_var, int &lmax_var);<br />
void Genero_Ca<strong>de</strong>nas(const int &SumaLong, const int &lmax_ec,<br />
vector &Ecizq, vector &Ec<strong>de</strong>r,<br />
int &l_ecizq, int &l_ec<strong>de</strong>r);<br />
void ruleta(const int &SumaLong, const int &lmax_ec, int &l_ec);<br />
145
void Def_variable(const int &n_ec, const int &m_var,<br />
const int &lmax_var, vector &l_ec,<br />
vector &Ec, vector &l_var,<br />
vector &Var, int &contador);<br />
void insertar(const int &k,int &posicion, int &a, vector &v);<br />
void sustituir(const int &k, int &posicion, int &a,<br />
const int &b,vector &v);<br />
void recorro_ec(int &contador, const int &k, int &l_ec,<br />
const int &lmax_var, const int &l_var,<br />
const vector &Var, vector &Ec);<br />
void mejora(int &l_ecizq, vector &Ecizq,<br />
const int &SumaLong, int &l_ec<strong>de</strong>r, vector &Ec<strong>de</strong>r,<br />
const int &lmax_var, const vector &l_var,<br />
const vector Var,<br />
const int &lmax_ec, const int &m_var);<br />
void Simplifica(const int &n_ec, vector &l_ec,<br />
int main(void)<br />
{<br />
string sistema;<br />
string solucion<strong>es</strong>;<br />
int i, j, k, l, m;<br />
int probabilidad;<br />
vector &Ec);<br />
int n_ec, lmax_ec, m_var, lmax_var;<br />
int indice, posicion, auxiliar, contador, coinci<strong>de</strong>ncia, coinci<strong>de</strong>n;<br />
146
int SumaLong;<br />
vector Ec;<br />
vector Var;<br />
vector l_ec;<br />
vector l_var;<br />
randomize();<br />
Pedir_Datos(sistema, solucion<strong>es</strong>, n_ec, lmax_ec, m_var, lmax_var);<br />
fstream fprob(sistema.c_str(),ios::out);<br />
fstream fsol(solucion<strong>es</strong>.c_str(),ios::out);<br />
fsol
ecorro_ec(contador, k, l_ec[i], lmax_var, l_var[k],<br />
if(contador
for(i= 0; i< m_var; i++)<br />
{<br />
if(l_var[i] == 0) fsol
do{<br />
cout
limSup = sum;<br />
l_ec = 0;<br />
for(int j= 0; j< lmax_ec && l_ec == 0; j++)<br />
if(limInf0; k++)<br />
{<br />
do{<br />
indice = 2 * n_ec;<br />
indice = rand() % indice;<br />
posicion = rand() % l_ec[indice];<br />
}while(Ec[indice][posicion]!=0 && Ec[indice][posicion]!=1);<br />
auxiliar = 0;<br />
for(int j= posicion; j< l_ec[indice] &&<br />
(Ec[indice][j]==0 || Ec[indice][j]==1); j++)<br />
auxiliar = auxiliar + 1;<br />
auxiliar = min(lmax_var,auxiliar) +1;<br />
151
l_var[k] = rand() % auxiliar;<br />
Var[k].r<strong>es</strong>ize(l_var[k]);<br />
if(l_var[k]==0) insertar( k, posicion, l_ec[indice], Ec[indice]);<br />
else<br />
{<br />
auxiliar = 0;<br />
for(int j= posicion; j< posicion +l_var[k]; j++)<br />
{<br />
Var[k][auxiliar]= Ec[indice][j];<br />
auxiliar= auxiliar +1;<br />
}//fin for(j)<br />
sustituir(k, posicion, l_ec[indice], l_var[k], Ec[indice]);<br />
}//else<br />
contador = contador -l_var[k];<br />
}//fin for(k)<br />
}//fin void Def_variable<br />
void insertar(const int &k,int &posicion, int &a, vector &v)<br />
{<br />
a = a+1;<br />
v.r<strong>es</strong>ize(a);<br />
for(int l = a-1; l> posicion; l--) v[l] = v[l-1];<br />
v[posicion] = k+3;<br />
}//fin insertar<br />
void sustituir(const int &k,int &posicion,int &a,const int &b,<br />
{<br />
v[posicion]= k+3;<br />
a = a -b +1;<br />
vector &v)<br />
for(int l= posicion; l< a-1; l++) v[l+1]=v[l+b];<br />
v.r<strong>es</strong>ize(a);<br />
152
}// fin sustituir<br />
void recorro_ec(int &contador, const int &k, int &l_ec,<br />
{<br />
const int &lmax_var, const int &l_var,<br />
const vector &Var, vector &Ec)<br />
int coinci<strong>de</strong>ncia, probabilidad, auxiliar, posicion;<br />
coinci<strong>de</strong>ncia = 1;<br />
for(int j= 0; j< l_ec && coinci<strong>de</strong>ncia == 1; j++)<br />
if(l_var==0)<br />
{<br />
}<br />
else<br />
{<br />
if((Ec[j] == 0 || Ec[j] == 1) && (Ec[j-1] != k+3))<br />
{<br />
probabilidad = 4*lmax_var;<br />
probabilidad = rand() % probabilidad;<br />
if(probabilidad == 0)<br />
{<br />
insertar( k, j, l_ec, Ec);<br />
j=j+1;<br />
}//fin if<br />
}//fin if<br />
auxiliar=l_ec-j;<br />
if(l_var > auxiliar) coinci<strong>de</strong>ncia = 0;<br />
else<br />
{<br />
auxiliar = 0;<br />
coinci<strong>de</strong>ncia = 1;<br />
posicion = j;<br />
for(int l= posicion;l< posicion +l_var && coinci<strong>de</strong>ncia == 1; l++)<br />
153
if(Ec[l] != Var[auxiliar]) coinci<strong>de</strong>ncia = 0;<br />
else auxiliar = auxiliar + 1;<br />
}//fin else<br />
if(coinci<strong>de</strong>ncia == 1)<br />
{<br />
// * Cambio con probabilidad l_var[k]/lmax_var *<br />
probabilidad = rand() % lmax_var;<br />
probabilidad = probabilidad + 1;<br />
if(probabilidad
cont_<strong>de</strong>r = 0;<br />
for(int j= 0; j< l_ec<strong>de</strong>r; j++)<br />
if(Ec<strong>de</strong>r[j]!=0 && Ec<strong>de</strong>r[j]!=1) cont_<strong>de</strong>r = cont_<strong>de</strong>r +1;<br />
if(cont_<strong>de</strong>r == 0)<br />
for(int k= 0; k< m_var && contador> 0; k++)<br />
recorro_ec(cont_<strong>de</strong>r, k, l_ec<strong>de</strong>r, lmax_var, l_var[k],Var[k], Ec<strong>de</strong>r);<br />
if(l_ecizq == l_ec<strong>de</strong>r)<br />
{<br />
coinci<strong>de</strong>n= 1;<br />
for(int j= 0; j< l_ecizq && coinci<strong>de</strong>n == 1; j++)<br />
if(Ecizq[j]!=Ec<strong>de</strong>r[j]) coinci<strong>de</strong>n=0;<br />
if(coinci<strong>de</strong>n == 1) // * <strong>de</strong>fino una nueva ecuacion *<br />
{<br />
Genero_Ca<strong>de</strong>nas(SumaLong,lmax_ec,Ecizq,Ec<strong>de</strong>r,l_ecizq,l_ec<strong>de</strong>r);<br />
contador= 2*l_ecizq;<br />
for(int k= 0; k< m_var && contador> 0; k++)<br />
{<br />
recorro_ec(contador, k, l_ecizq, lmax_var, l_var[k],<br />
recorro_ec(contador, k, l_ec<strong>de</strong>r, lmax_var, l_var[k],<br />
}//fin for(k)<br />
}//fin if(coinci<strong>de</strong>n == 1)<br />
}//fin if(l_ecizq == l_ec<strong>de</strong>r)<br />
}while(coinci<strong>de</strong>n == 1 || cont_izq == 0 || cont_<strong>de</strong>r == 0);<br />
}//fin mejora<br />
void Simplifica(const int &n_ec, vector &l_ec,<br />
{<br />
int coinci<strong>de</strong>ncia, columnas, minimo;<br />
vector &Ec)<br />
155<br />
Var[k], Ecizq);<br />
Var[k], Ec<strong>de</strong>r);
for(int i= 0; i< 2*n_ec - 1; i+= 2)<br />
{<br />
coinci<strong>de</strong>ncia= 0; columnas= 0; minimo= min (l_ec[i],l_ec[i+1]);<br />
while(Ec[i][columnas]== Ec[i+1][columnas] && columnas< minimo)<br />
{<br />
coinci<strong>de</strong>ncia= coinci<strong>de</strong>ncia +1; columnas= columnas +1;<br />
}//fin while<br />
if(coinci<strong>de</strong>ncia!=0)<br />
{<br />
l_ec[i]= l_ec[i]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i]; j++)<br />
Ec[i][j]= Ec[i][j+coinci<strong>de</strong>ncia];<br />
Ec[i].r<strong>es</strong>ize(l_ec[i]);<br />
l_ec[i+1]= l_ec[i+1]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i+1]; j++)<br />
Ec[i+1][j]= Ec[i+1][j+coinci<strong>de</strong>ncia];<br />
Ec[i+1].r<strong>es</strong>ize(l_ec[i+1]);<br />
}//fin if<br />
coinci<strong>de</strong>ncia= 0; columnas= 1; minimo= min (l_ec[i],l_ec[i+1]);<br />
while(columnas
Apéndice C<br />
Los problemas propu<strong>es</strong>tos<br />
En el capítulo <strong>de</strong> experimentos hacemos referencia a una ca<strong>de</strong>na <strong>de</strong> problemas que<br />
hemos seleccionado para <strong>es</strong>tudiar el comportamiento <strong>de</strong>l algoritmo genético diseñado.<br />
Estos son algunos <strong>de</strong> los problemas propu<strong>es</strong>tos:<br />
C.1. El problema 10-15-3<br />
Sistema <strong>de</strong> 10 “word equations” con 15 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0<br />
y 3, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 3.<br />
x1x13x4x7 = x1x2x11x6<br />
x13x4x4x1x1x1x11 = x1x41x6x1x13x4<br />
x1x6x5x1 = 0x1x1x10<br />
x11 = x11<br />
x11x810x6x9x12x13 = 0x21x4x10x1x15x13<br />
x1x4x10x50x2x1x6 = x11x61x4x6x1x12x13<br />
1x1x4x11x40 = x2x81x1x3x4x120<br />
1x2x13x6x110 = x40x1x80x20x4x13<br />
0x4x310x2x6 = x8x11x8x31x1x120x1<br />
x5x6x1x1x13 = x2x5x14x70<br />
157
C.2. El problema 10-15-5<br />
Sistema <strong>de</strong> 10 “word equations” con 15 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0<br />
y 5, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 5.<br />
x3x6x5x1701 = x121x15x161x1200x111x9x14x1<br />
x10x50x90 = x10x5x9x170x12<br />
1x12x3x4x8x90 = x171x120x15x5x160x41x9x170<br />
x9x111 = x91<br />
0 = x160<br />
x6x3x12x10x10 = 1x1610x9x15x3<br />
x5x1101x50x70 = x8x5x3x11x170<br />
1x90x90x9x4x13 = x10x900x11x120x1400<br />
x12 = x4x9<br />
10x131x30x10x70 = 1x9x8101x6<br />
C.3. El problema 10-3-3<br />
Sistema <strong>de</strong> 10 “word equations” con 3 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
3, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 3.<br />
x400100x301x3 = 1000100x301x3<br />
x4x40101x4x50 = x410010x31010<br />
00x3 = 00110<br />
0x5x401x40x30 = 0x4x30x30x30<br />
11x300x4 = 11x30010<br />
1001 = x401<br />
10001x3x41x30 = x4001x3x5x30<br />
x4x401000010 = x4x4010000x4<br />
010x4000000 = 0x410000000<br />
1100010x4x41 = 11000x50x5<br />
La solución propu<strong>es</strong>ta <strong>es</strong>: x3 = 110 x4 = 10 x5 = 101<br />
158
C.4. El problema 10-5-1<br />
Sistema <strong>de</strong> 10 “word equations” con 5 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
1, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 1.<br />
x3x61x3x61x31 = x4x61x61x5<br />
x31x61x40x40 = x31x61x60x30<br />
x311x4x61x301 = 5x5x31x3x60x31<br />
x4x60x410x300 = x7x61x600x60<br />
x3101x60 = x5x40x10<br />
x30x611x70 = x3x60x31100<br />
x40x30x60 = x7x3x40x30<br />
x4x6100x31 = x5x300x41<br />
x7x60x4x60x30 = x3x4000x30<br />
x7x31x3x610x30 = x7x3x61x3x4x610x30<br />
La solución propu<strong>es</strong>ta <strong>es</strong>:<br />
C.5. El problema 10-5-2<br />
x3 = Λ x4 = Λ<br />
x5 = 1 x6 = Λ x7 = 0<br />
Sistema <strong>de</strong> 10 “word equations” con 5 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
2, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 2.<br />
x41x4 = x61<br />
x40x4010x41x41x4 = x5x40x41011<br />
0x50 = x50x40x6<br />
1x6 = x41<br />
x4x6111 = 111x4<br />
x71x4 = x51<br />
x611x5 = 110<br />
x4 = Λ<br />
x60x5x50x4x600 = 0x7x7x7x5x5<br />
x3x7 = x6100<br />
159
La solución propu<strong>es</strong>ta <strong>es</strong>: x3 = 10 x4 = Λ<br />
C.6. El problema 10-8-3<br />
x5 = 0 x6 = Λ x7 = 0<br />
Sistema <strong>de</strong> 10 “word equations” con 8 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
3, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 3.<br />
1x80x7 = 1x901<br />
0x3 = 0x4x81<br />
x5011 = x50x7x5x7<br />
x90x3000 = 0x3000<br />
0x40x40x90x50 = x90x5x10x8x1000<br />
00100x90 = 00x1000<br />
x60 = x4x30<br />
x4x10000 = x3000x50<br />
x10x80x900x50 = x400x90x900<br />
0x3x50x51 = 0x8x7x401<br />
C.7. El problema 10-8-5<br />
Sistema <strong>de</strong> 10 “word equations” con 8 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
5, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 5.<br />
0011x3111 = 0x30x8x81<br />
x4x9x31 = x40x411<br />
01x7x50111 = x5x3x10x300011x3x1<br />
0x91x5001 = x300x8x3x4000x41<br />
x81x51x611 = x81x301x6x8<br />
0x51x5x5x5 = x501x500<br />
000x9x30 = x50x50x410<br />
0x3x4x10x5 = x3x9x5x5010<br />
1x91x710 = 101x10x90<br />
x51x50 = 0x310x5<br />
160
C.8. El problema 12-6-4<br />
Sistema <strong>de</strong> 12 “word equations” con 6 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
4, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 4.<br />
x501x8 = x50x710<br />
111 = 1x711<br />
x41x8101x81x8 = 1010x4x710x41x8<br />
x711x500 = 11x500<br />
x811x310 = 0x411x3x410<br />
101x80110x411 = 1010011011<br />
x80x41 = 0x81<br />
1x6x701x4100 = 1x6x4x70x6<br />
x7x811x70x31 = 0110x31<br />
x4x61 = x61<br />
0x4x710x4x71001 = 01x401001<br />
000x3 = 0x80x3<br />
C.9. El problema 15-12-4<br />
Sistema <strong>de</strong> 15 “word equations” con 12 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0<br />
y 4, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 4.<br />
11x5x13x3x9x12x3x10x13 = 1x611x50x9x121x90<br />
0x70000 = 00x3x9000<br />
1x130x3x120x12x13x511 = x101x5x6x12x8011x90x12x3x5x12<br />
x4x40 = x50x6100x5100<br />
x611x411x3x4x300x12 = x61x9x12x41x120x120x5x7x8<br />
x6x101x130x4x70x8 = x6x10x12x3x10x1410x3x140x4x50x90x30x5x71<br />
x910x12x5x13x4 = x7x131x120x4<br />
x6x50x4x140x3x12 = x3x8001<br />
0x4x71x91x60x50 = x1400x610x31x141x900<br />
x50x301x30 = 0x3x4<br />
x41x61x3x1401x6x71x10x12 = x41x71x140x12x121<br />
161
x50x1100 = 011x7x141x60x500<br />
x10011 = 0x12x51<br />
1x91x130x1411 = 1x10x141x3x13x30x141x91<br />
x12x12x4x50x3x141x7x12x4 = x1210x1200x91x31x4<br />
C.10. El problema 15-25-5<br />
Sistema <strong>de</strong> 15 “word equations” con 25 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0<br />
y 5, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 5.<br />
x1701000100x241x18 = x3x2011x160x201x300x200100111<br />
x810x2601x20000x10 = x3x1001x1801x12x19001x2010x230<br />
1x4x41x251x14 = x11x311x181x191x12111x100x19<br />
x8x121x10 = 0x201<br />
x14x160x2511x19011x3 = x19x201x30x10011011<br />
x1111x10x191x100x15x5 = x4x400x12x16x2001x201x25110<br />
x51x201 = x251x4011x12x25x10<br />
x8x9 = x2501x18x250x181<br />
x1500001x180x1000x3x1211x21 = 0x120x101000x190x181x1311x12x201x161<br />
x11x11x161x1610 = 1x22<br />
x121x16x190x2001x100x201x18101x121x200x191x3 = x14010x25110110x161<br />
010x1800x191x160x11x6 = x3x200x16x201x270x121x1001x18010x10x121<br />
1x3x191010011x12x250x16100x10 = x4x3x120x3x1010x180x16x201101x1900x25<br />
x2001x7x121 = x61x17<br />
x1910x25010x2510x8 = 100x2010100<br />
162
C.11. El problema 15-7-5<br />
Sistema <strong>de</strong> 15 “word equations” con 7 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
5, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 5.<br />
10x900x40000 = 10x7x4000000<br />
x8x31 = 10x3x9<br />
x40x7 = 001<br />
x7x50000x4x9 = x7x5000001<br />
00010 = 000x9x4<br />
11x60x4x40 = x91x60x40x4<br />
x810x80x5 = 1010x700x5<br />
x9 = 1<br />
x400x8x411 = 0001x6<br />
0x7x41x4 = 0x90x70<br />
0x711x4x7 = 01x9101<br />
x70x4x90x80 = x900x701x40<br />
x5x80001 = x5100001<br />
x60 = 001x7x4<br />
0x5x51 = 0x5x5x7<br />
163
C.12. El problema 25-23-4<br />
Sistema <strong>de</strong> 25 “word equations” con 23 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0<br />
y 4, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 4.<br />
x9x13x7x14x9x30x7x5x13x19x25 = x9x7x6x230x9x5x25x5x9x41x9<br />
x22x7x7x3x13x3x9x6x9x13x4x22 = x22x4x4x16x21x3x9x13x4x18x60<br />
0x70x140x21x40 = x24010x15x10x25x7x13x5x22<br />
x5x1010x4x7x22x12x3 = x1301x4x20x22x9<br />
x221x24x25x3x16x3x9 = x9x140x3x25x3x3<br />
1x4x3 = x4x4x3<br />
x21x9x4x14x3x7x4x3x4x7x9 = x10x231x18x12x3x4x191x3x6x22<br />
x60x9 = 1x15x22x9<br />
x18x22x18x13 = x16x10x251<br />
1x10x18x30x6x240x10x19x21x3 = x51x3x3x4x4x9x13x220<br />
1x91 = x231x17<br />
x71x22x14x251x16x15x3x15 = x8x7x18x10x15x3x40x9x4<br />
x7x2400x5x4x22x6x9x8x14x16 = x7x100x22x130x8x7x4x100x5x13x90<br />
x3x3x6x40x14x5x15 = x3x11x40x6<br />
x6x7x4 = x4x4x4x21<br />
x6x9x9x18x4x7x6x41x4x5x14x4x25 = x14x4x30x51x5x7x4x5x7x5x21x13x4x4x210<br />
x15x4x4 = x5x10x14x5x7x13<br />
x51x5x9x21 = x15x25x7<br />
x21 = x15<br />
x21x3x6x25x7 = x7x18x9x13x10x7x17<br />
x7x4x9x410x19x15x16x15x4x18 = x13x40x4x130x400x7x5x130<br />
x7x50x14x4x6 = x24x5x241x22x6x13x4<br />
0x7x9x7x18x40x6x5x7x5x7x5x7x6 = 0x7x9x21x251x18x15x5x6x12x4x14<br />
x4x3x5x13x10x12x12x3x30x7 = x7x9x100x7x4x4x6x16x25x9x22x14<br />
x21x22x15 = x4x9x13<br />
164
C.13. El problema 25-8-3<br />
Sistema <strong>de</strong> 25 “word equations” con 8 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
3, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 3.<br />
x70 = x6x8x500<br />
1x3x3x10x7x4x3x9x9 = 1x8x31x3x3x40x3x3<br />
x9 = 0<br />
11x4x8x3x61x8x50 = x6x10x10x3x10x10x3x3x100x60<br />
x3x5x91x3x30 = x3x81x7x8<br />
x101x10x3x10x10x3x7x5x8x3x10x8 = x1011x4x90x3x3x81x3<br />
1x401x8x9x3x3 = 1x401x3x8x3x9<br />
1x61x3x3x10x8 = 1x10x71x3<br />
x51x8 = x61x3<br />
x6x8x60x4x4x10x10x41 = 0x3x31x61x4x101x5x4x10<br />
x7x610x51x31x6x8x30x3x91x9 = x9x9x10x9101x3x3x5x70x10x9<br />
x9x10x9x31x8 = x31x3x81x3<br />
11x40x7x30x100 = x101x40x30x7x10x3<br />
11x3x8x10 = 11x8x31<br />
1x301x3 = x10x8x3x10x50<br />
0x80x10x4x10x7x10x91 = 0x9x31x4x10x71x31<br />
x8x311x311x10x10 = x8x3x10x5x10x41x5x61<br />
x10x8x7 = x10x3x7<br />
x10x10x90x3 = 1x5x6x100x7<br />
x9 = 0<br />
x41x71 = x3x1011x71<br />
x10x8x3x50x8x3x3x4 = x10x70x3x9x9x3x10x10<br />
x71x41 = x3x31x4x10<br />
x8x70x50 = 0x5x6x9x3x6x7<br />
101x5x710x9x3 = 1x31x71x50x50x8<br />
165
C.14. El problema 25-8-5<br />
Sistema <strong>de</strong> 25 “word equations” con 8 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
5, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 5.<br />
1x3x50 = x6x90x10<br />
x401000x4000x401110 = 0x1000x911x40<br />
1x8 = x60<br />
11x81x30 = 1x601x30<br />
1x90x4100 = 1000x41x40x10<br />
x8110x311 = x8x4110x311<br />
x7111x6 = x71111x4110<br />
00x10x4001 = 00100001<br />
0101x4x601x41x41 = 0101x60111<br />
x1000 = 10000<br />
001x40 = 0010<br />
0x60x61000 = 0x601x700<br />
1x410x10x10111 = x7x40x10111<br />
x41 = 1<br />
x9000 = 000x41x4000<br />
1011110x51 = 101x6x51<br />
110x4101001 = x71001<br />
11011111x6 = 110x411111111x40<br />
x41x700000 = x610x400000<br />
111111x410 = 1111x6<br />
x10x4001x3011 = x410x4x9x3011<br />
00001x31x411 = 00001x3111<br />
x4000 = 000<br />
x40x1000x9x9 = 0x10000x4001x9<br />
0001x400 = 000x10<br />
166
C.15. El problema 5-15-3<br />
Sistema <strong>de</strong> 5 “word equations” con 15 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
3, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 3.<br />
x1210110x150x160 = 001011001x8<br />
x61110x91000100 = x51x31x51x1100x90100x11<br />
x4x40x91x13 = x9x141x901x7<br />
x301001000x111001x6 = x401x90010001x110010<br />
x10x10x110x90100 = x4x17x10001x1100x9<br />
C.16. El problema 5-3-2<br />
Sistema <strong>de</strong> 5 “word equations” con 3 variabl<strong>es</strong> <strong>de</strong> longitu<strong>de</strong>s comprendidas entre 0 y<br />
2, siendo al menos una <strong>de</strong> ellas una ca<strong>de</strong>na <strong>de</strong> longitud 2.<br />
10 = x3x4<br />
x51 = 0x31x3<br />
x3011001 = 011001x3<br />
x30 = x5<br />
x5 = x30<br />
La solución propu<strong>es</strong>ta <strong>es</strong>:<br />
x3 = Λ<br />
x4 = 10<br />
x5 = 0<br />
167
Apéndice D<br />
A.E. Sólo Mutación<br />
// //////////////////////////////////////////////////////////// //<br />
// / / //<br />
// / Un Algoritmo Evolutivo para R<strong>es</strong>olver el problema l_SWES / //<br />
// / / //<br />
// / (SÓLO MUTACIÓN) / //<br />
// / / //<br />
// //////////////////////////////////////////////////////////// //<br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
using nam<strong>es</strong>pace std;<br />
fstream fsol;<br />
void Pedir_Datos(string &problema, int &lMaxVsol,<br />
int &NMaxIter, int &Metodo);<br />
void Lee_Prob(const string &problema, int &n_ec, int &m_var,<br />
vector &l_ec, vector &Sist);<br />
168
void Simplifica(const int &n_ec, vector &l_ec,<br />
vector &Sist);<br />
void Genera_PobIni(vector &PobIni,<br />
vector &lReVsol,<br />
vector &AuxPob, const int &m_var,<br />
const int &lMaxVsol, const int &Metodo);<br />
void reor<strong>de</strong>no(const int &l, vector &v, int &lReVsol);<br />
void Evalua(const int &n_ec, const vector &l_ec,<br />
const vector &Sist, const vector &lReVsol,<br />
const vector &PobIni, vector &AuxIzq,<br />
void sustituyo(const vector &Sist, int &lAux,<br />
vector &AuxDer, int &fitn<strong>es</strong>s, int &haysol);<br />
vector &Aux, const vector &lVsol,<br />
const vector &PobIni);<br />
void Mutacion(const int &m_var, const int &lMaxVsol,<br />
int main()<br />
{<br />
string problema;<br />
int lMaxVsol, NMaxIter, Metodo, Npruebas;<br />
int n_ec, m_var;<br />
int fitn<strong>es</strong>s, AuxFit, haysol;<br />
int i, j, k, iter, npru;<br />
vector l_ec;<br />
vector &AuxPob, vector &AuxlRsol);<br />
169
vector Sist;<br />
vector PobIni;<br />
vector lReVsol;<br />
vector AuxPob; //vector auxiliar<br />
vector AuxlRsol; //vector auxiliar<br />
vector AuxIzq; //Sólo se utiliza en la función evalua<br />
vector AuxDer; //Sólo se utiliaza en la función evalua<br />
randomize();<br />
Pedir_Datos(problema, lMaxVsol, NMaxIter, Metodo);<br />
Lee_Prob(problema, n_ec, m_var, l_ec, Sist);<br />
PobIni.r<strong>es</strong>ize(m_var);<br />
lReVsol.r<strong>es</strong>ize(m_var);<br />
AuxPob.r<strong>es</strong>ize(m_var); //vector auxiliar<br />
AuxlRsol.r<strong>es</strong>ize(m_var); //vector auxiliar<br />
Simplifica(n_ec, l_ec, Sist);<br />
Genera_PobIni(PobIni, lReVsol, AuxPob, m_var, lMaxVsol, Metodo);<br />
haysol= 0;<br />
Evalua(n_ec, l_ec, Sist, lReVsol, PobIni, AuxIzq, AuxDer, fitn<strong>es</strong>s, haysol);<br />
fsol
for(i= 0; i< m_var; i++)<br />
{AuxlRsol[i]= lReVsol[i];<br />
for(j= 0;j< lMaxVsol; j++) AuxPob[i][j]= PobIni[i][j];<br />
}//fin for(i)<br />
for(iter= 0; iter< NMaxIter && haysol == 0; iter++)<br />
{<br />
Mutacion(m_var, lMaxVsol, AuxPob, AuxlRsol);<br />
Evalua(n_ec, l_ec, Sist, AuxlRsol, AuxPob, AuxIzq, AuxDer, AuxFit,haysol);<br />
if(AuxFit < fitn<strong>es</strong>s)<br />
{<br />
}<br />
else<br />
{<br />
}<br />
for(i= 0; i< m_var; i++)<br />
{lReVsol[i] = AuxlRsol[i];<br />
for(j= 0;j< lMaxVsol; j++) PobIni[i][j] = AuxPob[i][j];<br />
}//fin for(i)<br />
fitn<strong>es</strong>s = AuxFit;<br />
for(i= 0; i< m_var; i++)<br />
{AuxlRsol[i] = lReVsol[i];<br />
for(j= 0;j< lMaxVsol; j++) AuxPob[i][j] = PobIni[i][j];<br />
}//fin for(i)<br />
AuxFit = fitn<strong>es</strong>s;<br />
}//fin for(iter)<br />
if(haysol == 1)<br />
{<br />
fsol
fsol
do{<br />
do{<br />
cout
coutn_ec; fprob>>m_var;<br />
l_ec.r<strong>es</strong>ize(2*n_ec);<br />
Sist.r<strong>es</strong>ize(2*n_ec);<br />
for(int i= 0; i< 2*n_ec; i++){<br />
fprob>>l_ec[i]; Sist[i].r<strong>es</strong>ize(l_ec[i]);<br />
vector &l_ec, vector &Sist)<br />
for(int j= 0; j< l_ec[i]; j++) fprob>>Sist[i][j];<br />
}//fin for(i)<br />
}//fin Lee_Prob<br />
void Simplifica(const int &n_ec, vector &l_ec,<br />
{<br />
int coinci<strong>de</strong>ncia, columnas, minimo;<br />
for(int i= 0; i< 2*n_ec - 1; i+= 2)<br />
{<br />
vector &Sist)<br />
coinci<strong>de</strong>ncia= 0; columnas= 0; minimo= min (l_ec[i],l_ec[i+1]);<br />
while(Sist[i][columnas]== Sist[i+1][columnas] && columnas< minimo)<br />
{coinci<strong>de</strong>ncia= coinci<strong>de</strong>ncia +1; columnas= columnas +1; }//fin while<br />
if(coinci<strong>de</strong>ncia!=0)<br />
{<br />
l_ec[i]= l_ec[i]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i]; j++)<br />
174
Sist[i][j]= Sist[i][j+coinci<strong>de</strong>ncia];<br />
Sist[i].r<strong>es</strong>ize(l_ec[i]);<br />
l_ec[i+1]= l_ec[i+1]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i+1]; j++)<br />
Sist[i+1][j]= Sist[i+1][j+coinci<strong>de</strong>ncia];<br />
Sist[i+1].r<strong>es</strong>ize(l_ec[i+1]);<br />
}//fin if<br />
coinci<strong>de</strong>ncia= 0; columnas= 1; minimo= min (l_ec[i],l_ec[i+1]);<br />
while(columnas
for(int j= 0; j< lReVsol[i]; j++) PobIni[i][j]= rand() % 2;<br />
for(int j= lReVsol[i]; j< lMaxVsol; j++) PobIni[i][j]= 2;<br />
}//fin if(Metodo==1)<br />
if(Metodo == 2)<br />
{lReVsol[i]= lMaxVsol;<br />
for(int j= 0; j< lMaxVsol; j++) PobIni[i][j] = rand() % 3;<br />
reor<strong>de</strong>no(lMaxVsol, PobIni[i], lReVsol[i]);<br />
}//fin if(Metodo==2)<br />
}//fin for(i)<br />
}//fin Genera_PobIni<br />
void Evalua(const int &n_ec, const vector &l_ec,<br />
{<br />
const vector &Sist, const vector &lReVsol,<br />
const vector &PobIni, vector &AuxIzq,<br />
vector &AuxDer, int &fitn<strong>es</strong>s, int &haysol)<br />
int lAuxIzq, lAuxDer;<br />
int coinci<strong>de</strong>ncia, minimo;<br />
coinci<strong>de</strong>ncia = 0;<br />
for(int i= 0; i< n_ec; i++)<br />
{lAuxIzq= l_ec[2*i];<br />
lAuxDer= l_ec[2*i+1];<br />
AuxIzq.r<strong>es</strong>ize(lAuxIzq);<br />
AuxDer.r<strong>es</strong>ize(lAuxDer);<br />
sustituyo(Sist[2*i], lAuxIzq, AuxIzq, lReVsol, PobIni);<br />
sustituyo(Sist[2*i+1], lAuxDer, AuxDer, lReVsol, PobIni);<br />
minimo = min(lAuxIzq,lAuxDer);<br />
for(int j= 0;j< minimo; j++)<br />
if(AuxIzq[j] != AuxDer[j]) coinci<strong>de</strong>ncia= coinci<strong>de</strong>ncia+1;<br />
coinci<strong>de</strong>ncia= coinci<strong>de</strong>ncia + abs(lAuxIzq-lAuxDer);<br />
}//fin for(i)<br />
fitn<strong>es</strong>s= coinci<strong>de</strong>ncia;<br />
176
if(fitn<strong>es</strong>s == 0) haysol= 1;<br />
}//fin Evaluacion<br />
void sustituyo(const vector &Sist, int &lAux,<br />
{<br />
int auxiliar, variable;<br />
int j, l;<br />
auxiliar = 0;<br />
for(j= 0;j< lAux; j++)<br />
vector &Aux, const vector &lVsol,<br />
const vector &PobIni)<br />
if(Sist[j+auxiliar]==0 || Sist[j+auxiliar]==1) Aux[j] = Sist[j+auxiliar];<br />
else<br />
{<br />
variable = Sist[j+auxiliar] - 3;<br />
if(lVsol[variable]==0)<br />
else<br />
{lAux=lAux-1;<br />
Aux.r<strong>es</strong>ize(lAux);<br />
auxiliar=auxiliar+1;<br />
j=j-1;}<br />
{lAux=lAux+lVsol[variable]-1;<br />
Aux.r<strong>es</strong>ize(lAux);<br />
for(l= 0; l< lVsol[variable]; l++) Aux[j+l] = PobIni[variable][l];<br />
auxiliar = auxiliar - lVsol[variable] + 1;<br />
j=j+lVsol[variable]-1;}<br />
}//fin else<br />
}//fin sustituyo<br />
void Mutacion(const int &m_var, const int &lMaxVsol,<br />
{<br />
vector &AuxPob, vector &AuxlRsol)<br />
177
int muto;<br />
for(int i= 0; i< m_var; i++)<br />
{<br />
for(int j= 0; j< lMaxVsol; j++)<br />
{muto= rand() % lMaxVsol;<br />
if(muto == 0) AuxPob[i][j]= rand() % 3;}//fin for (j)<br />
AuxlRsol[i]= lMaxVsol;<br />
reor<strong>de</strong>no(lMaxVsol, AuxPob[i],AuxlRsol[i]);<br />
}//fin for(i)<br />
}//fin Mutación<br />
void reor<strong>de</strong>no(const int &l, vector &v,int &lReVsol)<br />
{<br />
// Reor<strong>de</strong>no la variable y calculo la longitud real <strong>de</strong> la misma<br />
int columna;<br />
for(int j= 0; j< l-1; j++)<br />
if(v[j] == 2)<br />
{<br />
columna= j+1;<br />
while(v[columna] == 2 && columna< l-1) columna = columna +1;<br />
if(v[columna]!= 2)<br />
{v[j]= v[columna];<br />
v[columna]= 2; }//fin if<br />
}//if(v[j] == 2)<br />
for(int j= 0; j< l; j++)<br />
if(v[j] == 2) lReVsol= lReVsol -1;<br />
}//fin reor<strong>de</strong>no<br />
178
Apéndice E<br />
A.E. Búsqueda Local<br />
// //////////////////////////////////////////////////////////// //<br />
// / / //<br />
// / Un Algoritmo Evolutivo para R<strong>es</strong>olver el problema l_SWES / //<br />
// / / //<br />
// / (BÚSQUEDA LOCAL) / //<br />
// / / //<br />
// //////////////////////////////////////////////////////////// //<br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
#inclu<strong>de</strong> #inclu<strong>de</strong> #inclu<strong>de</strong><br />
using nam<strong>es</strong>pace std;<br />
fstream fsol("solucion.dat",ios::out);<br />
void Pedir_Datos(string &problema, int &TamPob, int &lMaxVsol,<br />
int &NMaxIter, int &ProMut, int &Metodo, int &Busqueda);<br />
void Lee_Prob(const string &problema, int &n_ec, int &m_var,<br />
vector &l_ec, vector &Sist);<br />
179
void Simplifica(const int &n_ec, vector &l_ec,<br />
vector &Sist);<br />
void Genera_PobIni(vector &PobIni,<br />
vector &lReVsol,<br />
vector &AuxPob,<br />
vector &AuxlRsol,<br />
const int &TamPob, const int &m_var,<br />
const int &lMaxVsol, const int &Metodo);<br />
void reor<strong>de</strong>no(const int &l, vector &v, int &lReVsol);<br />
void Evalua(const int &n_ec, const vector &l_ec,<br />
const vector &Sist, const vector &lReVsol,<br />
const vector &PobIni, vector &AuxIzq,<br />
vector &AuxDer, int &fitn<strong>es</strong>s, int &haysol, int &prueba);<br />
void sustituyo( const vector &Sist, int &lAux,<br />
vector &Aux, const vector &lVsol,<br />
const vector &PobIni);<br />
void Mejor_Sol(int &MejorFit, vector &fitn<strong>es</strong>s,<br />
const int &TamPob, const int &m_var,<br />
vector &AuxPob, const int &lMaxVsol,<br />
vector &PobIni,<br />
vector &AuxlRsol, vector &lReVsol);<br />
void Ruleta(int &Sumfit, const int &TamPob, vector &fitn<strong>es</strong>s);<br />
void eligo_padre(int &TamPob, int &Padre, vector &fitn<strong>es</strong>s);<br />
void Cruce(const int &m_var, const int &lMaxVsol,<br />
180
vector &AuxPob,<br />
vector &lReVsolIzq, vector &lReVsolDer,<br />
vector &AuxlRsol, vector &PobIniIzq,<br />
vector &PobIniDer);<br />
void Mutacion(const int &m_var, const int &lMaxVsol, int &muto,<br />
vector &AuxPob, vector &AuxlRsol);<br />
void Busqueda_loc_A(const int &m_var, vector &lReVsol,<br />
const int &lMaxVsol, const int &n_ec,<br />
const vector &l_ec,<br />
const vector &Sist, vector &AuxIzq,<br />
vector &AuxDer, vector &PobIni,<br />
int &fitn<strong>es</strong>s, int &haysol, int &cont_uno, int &cont_dos,<br />
int &prueba);<br />
void Busqueda_loc_B(const int &m_var, vector &lReVsol,<br />
int main(void)<br />
{<br />
string problema;<br />
const int &lMaxVsol, const int &n_ec,<br />
const vector &l_ec,<br />
const vector &Sist, vector &AuxIzq,<br />
vector &AuxDer, vector &PobIni,<br />
int &fitn<strong>es</strong>s, int &haysol, int &cont_uno,int &prueba);<br />
int TamPob, lMaxVsol, NMaxIter, ProMut, Metodo, Busqueda;<br />
int n_ec, m_var;<br />
int haysol, muto;<br />
int MejorFit, Sumfit, PadreIzq, PadreDer;<br />
int i, j, k, iter;<br />
int cont_uno, cont_dos;<br />
181
int prueba; prueba=0;<br />
vector l_ec;<br />
vector Sist;<br />
vector PobIni;<br />
vector lReVsol;<br />
vector AuxPob; //vector auxiliar<br />
vector AuxlRsol; //vector auxiliar<br />
vector fitn<strong>es</strong>s;<br />
vector AuxIzq; //Sólo se utiliza en la función evalua<br />
vector AuxDer; //Sólo se utiliaza en la función evalua<br />
cont_uno = 0; cont_dos = 0;<br />
randomize();<br />
Pedir_Datos(problema, TamPob, lMaxVsol, NMaxIter, ProMut, Metodo, Busqueda);<br />
fsol
fsol
PadreIzq = rand() % Sumfit;<br />
eligo_padre(TamPob, PadreIzq, fitn<strong>es</strong>s);<br />
PadreDer = rand() % Sumfit;<br />
eligo_padre(TamPob, PadreDer, fitn<strong>es</strong>s);<br />
// * Cruce *<br />
Cruce(m_var, lMaxVsol, AuxPob[k], lReVsol[PadreIzq], lReVsol[PadreDer],<br />
// * Mutación *<br />
if(ProMut!=0)<br />
{<br />
muto = rand() %100;<br />
AuxlRsol[k], PobIni[PadreIzq], PobIni[PadreDer]);<br />
if(muto< ProMut) // * Muto la solusión k_<strong>es</strong>ima *<br />
Mutacion(m_var, lMaxVsol, muto, AuxPob[k], AuxlRsol[k]);<br />
}//fin if(ProMut!=0)<br />
}//fin for(k)<br />
for(k= 0; k< TamPob; k++)<br />
for(i= 0; i< m_var; i++)<br />
{<br />
lReVsol[k][i]= AuxlRsol[k][i];<br />
for(j= 0;j< lMaxVsol; j++) PobIni[k][i][j]= AuxPob[k][i][j];<br />
}//fin for(i)<br />
fitn<strong>es</strong>s[0]= MejorFit;<br />
for(k= 1; k
else<br />
Busqueda_loc_A(m_var, lReVsol[k], lMaxVsol, n_ec, l_ec, Sist,<br />
AuxIzq, AuxDer, PobIni[k], fitn<strong>es</strong>s[k],<br />
haysol, cont_uno, cont_dos, prueba);<br />
Busqueda_loc_B(m_var, lReVsol[k], lMaxVsol, n_ec, l_ec, Sist,<br />
}//fin for(iter)<br />
if(haysol == 1)<br />
{<br />
AuxIzq, AuxDer, PobIni[k], fitn<strong>es</strong>s[k],<br />
haysol, cont_uno,prueba);<br />
fsol
{<br />
fsol
fsol
do{<br />
cout
if(Busqueda == 3)<br />
{<br />
cout
for(int i= 0; i< 2*n_ec - 1; i+= 2)<br />
{<br />
coinci<strong>de</strong>ncia= 0; columnas= 0; minimo= min (l_ec[i],l_ec[i+1]);<br />
while(Sist[i][columnas]== Sist[i+1][columnas] && columnas< minimo)<br />
{<br />
coinci<strong>de</strong>ncia= coinci<strong>de</strong>ncia +1; columnas= columnas +1;<br />
}//fin while<br />
if(coinci<strong>de</strong>ncia!=0)<br />
{<br />
l_ec[i]= l_ec[i]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i]; j++)<br />
Sist[i][j]= Sist[i][j+coinci<strong>de</strong>ncia];<br />
Sist[i].r<strong>es</strong>ize(l_ec[i]);<br />
l_ec[i+1]= l_ec[i+1]-coinci<strong>de</strong>ncia;<br />
for(int j= 0; j< l_ec[i+1]; j++)<br />
Sist[i+1][j]= Sist[i+1][j+coinci<strong>de</strong>ncia];<br />
Sist[i+1].r<strong>es</strong>ize(l_ec[i+1]);<br />
}//fin if<br />
coinci<strong>de</strong>ncia= 0; columnas= 1; minimo= min (l_ec[i],l_ec[i+1]);<br />
while(columnas
void Genera_PobIni(vector &PobIni,<br />
{<br />
int longitud;<br />
PobIni.r<strong>es</strong>ize(TamPob);<br />
lReVsol.r<strong>es</strong>ize(TamPob);<br />
vector &lReVsol,<br />
vector &AuxPob,<br />
vector &AuxlRsol, const int &TamPob,<br />
const int &m_var, const int &lMaxVsol, const int &Metodo)<br />
AuxPob.r<strong>es</strong>ize(TamPob); //vector auxiliar<br />
AuxlRsol.r<strong>es</strong>ize(TamPob); //vector auxiliar<br />
for(int k= 0; k< TamPob; k++)<br />
{<br />
PobIni[k].r<strong>es</strong>ize(m_var);<br />
lReVsol[k].r<strong>es</strong>ize(m_var);<br />
AuxPob[k].r<strong>es</strong>ize(m_var); //vector auxiliar<br />
AuxlRsol[k].r<strong>es</strong>ize(m_var); //vector auxiliar<br />
for(int i= 0; i< m_var; i++)<br />
{<br />
PobIni[k][i].r<strong>es</strong>ize(lMaxVsol);<br />
if(Metodo == 1)<br />
{<br />
longitud= lMaxVsol +1;<br />
lReVsol[k][i]= rand() % longitud;<br />
for(int j= 0; j< lReVsol[k][i]; j++) PobIni[k][i][j]= rand() % 2;<br />
for(int j= lReVsol[k][i]; j< lMaxVsol; j++) PobIni[k][i][j]= 2;<br />
}//fin if(Metodo==1)<br />
if(Metodo == 2)<br />
{<br />
lReVsol[k][i]= lMaxVsol;<br />
for(int j= 0; j< lMaxVsol; j++) PobIni[k][i][j] = rand() % 3;<br />
191
eor<strong>de</strong>no(lMaxVsol, PobIni[k][i],lReVsol[k][i]);<br />
}//fin if(Metodo==2)<br />
}//fin for(i)<br />
}//fin for(k)<br />
}//fin Genera_PobIni<br />
void reor<strong>de</strong>no(const int &l, vector &v,int &lReVsol)<br />
{<br />
// Reor<strong>de</strong>no la variable y calculo la longitud real <strong>de</strong> la misma<br />
int columna;<br />
for(int j= 0; j< l-1; j++)<br />
if(v[j] == 2)<br />
{<br />
columna= j+1;<br />
while(v[columna] == 2 && columna< l-1) columna = columna +1;<br />
if(v[columna]!= 2)<br />
{<br />
v[j]= v[columna];<br />
v[columna]= 2;<br />
}//fin if<br />
}//if(v[j] == 2)<br />
for(int j= 0; j< l; j++)<br />
if(v[j] == 2) lReVsol= lReVsol -1;<br />
}//fin reor<strong>de</strong>no<br />
void Evalua(const int &n_ec, const vector &l_ec,<br />
{<br />
const vector &Sist, const vector &lReVsol,<br />
const vector &PobIni, vector &AuxIzq,<br />
vector &AuxDer, int &fitn<strong>es</strong>s, int &haysol,int &prueba)<br />
int lAuxIzq, lAuxDer;<br />
int coinci<strong>de</strong>ncia, minimo;<br />
192
prueba=prueba+1;<br />
coinci<strong>de</strong>ncia = 0;<br />
for(int i= 0; i
{<br />
}<br />
else<br />
{<br />
}<br />
lAux=lAux-1;<br />
Aux.r<strong>es</strong>ize(lAux);<br />
auxiliar=auxiliar+1;<br />
j=j-1;<br />
lAux=lAux+lVsol[variable]-1;<br />
Aux.r<strong>es</strong>ize(lAux);<br />
for(l= 0; l< lVsol[variable]; l++) Aux[j+l] = PobIni[variable][l];<br />
auxiliar = auxiliar - lVsol[variable] + 1;<br />
j=j+lVsol[variable]-1;<br />
}//fin else<br />
}//fin sustituyo<br />
void Mejor_Sol(int &MejorFit, vector &fitn<strong>es</strong>s,<br />
{<br />
int minimo, variable;<br />
variable = 0;<br />
MejorFit = fitn<strong>es</strong>s[0];<br />
const int &TamPob, const int &m_var,<br />
vector &AuxPob, const int &lMaxVsol,<br />
vector &PobIni,<br />
vector &AuxlRsol, vector &lReVsol)<br />
for(int k= 1; k< TamPob; k++)<br />
{<br />
if(fitn<strong>es</strong>s[k]< MejorFit)<br />
{<br />
MejorFit= fitn<strong>es</strong>s[k];<br />
variable= k;<br />
194
}//fin if(fitn<strong>es</strong>s[k]< MejorFit)<br />
if(MejorFit == fitn<strong>es</strong>s[k])<br />
{<br />
minimo= rand() % 2;<br />
if(minimo == 0)<br />
{<br />
MejorFit= fitn<strong>es</strong>s[k];<br />
variable= k;<br />
}//fin if(minimo == 0)<br />
}//fin if(MejorFit == fitn<strong>es</strong>s[k])<br />
}//fin for(k)<br />
for(int i= 0; i< m_var; i++)<br />
{<br />
AuxPob[i].r<strong>es</strong>ize(lMaxVsol);<br />
AuxlRsol[i]= lReVsol[variable][i];<br />
for(int j= 0; j< lMaxVsol; j++) AuxPob[i][j]= PobIni[variable][i][j];<br />
}//fin for(i)<br />
}//fin Mejor_Sol<br />
void Ruleta(int &Sumfit, const int &TamPob, vector &fitn<strong>es</strong>s)<br />
{<br />
Sumfit = 0;<br />
for(int k= 0; k< TamPob; k++) Sumfit= Sumfit + fitn<strong>es</strong>s[k];<br />
for(int k= 0; k< TamPob; k++) fitn<strong>es</strong>s[k]= Sumfit - fitn<strong>es</strong>s[k];<br />
Sumfit = 0;<br />
for(int k= 0; k< TamPob; k++) Sumfit= Sumfit + fitn<strong>es</strong>s[k];<br />
}//fin Ruleta<br />
void eligo_padre(int &TamPob, int &Padre, vector &fitn<strong>es</strong>s)<br />
{<br />
int limInf, limSup, coinci<strong>de</strong>n;<br />
coinci<strong>de</strong>n= 0;<br />
195
limInf = 0;<br />
limSup = fitn<strong>es</strong>s[0];<br />
for(int i= 0; i
if(columna == 0) AuxPob[i][j]= PobIniIzq[i][j];<br />
else AuxPob[i][j]= PobIniDer[i][j];<br />
}//fin for(j)<br />
longitud= lMaxVsol - minimo;<br />
columna= longitud +1;<br />
columna= rand() % columna;<br />
if(lReVsolIzq[i]< lReVsolDer[i])<br />
{<br />
for(int j= 0; j< columna; j++)<br />
{<br />
AuxPob[i][minimo+j]= PobIniDer[i][minimo+j];<br />
if(AuxPob[i][minimo+j]!= 2) AuxlRsol[i]= AuxlRsol[i] +1;<br />
}//fin for(j)<br />
for(int j= columna; j< longitud; j++) AuxPob[i][minimo+j]= 2;<br />
}//fin if<br />
else<br />
{<br />
for(int j= 0; j< columna; j++)<br />
{<br />
AuxPob[i][minimo+j]= PobIniIzq[i][minimo+j];<br />
if(AuxPob[i][minimo+j]!= 2) AuxlRsol[i] = AuxlRsol[i] +1;<br />
}//fin for(j)<br />
for(int j= columna; j< longitud; j++) AuxPob[i][minimo+j] = 2;<br />
}//fin else<br />
}//fin for(i)<br />
}//fin cruce<br />
void Mutacion(const int &m_var, const int &lMaxVsol, int &muto,<br />
{<br />
vector &AuxPob, vector &AuxlRsol)<br />
for(int i= 0; i< m_var; i++){<br />
for(int j= 0; j< lMaxVsol; j++)<br />
197
{<br />
muto= rand() % lMaxVsol;<br />
if(muto == 0) AuxPob[i][j]= rand() % 3;<br />
}//fin for (j)<br />
AuxlRsol[i]= lMaxVsol;<br />
reor<strong>de</strong>no(lMaxVsol, AuxPob[i],AuxlRsol[i]);<br />
}//fin for(i)<br />
}//fin Mutacion<br />
void Busqueda_loc_A(const int &m_var, vector &lReVsol,<br />
{<br />
const int &lMaxVsol, const int &n_ec,<br />
const vector &l_ec, const vector &Sist,<br />
vector &AuxIzq, vector &AuxDer,<br />
vector &PobIni, int &fitn<strong>es</strong>s, int &haysol,<br />
int &cont_uno, int &cont_dos, int &prueba)<br />
int mejoro, repito, MejorFit, columna, valor, vizq, v<strong>de</strong>r;<br />
do{<br />
cont_uno = cont_uno +1;<br />
repito = 0;<br />
do{<br />
cont_dos = cont_dos +1;<br />
mejoro = 0;<br />
for(int i= 0; i< m_var && fitn<strong>es</strong>s != 0; i++)<br />
{<br />
for(int j= 0; j< lReVsol[i]; j++)<br />
{<br />
if(PobIni[i][j] == 1) PobIni[i][j] = 0;<br />
else PobIni[i][j] = 1;<br />
MejorFit = fitn<strong>es</strong>s;<br />
Evalua(n_ec, l_ec, Sist, lReVsol, PobIni, AuxIzq, AuxDer,<br />
198<br />
fitn<strong>es</strong>s, haysol, prueba);
if(fitn<strong>es</strong>s >= MejorFit)<br />
{<br />
}<br />
fitn<strong>es</strong>s = MejorFit;<br />
if(PobIni[i][j] == 1) PobIni[i][j] = 0;<br />
else PobIni[i][j] = 1;<br />
else mejoro = 1;<br />
}//fin for(j)<br />
}//fin for(i)<br />
}while(mejoro == 1 && fitn<strong>es</strong>s != 0);<br />
for(int i= 0; i< m_var && fitn<strong>es</strong>s != 0; i++)<br />
{<br />
//Incremento la variable i_ésima<br />
columna = lReVsol[i];<br />
if(columna < lMaxVsol)<br />
{<br />
MejorFit = fitn<strong>es</strong>s;<br />
PobIni[i][columna]= 0;<br />
lReVsol[i] = columna +1;<br />
Evalua(n_ec,l_ec,Sist,lReVsol,PobIni,AuxIzq,AuxDer,fitn<strong>es</strong>s,haysol,<br />
if(MejorFit
lReVsol[i] = columna +1;<br />
Evalua(n_ec,l_ec,Sist,lReVsol,PobIni,AuxIzq,AuxDer,fitn<strong>es</strong>s,<br />
haysol,prueba);<br />
if(MejorFit 0 && fitn<strong>es</strong>s != 0)<br />
{<br />
valor = PobIni[i][columna -1];<br />
if(columna < lMaxVsol) v<strong>de</strong>r = PobIni[i][columna];<br />
PobIni[i][columna -1]= 2;<br />
if(columna < lMaxVsol) PobIni[i][columna]= 2;<br />
MejorFit = fitn<strong>es</strong>s;<br />
lReVsol[i] = columna -1;<br />
Evalua(n_ec,l_ec,Sist,lReVsol,PobIni,AuxIzq,AuxDer,fitn<strong>es</strong>s,haysol,<br />
prueba);<br />
if(MejorFit
}<br />
else lReVsol[i] = columna;<br />
}//fin if<br />
else repito = 1;<br />
}//fin if if(lReVsol[i] > 0 && columna > 1)<br />
}//fin for(i)<br />
}while(repito == 1 && fitn<strong>es</strong>s != 0);<br />
}//fin Busqueda_loc_A<br />
void Busqueda_loc_B(const int &m_var, vector &lReVsol,<br />
{<br />
const int &lMaxVsol, const int &n_ec,<br />
const vector &l_ec, const vector &Sist,<br />
vector &AuxIzq, vector &AuxDer,<br />
vector &PobIni, int &fitn<strong>es</strong>s, int &haysol,<br />
int &cont_uno, int &prueba)<br />
int repito, MejorFit, columna, valor, vizq, v<strong>de</strong>r;<br />
do{<br />
repito = 0;<br />
cont_uno = cont_uno +1;<br />
for(int i= 0; i< m_var && fitn<strong>es</strong>s != 0; i++)<br />
{<br />
for(int j= 0; j< lReVsol[i]; j++)<br />
{<br />
if(PobIni[i][j] == 1) PobIni[i][j] = 0;<br />
else PobIni[i][j] = 1;<br />
MejorFit = fitn<strong>es</strong>s;<br />
Evalua(n_ec, l_ec, Sist, lReVsol, PobIni, AuxIzq, AuxDer,<br />
if(fitn<strong>es</strong>s >= MejorFit)<br />
{<br />
fitn<strong>es</strong>s = MejorFit;<br />
201<br />
fitn<strong>es</strong>s, haysol,prueba);
}<br />
if(PobIni[i][j] == 1) PobIni[i][j] = 0;<br />
else PobIni[i][j] = 1;<br />
else repito = 1;<br />
}//fin for(j)<br />
//Incremento la variable i_ésima<br />
columna = lReVsol[i];<br />
if(columna < lMaxVsol)<br />
{<br />
MejorFit = fitn<strong>es</strong>s;<br />
PobIni[i][columna]= 0;<br />
lReVsol[i] = columna +1;<br />
Evalua(n_ec, l_ec, Sist, lReVsol, PobIni, AuxIzq, AuxDer,<br />
if(MejorFit
else repito = 1;<br />
}//fin if(columna < lMaxVsol)<br />
//<strong>de</strong>cremento la variable i_ésima<br />
if(columna > 0 && fitn<strong>es</strong>s != 0)<br />
{<br />
valor = PobIni[i][columna -1];<br />
if(columna < lMaxVsol) v<strong>de</strong>r = PobIni[i][columna];<br />
PobIni[i][columna -1]= 2;<br />
if(columna < lMaxVsol) PobIni[i][columna]= 2;<br />
MejorFit = fitn<strong>es</strong>s;<br />
lReVsol[i] = columna -1;<br />
Evalua(n_ec, l_ec, Sist, lReVsol, PobIni, AuxIzq, AuxDer,<br />
if(MejorFit 0 && columna > 1)<br />
}//fin for(i)<br />
}while(repito == 1 && fitn<strong>es</strong>s != 0);<br />
}//fin Busqueda_loc_B<br />
203<br />
fitn<strong>es</strong>s, haysol,prueba);
Bibliografía<br />
[1] Abdulrab, H.: Résolution d’equations sur l<strong>es</strong> mots: étu<strong>de</strong> et implementation LIPs<br />
<strong>de</strong> l’algoritme <strong>de</strong> Makanin.<br />
Ph. D. dissertation, Univ. Rouen, Rouen. 1987<br />
[2] Alonso, C.L., Drubi, F., and Montaña, J.L.: An Evolutionary Algorithm for Sol-<br />
ving Word Equation Systems.<br />
[3] Bäck, T., Eiben, A., and Vink, M.: A superior evolutionary algorithm for 3-SAT.<br />
In Saravanan, N., Waagen, D., and Eiben, A., editors,<br />
Proceedings of the Seventh Annual Conference on Evolutionary Programming. Lecture Not<strong>es</strong><br />
in Computer Science, Volumen 1477, pag<strong>es</strong> 125 − 136, Springer, Berlin, Germany. 1998<br />
[4] Eiben, A., and van <strong>de</strong>r Hauw, J.: Solving 3-SAT with adaptative genetic algo-<br />
rithms.<br />
In Proceedings of the Fourfth IEEE Conference on Evolutionary Computation, pag<strong>es</strong> 81 − 86,<br />
IEEE Pr<strong>es</strong>s, Piscataway, New Jersey. 1997<br />
[5] Goldberg, D. E.: Genetic Algorithms in Search, Optimization & Machine Lear-<br />
ning.<br />
Addison-W<strong>es</strong>ley Publishing Company, Inc. 1989<br />
[6] Gottlieb, J., and Voss, N.: Improving the performance of evolutionary algorithms<br />
for the satisfiability problem by refening functions.<br />
In Eiben, A. et al., editors,<br />
Proceedings of the Fifth International Conference on Parallel Problem Solving from Nature.<br />
Lecture Not<strong>es</strong> in Computer Science, Volumen 1498, pag<strong>es</strong> 755 − 764, Springer, Berlin, Ger-<br />
many. 1998<br />
204
[7] Gottlieb, J., and Voss, N.: Repr<strong>es</strong>entations, fitn<strong>es</strong>s functions and genetic oper-<br />
ators for the satisfiability problem.<br />
In Hao, J.-K. et al., editors,<br />
Proceedings of Artificial Evolution. Lecture Not<strong>es</strong> in Computer Science, Volumen 1363, pag<strong>es</strong><br />
55 − 68, Springer, Berlin, Germany. 1998<br />
[8] Gottlieb, J., Marchiori, E., and Rossi, C.: Evolutionary Algorithms for the Sa-<br />
tisfiability Problem.<br />
Massachusetts Institute of Technology. 2002<br />
[9] Gutiérrez, C.: Solving Equations in Strings: On Makanin’s Algorithm.<br />
W<strong>es</strong>leyan University, Middletown, CT 06459, U.S.A.<br />
[10] Hao, J.-K.: A clausal genetic repr<strong>es</strong>entation and its evolutionary procedur<strong>es</strong> for<br />
satisfiatibility problems.<br />
In Pearson, D., Steele, N., and Albrecht, R., editors,<br />
Proceedings of the International Conference on Artificial Neural Nets and Genetic Algorithms,<br />
pag<strong>es</strong> 289 − 292, Springer, Vienna, Austria. 1995<br />
[11] Hmelevski, J. I.: Equations in free semigroups.<br />
Trudy Mat. Inst. Steklov. 107, 1971<br />
[12] Holland, J. H.: Adaptation in natural and artificial systems.<br />
Ann Arbor: The University of Michigan Pr<strong>es</strong>s. 1975<br />
[13] Jaffar, J.: Minimal and Complete Word Unification.<br />
Journal ACM, Vol. 37, N o 1, January 1990, pag<strong>es</strong>47 − 85<br />
[14] Koscielski, A., and Pacholski, L.: Complexity of Makanin’s Algorithm.<br />
Journal of the ACM, Vol. 43, July 1996, pag<strong>es</strong>670 − 684<br />
[15] Lentin, J.: Equations in free monoids, in automata languag<strong>es</strong> and programming.<br />
In Nivat, M., editors,<br />
North Holland, pag<strong>es</strong>67 − 85. 1972<br />
[16] Makanin, G.S.: The problem of solvability of equations in a free semigroup, Math.<br />
USSR Sbornik 32(1997) (2), 129 − 198<br />
205
[17] Marchiori, E. and Rossi, C.: A flipping genetic algorithm for hard 3-SAT pro-<br />
blems.<br />
In Banzhaf, W. et al., editors,<br />
Proceedings of Genetic and Evolutionary Computation Conference, pag<strong>es</strong> 393 − 400, Morgan<br />
Kaufmann, San Francisco, California. 1999<br />
[18] McAll<strong>es</strong>ter, D., selman, B., and Kautz, H.: Evi<strong>de</strong>nce for invariants in local<br />
search.<br />
In Proceedings of the National Conference on Artificial Intelligent, pag<strong>es</strong> 321 − 326, AAAI<br />
Pr<strong>es</strong>s, Menlo Park, California. 1997<br />
[19] Pécuchet, J. P.: Equations avec constant<strong>es</strong> et algoritme <strong>de</strong> Makanin. Th<strong>es</strong>e <strong>de</strong><br />
doctorat, Laboratoire dínformatique, Rouen, 1981<br />
[20] Plotkin, G. D.: Building in equational theori<strong>es</strong>, Mach. pag<strong>es</strong> 73 − 90, 1972<br />
[21] Robson, J. M., and Diekert, V.: On quadratic word equations.<br />
[22] Rossi, C., Marchiori, E., and Kok, J.: An adaptive evolutionary algorithm for the<br />
satisfiability problem.<br />
In Carroll, J. et al., editors,<br />
Proceedings of ACM Symposium on Applied Computing, pag<strong>es</strong> 463 − 469, ACM, New York.<br />
2000<br />
[23] Selman, B., Kautz, H., and Cohen, B.: Noise strategi<strong>es</strong> for improving local search.<br />
In Proceedings of the Twelfth National Conference on Artificial Intelligent, pag<strong>es</strong> 337 − 343,<br />
AAAI Pr<strong>es</strong>s, Menlo Park, California. 1994<br />
[24] Schulz, K. U.: Word Unification and Transformation of Generalized Equatons.<br />
Journal of Automated Reasoning 11, pag<strong>es</strong> 149 − 184, 1993<br />
[25] Siekmann, J.: A modification of Robinson’s unification procedure, M.Sc. Th<strong>es</strong>is.<br />
1972<br />
206