09.05.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!