Está en la página 1de 259

Estudio del problema de la

ordenación lineal (LOP) y propuesta


de métodos de resolución

Máster en modelización e investigación


Matemática, estadı́stica y computacional

Trabajo Fin de Máster

Malena Urruchua Fernández

Trabajo dirigido por:


Leticia Hernando Rodrı́guez

Leioa, Junio de 2022


Índice general

Introducción vii

1. Problemas de optimización combinatoria 1


1.1. Descripción matemática y definiciones básicas . . . . . . . . . 1
1.2. Complejidad y métodos de resolución . . . . . . . . . . . . . . 3
1.2.1. Métodos de resolución de los problemas de optimiza-
ción combinatoria . . . . . . . . . . . . . . . . . . . . . . 3
1.2.2. Complejidad de los problemas de optimización combi-
natoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2. Problema de la ordenación lineal 7


2.1. Definición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1. Representación mediante matrices . . . . . . . . . . . . 7
2.1.2. Representación mediante grafos . . . . . . . . . . . . . . 9
2.1.3. Equivalencia entre las representaciones . . . . . . . . . 12
2.2. Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3. Espacio de búsqueda . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.1. Vecindario adyacente . . . . . . . . . . . . . . . . . . . . 21
2.3.2. Vecindario intercambio o 2-cambio . . . . . . . . . . . . 22
2.3.3. Vecindario Inserción . . . . . . . . . . . . . . . . . . . . . 25

3. Métodos de resolución exactos 29


3.1. Búsqueda exhaustiva . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2. Búsqueda basada en óptimos locales . . . . . . . . . . . . . . . 30
3.2.1. Construcción del grafo óptimo . . . . . . . . . . . . . . 30
3.2.2. Búsqueda exacta basada en los caminos hamiltonianos
del grafo óptimo . . . . . . . . . . . . . . . . . . . . . . . 34
3.3. Comparativa de tiempos de ejecución y conclusiones . . . . . . 35

4. Métodos de resolución metaheurı́ticos 37


4.1. Búsqueda Local . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.1.1. Búsqueda local para la resolución del LOP . . . . . . . 38
4.1.2. Búsqueda exhaustiva aplicada al LOP . . . . . . . . . . 38
4.2. Algoritmos genéticos . . . . . . . . . . . . . . . . . . . . . . . . . 39

iii
4.2.1. Algoritmos genéticos para la resolución del LOP . . . 40
4.2.2. Algoritmos genéticos aplicados al LOP . . . . . . . . . 42
4.3. Comparativa y conclusiones . . . . . . . . . . . . . . . . . . . . 45

5. Método de resolución metaheurı́stico propuesto 49


5.1. Nuevo método metaheurı́stico propuesto . . . . . . . . . . . . . 49
5.1.1. Descripción del método heurı́stico . . . . . . . . . . . . 49
5.1.2. Elección de parámetros iniciales . . . . . . . . . . . . . 50
5.1.3. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.2. Comparativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

6. Conclusiones y trabajo futuro 57


6.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.1.1. Métodos exactos . . . . . . . . . . . . . . . . . . . . . . . 57
6.1.2. Métodos metaheurı́sticos . . . . . . . . . . . . . . . . . . 58
6.1.3. Método metaheurı́stico propuesto . . . . . . . . . . . . 58
6.2. Trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

A. Problemas más relevantes de optimización combinatoria 61

B. Aplicaciones LOP 65

C. Conceptos básicos sobre grafos 67


C.1. Definiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

D. Más conceptos sobre los tres vecindarios descritos sobre Sn 71


D.1. Vecindario Adyacente . . . . . . . . . . . . . . . . . . . . . . . . 71
D.2. Vecindario intercambio . . . . . . . . . . . . . . . . . . . . . . . 72
D.3. Vecindario Insercción . . . . . . . . . . . . . . . . . . . . . . . . 74

E. Implementación 75
E.1. Función objetivo LOP . . . . . . . . . . . . . . . . . . . . . . . . 75
E.2. Métodos exactos . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
E.2.1. Búsqueda exhaustiva . . . . . . . . . . . . . . . . . . . . 77
E.2.2. Grafo óptimo . . . . . . . . . . . . . . . . . . . . . . . . . 77
E.3. Métodos metaheurı́sticos . . . . . . . . . . . . . . . . . . . . . . 82
E.3.1. Búsqueda local . . . . . . . . . . . . . . . . . . . . . . . . 82
E.3.2. Algoritmo genético . . . . . . . . . . . . . . . . . . . . . 82
E.4. Nuevos métodos heurı́sticos . . . . . . . . . . . . . . . . . . . . . 95
E.4.1. Heurı́sticos no recogidos en el Capı́tulo 5 . . . . . . . . 95
E.4.2. Heurı́stico propuesto en el Capı́tulo 5 . . . . . . . . . . 97
E.5. Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

iv
Resumen
En el Capı́tulo 1 se introducen conceptos básicos de la optimización, en par-
ticular, de la optimización combinatoria. A partir del Capı́tulo 2, este do-
cumento se centra en el problema de la ordenación lineal (Linear Ordering
Problem - LOP), desarrollando y demostrando algunas de sus propiedades
más relevantes. En el Capı́tulo 3, se desarrollan dos métodos de resolución
exactos: la búsqueda exhaustiva y un nuevo algoritmo de resolución exacto
para este problema. Este método tendrá como base la formulación y demos-
tración de un teorema para la búsqueda de óptimos locales del problema.
En el Capı́tulo 4, se aplicarán algunos métodos de resolución metaheurı́sti-
cos, concretamente: la búsqueda local y algoritmos genéticos. Se analizará
la eficacia y la bondad de ajuste de estos métodos al LOP. En el Capı́tulo 5,
se expondrá un nuevo método heurı́stico que tendrá como base las propie-
dades estudiadas en los capı́tulos anteriores y combinará las bondades de los
métodos anteriormente descritos. En el Capı́tulo 6, se presentan las conclu-
siones y, a partir de ellas, se expone el trabajo futuro que puede desarrollarse
tomando como base este proyecto.

Abstract
Chapter 1 is an introduction of basic optimization concepts, in particular
combinatorial optimization. From Chapter 2, this document focuses on the
Linear Ordering Problem (LOP), developing and proving some of its most
relevant properties. In Chapter 3, two exact solving methods are developed:
exhaustive search and a new exact algorithm for this problem. This method
is based on the formulation and the proof of a theorem for the search for
local optimum of the problem. In Chapter 4, two metaheuristic resolution
methods are applied, specifically: local search and genetic algorithms. The
efficacy and the fitness of these methods to the LOP are analyzed. In Chapter
5, a new heuristic method is developed. This new method is based on the
properties studied in the previous chapters and combines the benefits of the
previously described methods. In Chapter 6, the conclusions are presented
and, from them, the future work that could be developed taking this work
as base.

Palabras clave
Problema de optimización de la ordenación lineal (LOP); grupo simétrico;
entornos; algoritmos exactos y heurı́sticos; digrafos y caminos hamiltonianos.
Introducción

Desde el comienzo de los tiempos los seres humanos hemos buscado sacar el
máximo rendimiento a todo lo que nos rodea, es decir, optimizar los recursos
a nuestra disposición. En nuestra vida cotidiana nos enfrentamos a proble-
mas de optimización a diario: buscamos el camino más corto para ir de un
lugar a otro, decidimos qué objeto u objetos constituyen la mejor compra,
cuál es el mejor candidato para desempeñar cierta tarea... Normalmente,
cuando una persona está ante este planteamiento no utiliza fórmulas ni re-
cursos matemáticos para obtener la solución. Sin embargo, cuando tenemos
problemas de optimización más complejos, la herramienta para resolverlos
son las matemáticas. De manera general, podemos definir la optimización
como la selección del mejor elemento (respecto de algún criterio previamente
fijado) de entre una colección de elementos.

Durante siglos, grandes matemáticos se han enfrentado a estos proble-


mas tanto en el espacio continuo como en el discreto, desarrollando diferentes
métodos. Ya en el siglo III a.C Apolonio de Perge (geómetra griego) estudió
las secciones cónicas a fin de obtener la proporción máxima. Pero no fue
hasta el siglo XVII, con el desarrollo del cálculo diferencial, cuando la op-
timización continua dio un gran salto gracias a Newton, Leibnitz, Bernoulli
y Lagrange. Un segundo gran hito en la historia de la optimización sucedió
en la primera mitad del siglo XX con el desarrollo de la programación lineal
por parte de George Dantzig, John Von Neumann y Leonid Kantoróvich.
Aún siendo este último un gran avance para la optimización discreta o com-
binatoria, a dı́a de hoy todavı́a quedan muchos problemas de optimización
combinatoria por resolver de manera eficaz. En las últimas décadas, gracias
al desarrollo de la tecnologı́a y las herramientas informáticas, se ha avanza-
do mucho en este aspecto y se han propuesto nuevos y potentes métodos de
resolución.

Algunos de los problemas de optimización combinatoria más relevantes


son el problema del viajero/a [1], el problema de la mochila discreta [2], el
problema de la ordenación lineal [3]... En todos estos problemas el dominio
o espacio de búsqueda aumenta de forma exponencial a medida que aumen-
ta el tamaño del problema. A dı́a de hoy, no existe ningún método capaz

vii
viii

de resolver de manera eficaz todos los casos de alguno de estos problemas.


De hecho, existe la conjetura de que estos problemas son irresolubles en un
tiempo polinomial en la dimensión del problema, lo que se conoce como el
problema P versus NP, uno de los problemas del Milenio1 .

De entre los problemas citados, es el de la ordenación lineal al que se dedi-


cará este documento. Comenzaré desarrollando algunos conceptos generales
de la optimización combinatoria, para después centrarme en el problema de
la ordenación lineal desarrollando y demostrando algunas de sus propieda-
des más relevantes. Los capı́tulos centrales del documento se enfocan en la
resolución del problema mediante diferentes tipos de métodos. En primer
lugar, se propone un nuevo método exacto de resolución nunca anterior-
mente desarrollado. Este nuevo método recorrerá un número de soluciones,
evitando gran parte de todas las posibles que se sabe de antemano que no
serán el óptimo global. No obstante, el tiempo de ejecución del algoritmo
propuesto aumenta factorialmente con el tamaño del problema y por ello,
solo será aplicable a instancias de tamaño pequeño. Este algoritmo toma co-
mo base algunas propiedades del problema de la ordenación lineal que nunca
antes habı́an sido estudiadas. En segundo lugar, se describen métodos me-
taheurı́sticos. En tercer lugar, se desarrollará un nuevo método heurı́stico
que tomará como base las propiedades del problema y las conclusiones ob-
tenidas de los métodos descritos en los capı́tulos anteriores. Finalmente, se
compararán todos los métodos de resolución descritos de manera experimen-
tal, aplicando estos métodos a casos concretos y se propondrá un trabajo
futuro.

Objetivos
Estudiar el problema de optimización de la ordenación lineal, sus propie-
dades y algunos de los métodos de resolución ya descritos en la literatura.
Implementar nuevos algoritmos que tengan en cuenta las propiedades des-
critas y/o los beneficios de los algoritmos que han sido usados hasta ahora.

1
https://www.claymath.org/millennium-problems/p-vs-np-problem
Capı́tulo 1

Problemas de optimización
combinatoria

1.1. Descripción matemática y definiciones bási-


cas
Intuitivamente, un problema de optimización consiste en elegir la mejor op-
ción de entre un conjunto de posibles soluciones que cumplen determinadas
propiedades.

En general, podemos definir formalmente un problema de optimización


como [1]:

⎪ M in/M áx f ((x1 , x2 , ..., xn ))







⎨ sujeto a:




⎪ gi ((x ,
1 2 x , ..., xn )) ≤ 0, i = 1, ..., m

⎪ h ((x , x , ..., x )) = 0, j = 1, ..., p

⎩ j 1 2 n

donde: m es el número de desigualdades de las restricciones, p es el núme-


ro de igualdades de las restricciones y f, gi , hj ∶ S Ð→ R son funciones de
(x1 , x2 , ..., xn ) ∈ S. Dependiendo de la naturaleza de S tendremos diferentes
tipos de problemas de optimización:

Continuos: en estos problemas S es un espacio continuo, por lo general,


S ⊂ Rn .

Discretos o combinatorios: en estos problemas S es un espacio discreto,


es decir, un espacio finito o infinito numerable que puede estar formado
por puntos de Nn , vectores binarios, permutaciones...

En lo que sigue, vamos a tratar con problemas de optimización combi-


natoria. Para formalizar cualquier problema de optimización combinatoria

1
2 1.1. Descripción matemática y definiciones básicas

es imprescindible establecer: la función a optimizar, también denominada


función objetivo f , que se define en función de ciertos parámetros del pro-
blema; el dominio discreto de la función objetivo que denominamos espacio
de búsqueda S; y las restricciones gi y hj , que deberán cumplir las variables
x1 , ..., xn , en caso de que el problema tenga restricciones. Decimos que tene-
mos una instancia o ejemplo de un problema de optimización combinatoria
cuando estamos ante un caso particular del mismo. Es decir, la instancia es
el caso concreto del problema una vez conocidos los datos (los valores que
toman los parámetros de los que depende la función objetivo f ). A conti-
nuación, vamos a establecer algunos conceptos derivados de los problemas
de optimización combinatoria.

Definición 1.1.1. Un punto factible de un problema de optimización combi-


natoria, (x1 , x2 , ..., xn ), es un elemento que pertenece al espacio de búsqueda
S que cumple con las restricciones del problema gi y hj , donde i = 1, ..., m,
j = 1, ..., p, siendo m el número de desigualdades y p el número de igualdades
que deben cumplir las variables x1 , ..., xn .

Buscar la solución al problema de optimización combinatoria consiste en


encontrar el valor mı́nimo o máximo de la función f ∶ S Ð→ R. Ahora bien,
en la mayorı́a de los casos esto no es lo único que nos interesa, ya que el
punto factible (x1 , x2 , ..., xn ) ∈ S donde se alcanza esta solución, puede ser
tanto o más relevante.

Definición 1.1.2. Sea S el espacio de búsqueda y f la función objetivo de


un problema de optimización combinatoria, denominaremos óptimo global
al punto factible (x1 , x2 , ..., xn ) ∈ S donde se alcanza el valor máximo o
mı́nimo de la función f , dependiendo de si el problema trata de maximizar
o minimizar, respectivamente. Esto es, dado (x1 , x2 , ..., xn ) ∈ S un punto
factible es un óptimo global si:
f ((x1 , x2 , ..., xn )) ≤ f ((x′1 , x′2 , ..., x′n )), ∀(x′1 , x′2 , ..., x′n ) ∈ S si se trata de minimizar.
f ((x1 , x2 , ..., xn )) ≥ f ((x′1 , x′2 , ..., x′n )), ∀(x′1 , x′2 , ..., x′n ) ∈ S si se trata de maximizar.

Nota: el óptimo global puede ser múltiple, es decir, la solución puede


alcanzarse en más de un punto factible, o por el contrario, puede que el
óptimo global no se alcance en ningún momento, esto es, puede que no exis-
ta solución al problema.

Algunos ejemplos de problemas de optimización combinatoria más rele-


vantes son: el problema del viajero/a (Traveling Salesperson Problem - TSP)
[1], el problema de la mochila discreta [2], el problema de empaquetado de
conjuntos [2], el problema del árbol recubridor mı́nimo (Minimal Spanning
Tree - MST) [2] o el problema de la ordenación lineal (Linear ordering pro-
Capı́tulo 1. Problemas de optimización combinatoria 3

blem - LOP)1 .

En este trabajo, nos centraremos en el problema de la ordenación lineal.


A partir del siguiente capı́tulo se definirá este problema, se desarrollarán y
demostrarán algunas de sus propiedades, se explicarán sus aplicaciones en
el mundo real y también se propondrán nuevos métodos para su resolución
basados en las caracterı́sticas anteriormente observadas. Pero antes estudia-
remos la relación entre los métodos de resolución y la complejidad temporal
de los problemas de optimización combinatoria.

1.2. Complejidad y métodos de resolución


La complejidad de un problema y los métodos de resolución que se puedan
aplicar de manera eficaz son conceptos que están fuertemente relacionados.
Precisamente, la complejidad de un problema será la complejidad del méto-
do más eficaz que pueda ser utilizado para resolver todas las instancias del
problema.

1.2.1. Métodos de resolución de los problemas de optimiza-


ción combinatoria
Como hemos citado anteriormente, para conseguir la solución a un problema
de optimización combinatoria tenemos que encontrar el máximo o mı́nimo
de la función objetivo. Para ello, podemos valernos de diferentes métodos
[4]:

Métodos exactos: convergen al valor máximo/mı́nimo, y por tanto, al


óptimo global. Algunos de los más relevantes son: el método simplex
y el método Branch and Bound.

Métodos aproximados: no siempre obtienen el valor máximo/mı́nimo,


esto es, no nos asegura alcanzar el óptimo global, pero a cambio, el
tiempo de ejecución que requieren es, por lo general, menor que el de
los métodos exactos. Estos métodos se pueden dividir en dos tipos:

− Metaheurı́sticos[5] son algoritmos generales aplicables a cualquier


problema.
− Heurı́sticos[5] son algoritmos diseñados especı́ficamente para un
problema.
1
La descripción de estos problemas se encuentra en el Apéndice A, salvo del LOP al
que se dedica el Capı́tulo 2.
4 1.2. Complejidad y métodos de resolución

En todos los problemas de optimización combinatoria pueden ser apli-


cados tanto métodos exactos como métodos heurı́sticos, pero para determi-
nados problemas, los métodos exactos necesitan un tiempo de ejecución que
aumenta de forma exponencial a medida que aumenta el tamaño del proble-
ma. Como consecuencia, no siempre es factible aplicarlos. Por el contrario,
los métodos aproximados, en general, necesitan un tiempo de ejecución me-
nor. Como la optimalidad no está garantizada en este último caso, necesi-
tamos medir la calidad de estos. Por este motivo, se busca que un método
aproximado tenga las siguientes propiedades [2]: eficiencia (necesita de un
tiempo de ejecución computacional posible), bondad/optimalidad (solución
cercana a la óptima) y robustez (pocas probabilidades de obtener una mala
solución, diferente de la óptima).

1.2.2. Complejidad de los problemas de optimización combi-


natoria
Habitualmente, se establece una clasificación de los problemas de optimiza-
ción combinatoria en base a la complejidad que encuentran los métodos o
algoritmos al tratar de resolverlos [4]:
Decimos que un problema es de clase P si existe un algoritmo que
resuelva todas sus instancias en un tiempo polinómico en la dimensión
del problema. Un ejemplo de este tipo de problemas es la ordenación
de números naturales.

Decimos que un problema es NP si no se conoce un algoritmo que


resuelva todas sus instancias en un tiempo polinómico en la dimensión
del problema, pero dado un punto factible se puede comprobar si su
valor de función objetivo es una solución del problema en tiempo po-
linómico. Por ejemplo, la búsqueda de caminos hamiltonianos en un
grafo es un problema NP.

Decimos que un problema es NP-Completo si no se conoce ningún


algoritmo que resuelva todas sus instancias en un tiempo polinómico en
la dimensión del problema y si además tampoco es posible comprobar
en tiempo polinómico si un punto factible es solución al problema.
Son ejemplos de ello el problema del viajero (TSP) o el problema de
la ordenación lineal (LOP).
Todas las instancias de los problemas de optimización combinatoria pue-
den ser abordados mediante algoritmos de complejidad polinómica. Esto no
significa que obtengamos el óptimo global, o al menos, no nos lo aseguran.
Sin embargo, se considera que un problema es P sólo si se puede asegurar
que se obtiene el óptimo global en un tiempo polinómico en la dimensión
del problema para todas sus instancias. Además, claramente podemos decir
Capı́tulo 1. Problemas de optimización combinatoria 5

que P⊂NP, pues si podemos encontrar la solución a un problema en tiempo


polinómico, dado un punto factible también podemos comprobar en tiempo
polinómico si es solución al problema o no. Por el contrario, la inclusión
inversa NP⊂P, a dı́a de hoy, no se ha podido demostrar. Este es uno de los
problemas del milenio [6] que aún no ha sido resuelto. Pero poder llegar a
demostrar P = N P , supondrı́a grandes cambios en el mundo de la compu-
tación, algunos podrı́an ser muy ventajosos, mientras que otros podrı́an
desencadenar consecuencias nefastas. Tal y como se cita en [6]: ”poder resol-
ver el problema del viajero mediante un algoritmo que necesite de un tiempo
poliómico serı́a beneficioso para la industria, las comunicaciones y el desa-
rrollo en general. En contraposición, las claves criptográficas se descifrarı́an
con gran facilidad, y muchas cuentas bancarias y comunicaciones cifradas
quedarı́an expuestas, siendo esto un gran peligro para nuestra privacidad ”.
Capı́tulo 2

Problema de la ordenación
lineal

El problema de la ordenación lineal (Linear ordering problem-LOP) es un


problema clásico de optimización combinatoria y la gran cantidad de apli-
caciones que posee1 hace que no solo tenga interés teórico, sino también,
una gran importancia práctica. En este capı́tulo dedicado al LOP se defi-
nirá el problema utilizando dos posibles representaciones y se explicará la
equivalencia entre ambas.

2.1. Definición
2.1.1. Representación mediante matrices
Dada una matriz B = [bij ]n×n con bij ∈ R, el problema de la ordenación
lineal consiste en encontrar la permutación σ ∈ Sn (simultáneamente de filas
y columnas) que haga que la suma de los valores que se encuentran por
encima de la diagonal principal de la matriz resultante sea máxima.
Esto podemos expresarlo como [3]:

M áx f ∶ Sn Ð→ R
n n−1 n
σ z→ f (σ) = ∑ bσij = ∑ ∑ bσij , (2.1)
i<j i=1 j=i+1

donde Sn representa el conjunto de permutaciones de n elementos y bσij repre-


senta el elemento de la fila i y columna j de la matriz obtenida al permutar
simultáneamente las filas y columnas de B mediante la permutación σ. A
esta matriz obtenida la denominaremos B σ ∈ M atn×n (R).

1
La descripción de las aplicaciones más relevantes se encuentra en el Apéndice B.

7
8 2.1. Definición

Asimismo, podemos calcular el valor de f sin necesidad de construir la


matriz B σ ∈ M atn×n (R), pues podemos definir nuestro problema de este
segundo modo:

M áx f ∶ Sn Ð→ R
n n−1 n
σ z→ f (σ) = ∑ bσi σj = ∑ ∑ bσi σj . (2.2)
i<j i=1 j=i+1

En cada permutación la posición i-ésima ocupada por el valor σi = k


representa la posición que debe ocupar la fila (y columna) k-ésima de la
matriz original. Esto es, en la matriz solución, la fila (y columna) i-ésima
será la k-ésima de la matriz original. El espacio de búsqueda estará formado
por todas las posibles permutaciones de tamaño n, siendo n el número de
filas o columnas de la matriz, ya que el problema no tiene restricciones y
por tanto, todas las permutaciones σ ∈ Sn son puntos factibles. Es decir, el
espacio de búsqueda crece de forma exponencial a medida que aumenta el
tamaño del problema.

⎛ 0 1 3 19 2⎞
⎜ 3 0 11 15 4⎟
⎜ ⎟
Ejemplo 2.1.1. Matriz original: B= ⎜ ⎜ 2 9 0 16 6⎟

⎜ 1 18 2 0 5⎟
⎜ ⎟
⎝15 19 3 7 0⎠
Como esta es la matriz original de nuestro ejemplo, su permutación asociada
es aquella que deja cada fila y columna en la posición en la que estaba, es
decir, e = (12345), la canónica o identidad. En este caso el valor de la función
objetivo mediante la Ecuación (2.1):
n n−1 n
f (e) = ∑ beij = ∑ ∑ beij = be12 + be13 + be14 + be15 + be23 + be24 + be25 + be34 + be35 + be45 =
i<j i=1 j=i+1

= 1 + 3 + 19 + 2 + 11 + 15 + 4 + 16 + 6 + 5 = 82.

Vamos a tomar el punto factible representado por la permutación σ =


(23145), esto es la primera fila/columna de la matriz que vamos a construir,
B σ , será la segunda de nuestra matriz original B y análogamente con el
resto de filas/columnas. Construiremos esta matriz en dos pasos, primero
modificando filas y después columnas:
B Bσ
∥ ∥
0 1 3 19 2 3 0 11 15 4 0 11 3 15 4
⎛ 3 0 11 15 4⎞ ⎛2 9 0 16 6
⎞ ⎛9 0 2 16 6

⎜ 2 9 0 16 6⎟ f ilas ⎜ 0 1 ⎟ columnas ⎜1 ⎟
⎜ ⎟ Ð→ ⎜ 3 19 2⎟ Ð→ ⎜ 3 0 19 2⎟
⎜ 1 18 2 0 5⎟ ⎜ 1 18 2 0 5
⎟ ⎜18 2 1 0 5

⎝15 19 3 7 0⎠ ⎝15 19 3 7 0
⎠ ⎝19 3 15 7 0

Capı́tulo 2. Problema de la ordenación lineal 9

Utilizando la Ecuación (2.1) calculamos el valor de la función objetivo


correspondiente a esta permutación:

n n−1 n
f (σ) = ∑ bσij = ∑ ∑ bσij = bσ12 +bσ13 +bσ14 +bσ15 +bσ23 +bσ24 +bσ25 +bσ34 +bσ35 +bσ45 =
i<j i=1 j=i+1

= 11 + 3 + 15 + 4 + 2 + 16 + 6 + 19 + 2 + 5 = 83.

Como podemos ver, en este caso el valor obtenido es mayor.

Supongamos ahora que queremos calcular el valor de la función obje-


tivo del punto factible representado por la permutación, ω = (53421). Va-
liéndonos de la Ecuación (2.2), podemos usar la matriz original junto con la
permutación para calcular este valor, sin necesidad de calcular B ω :

n−1 n
f (ω) = ∑ ∑ bωi ωj = bω1 ω2 + bω1 ω3 +
i=1 j=i+1
⎛0 3 7 19 15⎞
+bω1 ω4 + bω1 ω5 + bω2 ω3 + bω2 ω4 + ⎜6 0 16 9 2 ⎟
⎜ ⎟
+bω2 ω5 + bω3 ω4 + bω3 ω5 + bω4 ω5 = Bω = ⎜
⎜5 2 0 18 1 ⎟

⎜4 11 15 0 3 ⎟
=b53 + b54 + b52 + b51 + b34 + b32 + ⎜ ⎟
⎝2 3 19 1 0 ⎠
+b31 + b42 + b41 + b21 = 3 + 7 + 19+
+15 + 16 + 9 + 2 + 18 + 1 + 3 = 93

Vemos claramente que los valores que hemos considerado al calcular el


valor de función objetivo de la solución correspondiente a la permutación ω,
coinciden con los valores que se encuentran por encima de la diagonal de la
matriz B ω .

2.1.2. Representación mediante grafos


Dado un digrafo ponderado completo2 D = (V, A), donde: V = {1, ..., n}
representa el conjunto de vértices y A = {(i, j)∣∀i, j ∈ V, i =/ j} el conjunto de
aristas, las cuales tienen un peso asociado wij , el problema del orden lineal
consiste en encontrar el torneo T ⊂ D acı́clico de peso máximo[7]. Es decir,
encontrar el torneo acı́clico T = (V, A′ ) tal que A′ ⊂ A y la suma de los pesos
2
En el Apéndice C se pueden encontrar algunos conceptos sobre grafos que se utilizarán
para el desarrollo de los siguientes capı́tulos.
10 2.1. Definición

de las aristas de A′ sea máxima:

M áx f ∶ A Ð→ R
A′ z→ f (A′ ) = ∑ wij (2.4)
(i,j)∈A′

El espacio de búsqueda está formado por todos los posibles torneos acı́cli-
cos con los n vértices del grafo original y un subconjunto de las aristas del
grafo original. En torneos pequeños es fácil comprobar si es acı́clico o no, no
obstante a medida que aumenta el tamaño del grafo, el espacio de búsqueda
aumenta de forma exponencial, por ello es útil tener una caracterización de
estos.

Teorema 2.1.1. Un torneo T = (V, A) es acı́clico si y solo si el grado positivo


g + (o negativo g − ) es diferente para todas las aristas, esto es, A′ = {(i, j) ∈
A∣g + (i) =/ g + (j), ∀i =/ j} ⊂ A (o A′ = {(i, j) ∈ A∣g − (i) =/ g − (j), ∀i =/ j} ⊂ A).

Demostración 2.1.1. Para esta demostración, haremos individualmente


cada implicación.

⇐Ô Supongamos que tenemos un torneo cuyos vértices V = {v1 , v2 , ...,


vn } y, sin pérdidida de generalidad, supongamos que son de grado positivo
g + (vi ) = i−1, ∀i ∈ {1, 2..., n} Ô⇒ g + (v1 ) = 1−1 = 0 Ô⇒ todas las aristas de
v1 son incidentes (llegan), por tanto no hay ninguna de salida. Consecuen-
temente, v1 no puede formar parte de ningún ciclo y las aristas que inciden
sobre él tampoco pueden formar un ciclo. Veamos ahora si excluyendo el
vértice v1 y las aristas que llegan a él, podemos formar un ciclo. Si tomamos
las aristas de v2 , a excepción de la arista que une v2 y v1 , que ya sabemos
que no formará parte del ciclo, tenemos que el resto de aristas son incidentes
sobre v2 . Como consecuencia, v2 no puede formar parte de ningún ciclo y
las aristas que inciden sobre él tampoco pueden formar un ciclo. Repitien-
do el proceso con v3 y razonando de forma análoga, verrı́amos que v3 no
puede formar parte de ningún ciclo. Análogamente, seguirı́amos excluyendo
vértices hasta llegar a vn y comprobando que efectivamente T = (V, A) no
contiene ningún ciclo Ô⇒ T = (V, A) es acı́clico.

Ô⇒ Para ver esta implicación basta con construir un torneo vértice a


vértice asegurándonos que uno a uno, ninguno forma parte de un ciclo, ra-
zonando de forma similar a la implicación anterior. Esto es, comenzarı́amos
con un vértice v1 y lo forzarı́amos a no formar parte de ningún ciclo, ha-
ciendo que todas las aristas fueran incidentes sobre él (g + (v1 ) = n − 1 y
g − (v1 ) = 0), de este modo una vez que se seleccione este vértice en un ca-
mino, tendrá que ser el último y no se podrá completar el ciclo. Por tanto,
este vértice no podrı́a pertenecer a ningún ciclo y sus aristas tampoco. A
continuación se tomarı́a un segundo vértice v2 , del cual sabemos que tiene
Capı́tulo 2. Problema de la ordenación lineal 11

una arista saliente (v2 , v1 ) que no pertenece a ningún ciclo. Ahora, para que
v2 no pertenezca a ningún ciclo, hacemos que el resto de aristas de v2 sean
incidentes (g + (v2 ) = n − 2 y g − (v1 ) = 1 ). Razonando de forma análoga cons-
truirı́amos el resto de vértices y aristas, teniendo ası́ que ∃/ vi , vj ∈ V tales
que g + (vi ) = g + (vj ), ∀i =/ j (o g − (vi ) = g − (vj ), ∀i =/ j ) ◻

Ejemplo 2.1.2. Dado el digrafo D = (V = {1, 2, 3, 4, 5}, A = {(1, 2), (1, 3),
(1, 4), (1, 5), (2, 1), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 4), (3, 5), (4, 1), (4, 2) ,
(4, 3), (4, 5), (5, 1), (5, 2), (5, 3), (5, 4)}) con un conjunto de pesos W asocia-
dos a cada arista, que por facilitar la visualización se da mediante la Tabla
2.1 donde cada entrada de la fila i y columna j corresponde al peso asociado
a la arista (i, j).

Sale/Incide 1 2 3 4 5
1 0 1 3 4 10
2 3 0 6 9 3
3 10 4 0 5 2
4 3 4 6 0 3
5 9 7 8 4 0

Tabla 2.1: Peso asociado a las aristas


del digrafo. Figura 2.1: Digrafo completo.

Tomamos un posible torneo y calculamos su peso total asociado. Para


construirlo debemos tomar los 5 vértices del grafo representado en la Figu-
ra 2.1 y un subconjunto de A tal que: A′ = {(i, j) ∈ A∣g + (i) =/ g + (i), ∀i =/ j} ⊂
A. Para ello, construimos el torneo vértice a vértice como se muestra en la
Figura 2.2.

Figura 2.2: Construcción de un torneo de 5 vértices.


12 2.1. Definición

Calculamos el peso asociado al torneo resultante mediante la Ecuación


(2.4): f (A′ ) = ∑ wij = w13 + w23 + w43 + w53 + w15 + w25 + w45 + w14 + w24 +
(i,j)∈A′
w21 = 3 + 6 + 6 + 8 + 10 + 3 + 3 + 4 + 9 + 3 = 55.

2.1.3. Equivalencia entre las representaciones


Una vez vistas las representaciones del LOP como matrices y como grafos,
vamos a observar la correspondencia entre ambas. Por una parte, cada en-
trada bij de la matriz B corresponderı́a al peso wij asociado a la arista (i, j)
del digrafo D y viceversa. Por otra parte, a cada punto factible representado
mediante una permutación σ = (σ1 σ2 ...σn ) ∈ Sn le corresponde un torneo
T ⊂ D tal que: si σi = k, al nodo k llegarán i − 1 aristas, esto es: g + (k) = i − 1
y saldrán n − i aristas, esto es: g − (k) = n − i. Consecuentemente, en ambos
casos se obtendrá el mismo valor de función objetivo. Para comprobar es-
ta equivalencia nos valdremos del Teorema 2.1.3, pero para ello se necesita
previamente el Teorema 2.1.2.

Teorema 2.1.2. Sea T = (V, A) un torneo tal que para cada par de vértices
v1 , v2 ∈ V el grado positivo (o negativo) es diferente, g + (v1 ) =/ g + (v2 ), ∀v1 , v2 ∈
V , o equivalentemente, g − (v1 ) =/ g − (v2 ), ∀v1 , v2 ∈ V , entonces contiene un
único camino hamiltoniano.

Demostración 2.1.2. Para facilitar esta demostración primero se analizará


la estructura del grafo y después se construirá el camino hamiltoniano en él.
Sea un torneo T = (V, A) donde V = {1, 2, ..., n} es el conjunto de vértices y
A = {(i, j)∣∀i, j ∈ V, ∃(i, j) ∨ (j, i)} , entonces ∀v ∈ V, g(v) = g − (v) + g + (v) =
n − 1. Como hay n vértices de grado n − 1 y se busca que el grado positivo (o
negativo) de cada vértice sea distinto, sin pérdida de generalidad podemos
establecer los grados positivos y negativos de los vértices que se muestran
en la Tabla 2.2.

Vértice v1 v2 v3 ... vi ... vn−1 vn


g− n-1 n-2 n-3 ... n-i ... 1 0
g+ 0 1 2 ... i-1 ... n-2 n-1
g n-1 n-1 n-1 n-1 n-1 n-1 n-1 n-1

Tabla 2.2: Grados de los vértices del torneo.

Una vez definida la estructura del torneo, construimos el camino hamil-


toniano paso a paso desde el último vértice al primer vértice del camino.
Debemos tener en cuenta que para cada vértice escogeremos una arista de
salida y una arista incidente o de entrada, a excepción del primer vértice
para el que tomaremos solamente una arista de salida y del último vértice
Capı́tulo 2. Problema de la ordenación lineal 13

del camino solo se tomará una arista de entrda. Como se puede apreciar en
la Tabla 2.2 el vértice vn tiene grado positivos nulo, g + (vn ) = 0, esto quiere
decir, no tiene ninguna arista de salida, todas las aristas son incidentes, por
tanto, este vértice será el último vértice del camino. El vértice vn−1 tiene
una única arista de salida, g − (vn−1 ) = 1, que forzosamente llegará al vértice
vn . Esta arista (vn−1 , vn ) será la última del camino hamiltoniano y conse-
cuentemente ninguna arista más del vértice vn formará parte del camino.
El vértice vn−2 tiene dos aristas de salida que forzosamente llegarán a los
vértices vn y vn−1 , pero en el camino no se puede incluir ninguna arista más
que contenga el vértice vn , consecuentemente la penúltima arista del camino
será (vn−2 , vn−1 ). Ahora, como ya hemos tomado dos aristas que incluyen
el vértice vn−1 ((vn−2 , vn−1 ) y (vn−1 , vn )), no podremos elegir ninguna arista
más que contenga este vértice, el vn−1 . Razonando de forma similar, el si-
guiente vértice a analizar es vn−3 y la arista escogida (vn−3 , vn−2 ). Siguiendo
el mismo razonamiento para el resto de los vértices llegarı́amos a comple-
tar el camino hamiltoniano con los n vértices y siendo el primer vértice del
camino el v1 pues su grado positivo es nulo g + (v1 ) = 0, por tanto todas sus
aristas salen de él y inevitablemente debe ser el primer vértice del camino.
Concluimos que el grafo asociado tendrá un único camino hamiltoniano de
modo que aquel vértice que tenga g + (v) = k será el que ocupe la posición
k + 1-ésima en el camino hamiltoniano. ◻

Teorema 2.1.3. Sean un grafo completo ponderado D = (V, A) y una matriz


B ∈ M atn×n (R) dos representaciones para un mismo problema LOP. Un
torneo T = (V, A) ⊂ D y una permutación σ ∈ Sn representarán el mismo
punto factible si y solo si el camino hamiltoniano del torneo T es σ.

Demostración 2.1.3. Supongamos que tenemos un LOP representado me-


diante un digrafo completo D = (V, A) y una matriz B ∈ M atn×n (R), por es-
tar representando el mismo problema sabemos que bij = wij , ∀i, j ∈ {1, ..., n}.
Para esta demostración vamos a tomar un punto factible de la representación
mediante digrafos y su equivalente punto factible mediante la representación
con matrices y veremos que el valor de la función objetivo es el mismo.
Tomamos una representación mediante un digrafo completo de un LOP y
un punto factible representado por un torneo T = (V, A) ⊂ D ⇐⇒ tiene un
único camino hamiltoniano (v1 v2 ...vn ) ⇐⇒ las aristas sabemos que de v1 sa-
len: {(v1 , v2 ), (v1 , v3 ), ..., (v1 , vn )}; de v2 : {(v2 , v3 ), (v2 , v4 ), ..., (v2 , vn )};....de
vn−1 : {(vn−1 , vn )} y de vn ninguna ⇐⇒ el valor de la función objetivo
vendrá dado por la Ecuación (2.4): f (A) = ∑ wij = wv1 v2 + wv1 v3 + ... +
(i,j)∈A′
n n−1 n
wv1 vn + wv2 v3 + ... + wv2 vn + ... + wvn−1 vn ⇐⇒ f (A) = ∑ bσi σj = ∑ ∑ bσi σj =
i<j i=1 j=i+1
bσ1 σ2 + bσ1 σ3 + ... + bσ1 σn + bσ2 σ3 + ... + bσ3 σn + .... + bσn−1 σn = f (σ) es el valor de
la función objetivo será dado por la Ecuación (2.2) para una representación
matricial de un LOP con una permutación σ = (σ1 ...σn ) ∈ Sn . ◻
14 2.2. Propiedades

Ejemplo 2.1.3. Si retomamos el Ejemplo 2.1.2, la matriz equivalente al


⎛ 0 1 3 4 10⎞
⎜3 0 6 9 3⎟
⎜ ⎟
digrafo completo serı́a B = ⎜ ⎟
⎜10 4 0 5 2 ⎟ y la permutación asociada al
⎜3 4 6 0 3⎟
⎜ ⎟
⎝9 7 8 4 0⎠
torneo σ = (21453). Pues es el único camino hamiltoniano del torneo. Lo
construimos paso a paso en la Figura 2.3.

Figura 2.3: Construcción del camino hamiltoniano paso a paso.

Si calculamos el resultado mediante la Ecuación (2.2) obtendremos de


nuevo el mismo resultado. Comprobémoslo: f ((21453)) = b21 +b24 +b25 +b23 +
b14 + b15 + b13 + b45 + b43 + b53 = 3 + 6 + 9 + 3 + 4 + 10 + 3 + 3 + 6 + 8 = 55.

2.2. Propiedades
El problema del LOP tiene algunas particularidades que se analizarán para
su mejor comprensión y el avance en desarrollo de técnicas utilizadas en su
resolución. En cada propiedad se muestra la representación mediante matri-
ces y mediante la digrafos. Sin embargo, para formalizar la demostración se
utilizará solo la representación matricial, pues basta con utilizar la equiva-
lencia entre ambas representaciones para obtener una demostración análoga
mediante digrafos.
Sean σ = (σ1 σ2 ...σn ) ∈ Sn , B ∈ M atn×n (R), D = (V, A) digrafo completo
ponderado y T = (V, A′ ) ⊂ D torneo acı́clico:

(i) Los valores que ocupan las posiciones bii , i ∈ {1, ..., n}, no aportan
ningún valor a la función a optimizar, sea cual sea la permutación
Capı́tulo 2. Problema de la ordenación lineal 15

escogida [3].
Si el grafo completo contiene aristas (i, i), i ∈ {1, ..., n}, el peso asociado
a estas nunca aportarán valor a la función a optimizar, pues sea cual
sea el torneo escogido este nunca tendrá un bucle o lazo, esto es no
contendrá una arista del tipo (i, i), por la propia definición de torneo.

Ejemplo 2.2.1. Vamos a ver esto en un ejemplo sencillo.


⎛10 1 2 ⎞
Tomamos una matriz B = ⎜ 3 10 4 ⎟.
⎝ 5 6 10⎠
Podemos calcular todas las posibles permutaciones y el valor de f
en cada una de las permutaciones de S3 = {σ 1 , σ 2 , σ 3 , σ 4 , σ 5 , σ 6 } =
{(123), (132), (213), (312), (231), (321)}:

○ σ 1 = (123) ○ σ 4 = (312)
1
⎛10 1 2 ⎞ 4
⎛10 5 6 ⎞
B σ = ⎜ 3 10 4 ⎟ B σ = ⎜ 2 10 1 ⎟
⎝ 5 6 10⎠ ⎝ 4 3 10⎠
f (σ ) = 1 + 2 + 4 = 7
1
f (σ ) = 5 + 6 + 1 = 12
4

○ σ 2 = (132) ○ σ 5 = (231)
2
⎛10 2 1 ⎞ 5
⎛10 4 3 ⎞
B σ = ⎜ 5 10 6 ⎟ B σ = ⎜ 6 10 5 ⎟
⎝ 3 4 10⎠ ⎝ 1 2 10⎠
f (σ ) = 1 + 2 + 6 = 9
2
f (σ ) = 4 + 3 + 5 = 12
5

○ σ 3 = (213) ○ σ 6 = (321)
3
⎛10 3 4 ⎞ 6
⎛10 6 5 ⎞
B σ = ⎜ 1 10 2 ⎟ B σ = ⎜ 4 10 3 ⎟
⎝ 6 5 10⎠ ⎝ 2 1 10⎠
f (σ ) = 3 + 4 + 2 = 9
3
f (σ ) = 6 + 5 + 3 = 14
6

Como podemos ver, al permutar simultáneamente filas y columnas, los


elementos de la diagonal principal se mantienen en la misma posición,
y como en la función objetivo no entran los elementos de la diagonal
principal, nunca se tendrán en cuenta.

Demostración 2.2.1. Por la Ecuación (2.2) sabemos que los valores


de la matriz que toman parte en el cálculo de la función objetivo son
de la forma bσi σj donde i ∈ {1, ..., n − 1} y j ∈ {i + 1, ..., n}.

⎪ bll = bσi σj


Por reducción al absurdo, supongamos que ∃l tal que: ⎨i ∈ {1, ..., n − 1}



⎩ j ∈ {i + 1, ...n}
16 2.2. Propiedades


⎪ l = σi ∧ l = σj ⎧
⎪ ∃σi = σj

⎪ ⎪

⇐⇒ ⎨i ∈ {1, ..., n − 1} ⇐⇒ ⎨i ∈ {1, ..., n − 1} ⇐⇒


⎪ ⎪


⎩ j ∈ {i + 1, ...n} ⎩ j ∈ {i + 1, ...n}

⎪ ⎧

⎪∃j ∈ {i0 + 1, ..., n} ⎪∃j ∈ {i0 + 1, ..., n}
⇐⇒ ⎨ ⇐⇒ ⎨ # ◻

⎪ tal que: σi0 = σj ⎪
⎪ tal que ∶ i0 = j
⎩ ⎩

(ii) Las entradas de la matriz B se pueden organizar por parejas simétri-


camente localizadas respecto a la diagonal principal [3]. Esto es, cada
entrada bij tiene su par asociado bji , donde i, j ∈ {1, 2, ...n}. Estas pa-
rejas permanecen asociadas, sea cual sea la permutación σ ∈ Sn .
Cada peso wij tiene su par asociado wji de modo que ambos pesos
corresponden a aristas que unen los mismos vértices: i, j ∈ V.

Ejemplo 2.2.2. Si tomamos la matriz original del ejemplo anterior, tendre-


mos las parejas:
{{b12 , b21 }, {b13 , b31 }, {b23 , b32 }} = {{1,3}, {2,5}, {4,6}} Si tomamos la per-
3
mutación σ 3 = (213) del ejemplo anterior y la matriz B σ , veremos que los
pares asociados son claramente los mismos: {{3, 1},{2, 5}, {4, 6}} y esto
ocurre para cualquiera de las permutaciones de S3 .

Demostración 2.2.2. Sean σ = (σ1 σ2 ...σi−1 σi σi+1 ...σj−1 σj σj+1 ...σn ) y la


b11 ... b1i−1 b1i b1i+1 ... b1j−1 b1j b1j+1 ... b1n
⎛ ⋮ ... ⋮ ⋮ ⋮ ... ⋮ ⋮ ⋮ ... ⋮ ⎞
⎜ bi−11 ... bi−1i−1 bi−1i bi−1i+1 ... bi−1j−1 bi−1j bi−1j+1 ... bi−1n ⎟
⎜ bi1 bin ⎟
⎜ ... bii−1 bii bii+1 ... bij−1 bij bij+1 ... ⎟
⎜ ⋮ ... ⋮ ⋮ ⋮ ... ⋮ ⋮ ⋮ ... ⋮ ⎟
matriz B = ⎜ bj−11 bj−1n ⎟.
⎜ ... bj−1i−1 bj−1i bj−1i+1 ... bj−1j−1 bj−1j bj−1j+1 ... ⎟
⎜ bj1 ... bji−1 bji bji+1 ... bjj−1 bjj bjj+1 ... bjn ⎟
⎜b ⎟
⎜ j+11 ... bj+1i−1 bj+1i bj+1i+1 ... bj+1j−1 bj+1j bj+1j+1 ... bj+1n ⎟
⎝ b⋮ ... ⋮ ⋮ ⋮ ... ⋮ ⋮ ⋮ ... ⋮ ⎠
n1 ... bni−1 bni bni+1 ... bnj−1 bnj bnj+1 ... bnn

Las parejas simétricamente resultantes de la matriz B serán de la forma:


{bki , bik }, con k =/ j; {bkj , bij }, con k =/ i; {bkl , blk }, con k, l =/ i, j y {bji , bij }.
Supongamos ahora que permutamos B mediante
σ 1 = (σ1 σ2 ...σi−1 σj σi σi+1 ...σj−1 σj+1 ...σn ).

Permutando primeramente columnas y después filas, obtendrı́amos:

⎛ b11

...
...
b1j

b1i

...
...
b1j−1

b1j+1

...
...
b1n
⋮ ⎞
⎜ bi1 ⎟
⎜ ⋮ ... bij

bii

... bij−1

bij+1

... bin


⎜ ... ... ... ⎟
⎜ bj−11 ... bj−1j bj−1i ... bj−1j−1 bj−1j+1 ... bj−1n ⎟
⎜ b ⎟
⎜ j1 ... bjj bji ... bjj−1 bjj+1 ... bjn ⎟
⎜ bj+11 bj+1n ⎟
⎜ ... bj+1j bj+1i ... bj+1j−1 bj+1j+1 ... ⎟
⋮ ... ⋮ ⋮ ... ⋮ ⋮ ... ⋮
⎝ bn1 ... bnj bni ... bnj−1 bnj+1 ... bnn ⎠


Capı́tulo 2. Problema de la ordenación lineal 17

b11 ... b1j b1i ... b1j−1 b1j+1 ... b1n


⎛ ⋮ ... ⋮ ⋮ ... ⋮ ⋮ ... ⋮ ⎞
⎜ bi−11... bi−1j bi−1i ... bi−1j−1 bi−1j+1 ... bi−1n ⎟
⎜ bj1 bjn ⎟
⎜ ... bjj bji ... bjj−1 bjj+1 ... ⎟
⎜ bi1 bin ⎟
⎜ ⋮ ... bij

bii

... bij−1

bij+1

...
⋮ ⎟
⎟.
⎜ ... ... ...
⎜ bj−11... bj−1j bj−1i ... bj−1j−1 bj−1j+1 ... bj−1n ⎟
⎜b ⎟
⎜ j+11 ... bj+1j bj+1i ... bj+1j−1 bj+1j+1 ... bj+1n ⎟
⎝ b⋮ ... ⋮ ⋮ ... ⋮ ⋮ ... ⋮ ⎠
n1 ... bnj bni ... bnj−1 bnj+1 ... bnn

De este modo, podemos ver que las posiciones que varı́an son las siguientes:

En la posición (k, i), con k =/ i, j de la matriz original B se encon-


traba el elemento bki y en la posición (k, i), con k =/ i, j de matriz
1
permutada B σ se encuentra el elemento bkj .
En la posición (k, l), con k =/ i, j, l ∈ {i + 1, ..., j − 1} de la matriz
original B se encontraba el elemento bkl y en la posición (k, l),
1
de matriz permutada B σ se encuentra el elemento bkl−1 .
En la posición (i, k), con k =/ i, j de la matriz original B se encon-
traba el elemento bik y en la posición (i, k), con k =/ i, j de matriz
1
permutada B σ se encuentra el elemento bjk .
En la posición (l, k), con k =/ i, j, l ∈ {i + 1, ..., j − 1} de la matriz
original B se encontraba el elemento blk y en la posición (l, k),
1
de matriz permutada B σ se encuentra el elemento bl−1k .
En la posición (i, j), de la matriz original B se encontraba el
1
elemento bij y en la posición (i, j), de matriz permutada B σ se
encuentra el elemento bjj+1 .
En la posición (j, i) de la matriz original B se encontraba el
1
elemento bji y en la posición (j, i) de matriz permutada B σ se
encuentra el elemento bj+1j .

Veamos por último cómo afectan estos cambios a la formación de parejas


asociadas de la matriz:

Las posiciones que ocupaban las parejas de la forma {bij , bji } de


la matriz original B, pasan a estar ocupadas por las parejas de
1
la forma {bjj+1 , bj+1j } de la matriz permutada B σ .
Las posiciones que ocupaban las parejas de la forma {bki , bik } con
k =/ i, j de la matriz original B, pasan a estar ocupadas por las
1
parejas de la forma {bkj , bjk } con k =/ i, j de la matriz B σ .
Las posiciones que ocupaban las parejas de la forma {blk , bkl } con
k =/ i, j; l ∈ {i + 1, ..., j − 1} de la matriz original B, pasan a estar
ocupadas por las parejas de la forma {bl−1k , bkl−1 } de la matriz
1
permutada B σ .
18 2.2. Propiedades

Las posiciones que ocupaban las parejas de la forma {brs , bsr } con
r, s ∈ {1, ..., i − 1} ∪ {j + 1, ..., n} no cambian de posición.

Por tanto, las parejas simétricamente resultantes de la matriz permutada


1
B σ coinciden exactamente con las obtenidas para la matriz original B.
En el caso en el que la permutación que se quiera aplicar a la matriz B tenga
más cambios, bastarı́a con aplicar el mismo razonamiento tantas veces como
cambios de filas y columnas se quieran realizar. ◻

(iii) Para cada par de entradas asociadas, una de las entradas se encuentra por
encima de la diagonal principal y la otra por debajo, ∀σ ∈ Sn [3]. Por lo
que, podemos acotar toda solución entre dos valores que puede que no sean
alcanzados: ∑ min{bij , bji } ≤ f (σ) ≤ ∑ max{bij , bji }.
i<j i<j
Para cada pareja de pesos asociados, las aristas a las que corresponden di-
chos pesos tendrán direcciones opuestas, consecuentemente, solo una de las
aristas formará parte del torneo y solo uno de los pesos se sumará en la fun-
ción objetivo. Por lo que, podemos acotar toda solución entre dos valores que
puede que no sean alcanzados: ∑ min{wij , wji } ≤ f (A′ ) ≤ ∑ max{wij , wji }.
i<j i<j

Ejemplo 2.2.3. Si tomamos los pares asociados de la matriz B del ejemplo


anterior, ∀σ ∈ S3 , podemos acotar la solución entre dos valores del siguiente
modo:
min{1, 3}+min{2, 5}+min{4, 6} ≤ f (σ) ≤ max{1, 3}+max{2, 5}+max{4, 6}
1 + 2 + 4 = 7 ≤ f (σ) ≤ 3 + 5 + 6 = 14.
Demostración 2.2.3. Como hemos demostrado en la Propiedad (ii) po-
demos organizar las entradas de la matriz que no están sobre la diagonal
principal por parejas simétricamente localizadas {bσi σj , bσj σi } ∀σ ∈ Sn ∧
σi =/ σj . Por tanto, σi > σj o σi < σj .
Supongamos que σj > σi , entonces bσi σj se encuentra por encima de la dia-
gonal principal Ô⇒ bσj σi se encuentra por debajo de la diagonal.
Como en la definición de la función objetivo solo intervienen los valores si-
tuados por encima de la diagonal principal, solo uno de los elementos de
cada pareja {bσi σj , bσj σi } sumará en la función objetivo.
El mejor de los casos se dará cuando de cada pareja sea el valor máximo
el que intervenga en la función objetivo y por tanto, el valor máximo que
podrı́amos obtener para la función objetivo serı́a: ∑ max{bij , bji }. Por el
i<j
contrario, el peor de los casos se dará cuando de cada pareja sea el valor
mı́nimo el que intervenga en la función objetivo y por tanto, el valor mı́nimo
que podrı́amos obtener serı́a: ∑ min{bij , bji }. ◻
i<j

(iv) Si σ es la permutación con la que se obtiene la solución del problema de


optimización, es decir, maximiza la suma de los elementos que se encuentren
Capı́tulo 2. Problema de la ordenación lineal 19

por encima de la diagonal, entonces, dicha permutación σ es la que minimiza


la suma de los elementos que se encuentran por debajo de la diagonal [3].
Esto es, si σ es el óptimo global para (2.1), entonces también es el óptimo
global de:
M in f ′ ∶ Sn Ð→ R
n n−1 n (2.5)
σ z→ f ′ (σ) = ∑ bσij = ∑ ∑ bσij
i>j j=1 i=j+1

Si T es el torneo con el que se obtiene la solución del problema de optimiza-


ción, entonces, si se invierte la dirección de todas las aristas de T , el torneo
resultante T es el torneo de peso asociado mı́nimo.

Ejemplo 2.2.4. Si tomamos el ejemplo anterior y calculamos el valor de la


función (2.5) ∀σ ∈ Sn , tendremos los siguientes resultados:

○ f ′ (σ 1 ) = 3 + 5 + 6 = 14 ○ f ′ (σ 4 ) = 2 + 4 + 3 = 9
○ f ′ (σ 2 ) = 5 + 3 + 4 = 12 ○ f ′ (σ 5 ) = 6 + 1 + 2 = 9
○ f ′ (σ 3 ) = 1 + 5 + 6 = 12 ○ f ′ (σ 6 ) = 4 + 2 + 1 = 7

Vemos que el menor de los valores es 7 que proviene de calcular el valor de


f ′ con la permutación σ 6 , que es precisamente la permutación con la que se
obtiene el valor máximo de f .

Demostración 2.2.4. Sean B ∈ M atn×n (R) y σ ∈ Sn óptimo global.


Supongamos por reducción al absurdo que ∃σ 1 ∈ Sn que no es óptimo global,
pero que minimiza la suma de elementos que se encuentran por debajo de
la diagonal principal. Como he demostrado en la Propiedad (iii), para cada
pareja de elementos asociados {bσi σj , bσj σi } solo uno es un sumando de la
Ecuación (2.1). Consecuentemente, para una misma permutación σ ∈ Sn , de
cada pareja un elemento sumará en la definición de f y el otro elemento
sumará en la función f ′ . Por tanto, si f ′ (σ) > f ′ (σ 1 ) Ô⇒ f (σ) < f (σ 1 )#
ya que habı́amos supuesto que σ era un óptimo global pero σ 1 no lo era. ◻

(v) Sea B ∈ M atn×n (R) una matriz simétrica, entonces ∀σ ∈ Sn f (σ) tiene un
valor constante: f (σ) = ∑ bij = ∑ bij .
i<j i>j
Sea D un digrafo completo, si el par de aristas que une dos vértices tiene
el mismo peso asociado, entonces f (A) tiene un valor constante: f (A) =
∑ wij = ∑ wij .
i<j i>j

⎛10 1 2 ⎞
Ejemplo 2.2.5. Sea B = ⎜ 1 10 3 ⎟ una matriz simétrica.
⎝ 2 3 10⎠
Claramente ∀σ ∈ S3 , f (σ) = 1 + 2 + 3 = 6 ∀σ ∈ S3 .
20 2.3. Espacio de búsqueda

Demostración 2.2.5. Si B es una matriz simétrica Ô⇒ bij = bji ∀i =/ j.


Teniendo en cuenta las propiedades (ii) y (iii):
∑ min{bij , bji } ≤ f (σ) ≤ ∑ max{bij , bji } ⇐⇒
i<j i<j
⇐⇒ ∑ min{bij , bij } ≤ f (σ) ≤ ∑ max{bij , bij } ⇐⇒
i<j i<j
⇐⇒ ∑ bij ≤ f (σ) ≤ ∑ bij Ô⇒ f (σ) = ∑ bij ◻
i<j i<j i<j

Las demostraciones de estas propiedades no han sido extraı́das de nin-


guna fuente y suponen un aporte personal. Además, la última propiedad
también es un aporte propio.

2.3. Espacio de búsqueda


Uno de los inconvenientes en la resolución del LOP es que espacio de búsque-
da (las permutaciones o los torneos) crece de forma exponencial. Además,
el espacio de búsqueda no está ordenado, es decir, a priori no podemos es-
tablecer un orden entre ellas, pero lo que sı́ que podemos es dotar de una
estructura al de búsqueda para poder definir una métrica o distancia sobre
sus elementos.

Definición 2.3.1. Sea S un espacio discreto, un entorno o vecindario N de


un punto (x1 x2 ...xn ) ∈ S está definido por la aplicación [1]:

N ∶ S Ð→ P(S)\Ø
(x1 x2 ...xn ) z→ N ((x1 x2 ...xn ))

donde P es el conjunto de partes de S.


Definición 2.3.2. Llamamos landscape a la terna (S, f, N ) donde S es el
espacio de búsqueda de un problema de optimización combinatoria, f es su
función objetivo y N un vecindario definido sobre S.
Como para un mismo espacio de búsqueda podemos encontrar diferentes
vecindarios, también podemos definir diferentes landscapes para un mismo
problema.
Definición 2.3.3. Sea (S, f, N ) un landscape, diremos que un punto factible
(x1 x2 ...xn ) ∈ S es un óptimo local si [3]:
En el caso que se busque maximizar, ∀(y1 y2 ...yn ) ∈ N ((x1 x2 ...xn )) se
cumple que f ((y1 y2 ...yn )) ≤ f ((x1 x2 ...xn )).

En el caso que se busque minimizar, ∀(y1 y2 ...yn ) ∈ N ((x1 x2 ...xn )) se


cumple que f ((y1 y2 ...yn )) ≥ f ((x1 x2 ...xn )).
Capı́tulo 2. Problema de la ordenación lineal 21

Claramente, el óptimo local depende del vecindario elegido. Esto es, un punto
factible puede ser óptimo local bajo un vecindario, pero puede no serlo bajo
otro. Por el contrario, los óptimos globales no dependen del vecindario y
además, serán óptimos locales bajo cualquier vecindario.
En lo que respecta a nuestro problema, el espacio discreto es el grupo
simétrico Sn , por tanto, para cada permutación σ ∈ Sn se le hará corres-
ponder un conjunto de permutaciones que variará en función del criterio
con el que definamos el vecindario. Análogamente, se podrı́an definir los
vecindarios sobre la representación en digrafos. Sin embargo, el estudio y
las demostraciones de las propiedades de los vecindarios se desarrollarán
mediante representación matricial, por tanto, sobre Sn . Algunos de los ve-
cindarios sobre Sn más relevantes son: el vecindario intercambio adyacente,
el vecindario intercambio o 2-cambio y el vecindario inserción 3 .

2.3.1. Vecindario adyacente


El vecindario intercambio adyacente asocia a cada permutación σ ∈ Sn
(n ≥ 2) el conjunto de todas las permutaciones que se obtienen al inter-
cambiar dos elementos adyacentes de σ [8].

Esto es, sea σ = (σ1 σ2 ...σi σi+1 ...σn ) ∈ Sn , entonces el vecindario adyacen-
te será: Nady (σ) = {(σ1 σ2 ...σi+1 σi ...σn ) ∈ Sn ∣i ∈ {1, ..., n − 1}}.

Lema 2.3.1. El vecindario adyacente de un una permutación de tamaño n,


σ ∈ Sn , está formado por n − 1 permutaciones.

Equivalentemente para el caso de la representación mediante digrafos,


tendrı́amos que si T ⊂ D es un torneo acı́clico, el vecindario intercambio
adyacente está formado por el conjunto torneos que se obtienen al invertir
la dirección de una arista del camino hamiltoniano.
Teorema 2.3.1. Una permutación σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn es un óptimo
local para el vecindario adyacente si y solo si los elementos de la matriz
B = [bij ]n×n del LOP satisfacen [8]:
bσi∗ σi+1
∗ ≥ bσi+1
∗ σ ∗ , ∀i ∈ {1, ..., n − 1}.
i

Equivalentemente, para la representación mediante digrafos completos tene-


mos que un torneo acı́clico T ⊂ D cuyo camino hamiltoniano es: (v1 v2 ...vn )
es un óptimo local para el vecindario adyacente si y solo:
3
En el Apéndice D se pueden encontrar las demostraciones de los Lemas 2.3.1, 2.3.2
y 2.3.3, la generalización de los Teoremas 2.3.1 y 2.3.2 que suponen un aporte propio y
la relación con dos conocidas familias de números (números de Fibonacci y números de
Motzkin).
22 2.3. Espacio de búsqueda

wvi vi+1 ≥ wvi+1 vi , ∀i ∈ {1, ..., n − 1}.

Demostración 2.3.1. Supongamos que σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn es un ópti-


mo local del LOP sobre el vecindario de intercambio adyacente que es el
siguiente: Nady (σ ∗ ) = {(σ1∗ ....σi+1∗
σi∗ ....σn∗ )∣i ∈ {1, ..., n − 1}}
Ahora calcularemos el valor de la función de cada σ perteneciente a Nady (σ ∗ )
en función de f (σ ∗ ). Sabemos que f (σ) y f (σ ∗ ) solo difieren en un sumando,
ya que σ ∗ y σ solo difieren en dos posiciones consecutivas por pertenecer al
vecindario adyacente. Es por ello que podemos establecer la siguiente igual-
dad:
f (σ) = f (σ ∗ ) − bσi∗ σi+1
∗ + bσi+1
∗ σ∗

Luego, σ ∗ es un óptimo local ⇐⇒ f (σ ∗ ) ≥ f (σ) = f (σ ∗ ) − bσi∗ σi+1


i
∗ + bσi+1
∗ σ∗
∗ ∗
i
⇐⇒ f (σ ) ≥ f (σ ) − bσi∗ σi+1 ∗ + bσi+1
∗ σ ∗ ⇐⇒ 0 ≥ −bσ ∗ σ ∗
i i i+1
+ bσi+1
∗ σ∗
i
⇐⇒ bσi∗ σi+1
∗ ≥ bσi+1
∗ σ∗
i

Ejemplo 2.3.1. Supongamos que σ ∗ = (12345) ∈ S5 es un óptimo local del


LOP sobre el vecindario de intercambio adyacente que es el siguiente:
Nady ((12345)) = {(21345), (13245), (12435), (12354)}.
Como hemos supuesto que σ ∗ es un óptimo local del LOP:
f (σ∗) ≥ f (σ), ∀σ ∈ Nady (σ ∗ ) y donde f está definida mediante la Ecua-
ción (2.2). Por tanto, aplicando la definición de óptimo local a los cuatro
elementos del vecindario:

f (σ ∗ ) = f ((12345)) ≥ f ((21345)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b21 + b23 + b24 + b25 + b13 + b14 + b15 + b34 + b35 + b45 ⇐⇒ b12 ≥ b21

f (σ ∗ ) = f ((12345)) ≥ f ((13245)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b13 + b12 + b14 + b15 + b32 + b34 + b35 + b24 + b25 + b45 ⇐⇒ b23 ≥ b32

f (σ ∗ ) = f ((12345)) ≥ f ((12435)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b12 + b14 + b13 + b15 + b24 + b23 + b25 + b43 + b45 + b35 ⇐⇒ b34 ≥ b43

f (σ ∗ ) = f ((12345)) ≥ f ((12354)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b12 + b13 + b15 + b14 + b23 + b25 + b24 + b35 + b34 + b54 ⇐⇒ b45 ≥ b54

2.3.2. Vecindario intercambio o 2-cambio


Sea σ ∈ Sn (n ≥ 2) una permutación, el vecindario intercambio está formado
por el conjunto de todas las permutaciones que se obtienen al intercambiar
dos elementos cualesquiera de σ [8].
Capı́tulo 2. Problema de la ordenación lineal 23

Esto es, sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn e i < j, entonces el vecindario in-
tercambio será: Nint (σ) = {(σ1 σ2 ...σj ...σi ...σn ) ∈ Sn ∣i, j ∈ {1, ..., n}, i < j}.

Lema 2.3.2. El vecindario intercambio de un una permutación de tamaño


n(n−1)
n, σ ∈ Sn , está formado por 2 permutaciones.

Equivalentemente para el caso de la representación mediante digrafos,


tendrı́amos que si T ⊂ D es un torneo acı́clico, el vecindario intercambio está
formado por el conjunto torneos que se obtienen seleccionando dos vértices
cualesquiera e invirtiendo la dirección de todas sus aristas.

Teorema 2.3.2. Dado σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn un óptimo local (para el ve-
cindario intercambio o 2-cambio) ⇐⇒ las entradas de la matriz B = [bij ]n×n
satisfacen [8]:

j j−1 j j−1
∑ bσi∗ σk∗ + ∑ bσk∗ σj∗ ≥ ∑ bσk∗ σi∗ + ∑ bσj∗ σk∗ ,
k=i+1 k=i k=i+1 k=i
∀i ∈ {1, ..., n − 1} , ∀j ∈ {i + 1, ..., n}

Para la representación mediante digrafos completos tenemos que un tor-


neo acı́clico T ⊂ D cuyo camino hamiltoniano es (v1 v2 ...vn ) es un óptimo
local para el vecindario intercambio si y solo:
j j−1 j j−1
∑ ωvi∗ vk∗ + ∑ ωvk∗ vj∗ ≥ ∑ ωvk∗ vi∗ + ∑ ωvj∗ vk∗ ,
k=i+1 k=i k=i+1 k=i
∀i ∈ {1, ..., n − 1} , ∀j ∈ {i + 1, ..., n}

Demostración 2.3.2. Sea σ ∗ = (σ1∗ σ2∗ . . . σn∗ ) un óptimo local para el vecin-
dario intercambio Nint (σ ∗ ) = {(σ1∗ ....σi−1 ∗
σj∗ σi+1
∗ ∗
....σj−1 σi∗ σj+1

....σn∗ )∣i ∈ {1, ..., n−
1}, j ∈ {i + 1, ..., n}} ⇐⇒ f (σ ∗ ) ≥ f (σ), ∀σ ∈ Nint (σ ∗ )
⇐⇒ f (σ ∗ ) ≥ f (σ ∗ ) − [bσi∗ σi+1∗ + bσi∗ σi+2
∗ + ⋅ ⋅ ⋅ + bσi∗ σj−1
∗ + bσi∗ σj∗ ]+
+[bσj∗ σi∗ + bσj∗ σi+1
∗ + ⋅ ⋅ ⋅ + bσj∗ σj−2
∗ + bσj∗ σj−1
∗ ]+

−[bσi∗ σj∗ + bσi+1


∗ σ ∗ + ⋅ ⋅ ⋅ + bσ ∗ σ ∗ + bσ ∗ σ ∗ ]+
j j−2 j j−1 j
+[bσi+1
∗ σ ∗ + bσ ∗ σ ∗ + ⋅ ⋅ ⋅ + bσ ∗ σ ∗ + bσ ∗ σ ∗ ] =
i i+2 i j−1 i j i
j j−1 j−1 j
= f (σ ∗ ) − ∑ bσi∗ σk∗ + ∑ bσj∗ σk∗ − ∑ bσk∗ σj∗ + ∑ bσk∗ σi∗ ⇐⇒
k=i+1 k=i k=i k=i+1
j j−1 j−1 j
⇐⇒ 0 ≥ − ∑ bσi∗ σk∗ + ∑ bσj∗ σk∗ − ∑ bσk∗ σj∗ + ∑ bσk∗ σi∗ ⇐⇒
k=i+1 k=i k=i k=i+1
j j−1 j−1 j
⇐⇒ ∑ bσi∗ σk∗ + ∑ bσk∗ σj∗ ≥ ∑ bσj∗ σk∗ + ∑ bσk∗ σi∗
k=i+1 k=i k=i k=i+1

Para desarrollar la demostración me he basado en [8]. ◻


24 2.3. Espacio de búsqueda

Ejemplo 2.3.2. Sea σ ∗ = (12345) ∈ S5 un óptimo local para el vecindario


intercambio que al ser σ ∗ ∈ S5 , tendrá
5⋅(5−1)
2 = 10 elementos que serán los
siguientes:
Nint (σ ∗ ) = {(21345), (32145), (42315), (52341), (13245), (14325), (15342),
(12435), (12543), (12354)}
Por ser σ ∗ un óptimo local: f (σ ∗ ) ≥ f (σ), ∀σ ∈ Nint (σ ∗ ).
Ası́ que, vamos a comprobar esto con todas las permutaciones del vecindario:

f (σ ∗ ) = f ((12345)) ≥ f ((21345)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b21 + b23 + b24 + b25 + b13 + b14 + b15 + b34 + b35 + b45 ⇐⇒
⇐⇒ b12 ≥ b21

f (σ ∗ ) = f ((12345)) ≥ f ((32145)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b32 + b31 + b34 + b35 + b21 + b24 + b25 + b14 + b15 + b45 ⇐⇒
⇐⇒ b12 + b13 + b23 ≥ b32 + b31 + b21

f (σ ∗ ) = f ((12345)) ≥ f ((42315)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b42 + b43 + b41 + b45 + b23 + b21 + b25 + b31 + b35 + b15 ⇐⇒
⇐⇒ b12 + b13 + b14 + b24 + b34 ≥ b42 + b43 + b41 + b21 + b31

f (σ ∗ ) = f ((12345)) ≥ f ((52341)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b52 + b53 + b54 + b51 + b23 + b24 + b21 + b34 + b31 + b41 ⇐⇒
⇐⇒ b12 +b13 +b14 +b15 +b25 +b35 +b45 ≥ b52 +b53 +b54 +b51 +b21 +b31 +b41

f (σ ∗ ) = f ((12345)) ≥ f ((13245)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b13 + b12 + b14 + b15 + b32 + b34 + b35 + b24 + b25 + b45 ⇐⇒
⇐⇒ b23 ≥ b32

f (σ ∗ ) = f ((12345)) ≥ f ((14325)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b14 + b13 + b12 + b15 + b43 + b42 + b45 + b32 + b35 + b25 ⇐⇒
⇐⇒ b23 + b24 + b34 ≥ b43 + b42 + b32

f (σ ∗ ) = f ((12345)) ≥ f ((15342)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b15 + b13 + b14 + b12 + b53 + b54 + b52 + b34 + b32 + b42 ⇐⇒
⇐⇒ b23 + b24 + b25 + b35 + b45 ≥ b53 + b54 + b52 + b32 + b42

f (σ ∗ ) = f ((12345)) ≥ f ((12435)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
Capı́tulo 2. Problema de la ordenación lineal 25

≥ b12 + b14 + b13 + b15 + b24 + b23 + b25 + b43 + b45 + b35 ⇐⇒
⇐⇒ b34 ≥ b43

f (σ ∗ ) = f ((12345)) ≥ f ((12543)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b12 + b15 + b14 + b13 + b25 + b24 + b23 + b54 + b53 + b43 ⇐⇒
⇐⇒ b34 + b35 + b45 ≥ b43 + b53 + b54

f (σ ∗ ) = f ((12345)) ≥ f ((12354)) ⇐⇒
⇐⇒ b12 + b13 + b14 + b15 + b23 + b24 + b25 + b34 + b35 + b45 ≥
≥ b12 + b13 + b15 + b14 + b23 + b25 + b24 + b35 + b34 + b54 ⇐⇒
⇐⇒ b45 ≥ b54

2.3.3. Vecindario Inserción


Sea σ una permutación su entorno de inserción está formado por el con-
junto de todas las permutaciones que se obtienen al tomar el elemento
de una de las posiciones j e insertarlo en otra posición i [8]. Esto es, sea
σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , entonces su vecindario insercción será:
Nins (σ) = {(σ1 ....σi−1 σi+1 ....σj−1 σj σi σj+1 ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n−2}} si i < j,
Nins (σ) = {(σ1 ....σj−1 σi σj σj+1 ....σi−1 σi+1 ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}} si i > j.

Lema 2.3.3. El vecindario inserción de un una permutación de tamaño n, σ ∈ Sn ,


está formado por (n − 1)2 permutaciones.

Equivalentemente para el caso de la representación mediante digrafos, tendrı́amos


que si T ⊂ D es un torneo acı́clico, cuyo único camino hamiltoniano es (v1 ...vn ) el
vecindario inserción está formado por el conjunto torneos que se obtienen seleccio-
nando el vértice vi y la posición j en la que se insertará dicho vértice e invirtiendo
la dirección de las aristas del vértice vi que se unen con vértices situados entre las
posiciones i − j o j − i del camino hamiltoniano.

Teorema 2.3.3. Una solución σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn es un óptimo local (de su
vecindario inserción) ⇐⇒ las entradas de la matriz A = [bij ]nxn satisfacen [8]:

j j
∑ bσi∗ σk∗ ≥ ∑ bσk∗ σi∗ , ∀i ∈ {1, ..., n − 1}, ∀j ∈ {i + 1, ..., n}
k=i+1 k=i+1
i−1 i−1
∑ bσk∗ σi∗ ≥ ∑ bσi∗ σk∗ , ∀i ∈ {3, ..., n}, ∀j ∈ {1, ..., i − 2}
k=j k=j

Para la representación mediante digrafos completos tenemos que un torneo


acı́clico T ⊂ D cuyo camino hamiltoniano es (v1 v2 ...vn ) es un óptimo local para el
vecindario inserción si y solo:
j j
∑ ωvi∗ vk∗ ≥ ∑ ωvk∗ vi∗ , ∀i ∈ {1, ..., n − 1}, ∀j ∈ {i + 1, ..., n}
k=i+1 k=i+1
i−1 i−1
∑ ωvk∗ vi∗ ≥ ∑ ωvi∗ vk∗ , ∀i ∈ {3, ..., n}, ∀j ∈ {1, ..., i − 2}
k=j k=j
26 2.3. Espacio de búsqueda

Demostración 2.3.3. Supongamos que σ ∗ = (σ1∗ σ2∗ . . . σn∗ ) es un óptimo local de


su vecindario inserción que vamos a construir con la unión de dos conjuntos, ya que
el vecindario de inserción consiste en insertar el elemento i-ésimo tras el elemento
j-ésimo, sin embargo, pueden darse dos situaciones: i < j o i > j.
Nins (σ ∗ ) = Nins (σ ∗ )i<j ⊍ Nins (σ ∗ )i>j donde σi<j ∗ ∗
y σi>j representan las dos situa-
ciones descritas anteriormente. Por ello, tenemos dos subvecindarios que serı́an los
siguientes:

Nins (σi<j ) = {(σ1∗ ....σi−1
∗ ∗
σi+1 ∗
....σj−1 σj∗ σi∗ σj+1

....σn∗ )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}}
∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
Nins (σi>j ) = {(σ1 ....σj−1 σi σj σj+1 ....σi−1 σi+1 ....σn∗ )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}}
Y la unión de estos dos conjuntos formarán el vecindario de insercción. A continua-
ción vamos a calcular el valor de la función objetivo de un elemento σ ∈ Nins (σ ∗ )
en términos de f (σ ∗ ), pero esta vez vamos a distinguir dos casos, dependiendo de
a qué conjunto del vecindario pertenezcan [8]:

i<j
f (σ) = f (σ ∗ ) − [bσi∗ σi+1
∗ + bσi∗ σi+2
∗ + ⋯ + bσi∗ σj−1
∗ + bσi∗ σj∗ ] + [bσi+1

σi∗ + bσi+2

σi∗ + ⋯ +
bσj−1

σi∗ + bσj∗ σi∗ ] =
j j
= f (σ ∗ ) − ∑ bσi∗ σk∗ + ∑ bσk∗ σi∗
k=i+1 k=i+1

i>j
f (σ) = f (σ ∗ ) − [bσj∗ σi∗ + bσj+1

σi∗ + ⋯ + bσi−2

σi∗ + bσi−1

σi∗ ] + [bσi∗ σj∗ + bσi∗ σj+1
∗ +⋯+
bσi∗ σi−2
∗ + bσi∗ σi−1
∗ ] =

i−1 i−1
= f (σ ∗ ) − ∑ bσk∗ σi∗ + ∑ bσi∗ σk∗
k=j k=j

Como hemos supuesto que σ ∗ es un óptimo local, sabemos que :


f (σ ) ≥ f (σ), ∀σ ∈ Nins (σ ∗ ).

Ası́ que aplicando esta desigualdad a las igualdades anteriormente obtenidas:

i<j
j j
f (σ ∗ ) ≥ f (σ ∗ ) − ∑ bσi∗ σk∗ + ∑ bσk∗ σi∗
k=i+1 k=i+1
j j
∑ bσi∗ σk∗ ≥ + ∑ bσk∗ σi∗
k=i+1 k=i+1

i>j
i−1 i−1
f (σ ∗ ) ≥ f (σ ∗ ) − ∑ bσk∗ σi∗ + ∑ bσi∗ σk∗
k=j k=j
i−1 i−1
∑ bσk∗ σi∗ ≥ ∑ bσi∗ σk∗
k=j k=j

De modo que, hemos obtenido las dos desigualdades del teorema. ◻

Ejemplo 2.3.3. Sea σ ∗ = (1234) un óptimo local para su vecindario inserción


que al ser σ ∗ ∈ S4 , tendrá (4 − 1)2 = 9 elementos que serán los siguientes [8]:
Nint (σ ∗ ) = {(2134), (2314), (2341), (1324), (1342), (3124), (1243), (4123), (1423)}
y por ser σ ∗ un óptimo local → f (σ ∗ ) ≥ f (σ), ∀σ ∈ Nins (σ ∗ ).
Ası́ que, vamos a comprobar esto con todas las permutaciones del vecindario[8]:
Capı́tulo 2. Problema de la ordenación lineal 27

f (σ ∗ ) = f ((1234)) ≥ f ((2134))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b21 + b23 + b24 + b13 + b14 + b34
b12 ≥ b21
f (σ ∗ ) = f ((1234)) ≥ f ((2314))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b23 + b21 + b24 + b31 + b34 + b14
b12 + b13 ≥ b21 + b31
f (σ ∗ ) = f ((1234)) ≥ f ((2341))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b23 + b24 + b21 + b34 + b31 + b41
b12 + b13 + b14 ≥ b21 + b31 + b41
f (σ ∗ ) = f ((1234)) ≥ f ((1324))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b13 + b12 + b14 + b32 + b34 + b24
b23 ≥ b32
f (σ ∗ ) = f ((1234)) ≥ f ((1342))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b13 + b14 + b12 + b34 + b32 + b42
b23 + b24 ≥ b42 + b32
f (σ ∗ ) = f ((1234)) ≥ f ((3123))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b31 + b32 + b34 + b12 + b14 + b24
b13 + b23 ≥ b31 + b32
f (σ ∗ ) = f ((1234)) ≥ f ((1243))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b12 + b14 + b13 + b24 + b23 + b43
b34 ≥ b43
f (σ ∗ ) = f ((1234)) ≥ f ((4123))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b41 + b42 + b43 + b12 + b13 + b23
b14 + b24 + b34 ≥ b41 + b41 + b43
f (σ ∗ ) = f ((1234)) ≥ f ((1423))
b12 + b13 + b14 + b23 + b24 + b34 ≥ b14 + b12 + b13 + b42 + b43 + b23
b24 + b34 ≥ b42 + b43
Capı́tulo 3

Métodos de resolución
exactos

De acuerdo con lo que hemos afirmado anteriormente, el problema de la ordenación


lineal es del tipo NP-Completo [9]. En consecuencia, si queremos obtener la solución
de una instancia del problema, debemos aplicar un método exacto cuyo tiempo de
ejecución sea no polinómico en la dimensión del problema. En este capı́tulo aborda-
remos el problema utilizando dos métodos exactos: el más simple, aunque también
el más ineficiente, es el de la búsqueda exhaustiva; y un segundo método basado
en la búsqueda de los óptimo locales. Este segundo nuevo método será mucho más
eficiente que una búsqueda exhaustiva, aún siendo también no polinómico en la di-
mensión del problema. A fin de observar esta diferencia en el tiempo de ejecución:
desarrollaremos ambos métodos, los aplicaremos a matrices de diferentes tamaños
y mediremos el tiempo necesario para resolver las instancias del problema.

3.1. Búsqueda exhaustiva


El primer método que implementamos para resolver el LOP es la búsqueda exhaus-
tiva. Dada una matriz de tamaño n, el algoritmo calcula el valor de la función
objetivo para cada una de las permutaciones del espacio de búsqueda Sn . En cada
cálculo de la función objetivo, se compara el nuevo resultado obtenido con el me-
jor resultado conseguido hasta ese momento que denominaremos solución actual,
pudiéndose dar tres situaciones:

Si la solución actual es mayor que el nuevo resultado, entonces se desecha el


nuevo valor y se mantiene la solución actual.

Si la solución actual es menor que el nuevo resultado, entonces se desecha la


solución actual y se establece el valor calculado como nueva solución actual
junto con la nueva permutación.

Si la solución actual y el nuevo resultado tienen el mismo valor, solamente se


guarda la nueva permutación junto con las ya obtenidas hasta ese momento
y se mantiene el valor de la solución actual.

29
30 3.2. Búsqueda basada en óptimos locales

3.2. Búsqueda basada en óptimos locales


Como ya hemos citado anteriormente, en el problema de la ordenación lineal el
espacio de búsqueda crece de forma exponencial a medida que aumenta el tamaño
del problema y además no existe ningún orden. Por este motivo, los algoritmos que
requieren de explorar todo el espacio de búsqueda, como la búsqueda exhaustiva, no
son eficaces. La caracterización de los óptimos locales, nos permite reducir el número
de puntos factibles a explorar para obtener el óptimo global de forma exacta. A
continuación se describe un algoritmo exacto que hace uso de la caracterización de
los óptimos locales del vecindario adyacente dada por el Teorema 2.3.1 para resolver
el problema.

3.2.1. Construcción del grafo óptimo


Vamos a construir un subgrafo del digrafo completo que contenga todos los óptimos
locales del vecindario adyacente. A este grafo le denominaremos grafo óptimo.

Dada una matriz B ∈ M atn×n (R) de un LOP, calculamos su grafo óptimo


D′ = (V, A′ ), que será dirigido y ponderado, de la siguiente forma:

(i) Localizamos las parejas simétricamente localizadas de la matriz B, esto es:


{bij , bji }, ∀i, j ∈ {1, 2, ..., n}, i =/ j descritas en la Propiedad (ii) de la Sección
2.2.
(ii) Seleccionamos el mayor de los valores para cada pareja {bij , bji }.
n(n−1)
(iii) Definimos un grafo con n vértices {1, 2, ..., n} y, al menos, 2
aristas que
colocaremos del siguiente modo:
− Si bij es el mayor de los valores de la pareja {bij , bji }, entonces defini-
remos una arista de i a j.
− Si bji es el mayor de los valores, entonces definiremos una arista de j a
i.
− Si bij = bji entonces definiremos dos aristas de i a j y de j a i.
Si se quisiera obtener el grafo óptimo D′ = (V, A′ ) desde la representación me-
diante digrafos del problema D = (V, A), bastarı́a con escoger la arista con mayor
peso asociado para cada par de vértices i, j ∈ V y en caso de empates ωij = ωji , se
escogerı́an ambas aristas.

Nótese que nuestro grafo óptimo siempre será un torneo o contendrá un sub-
grafo que sea torneo D′ = (V, A′ ) ⊂ D, pues para cada par de vértices v1 , v2 ∈ V
siempre ∃(v1 , v2 ) ∈ A′ o ∃(v2 , v1 ) ∈ A′ .

Teorema 3.2.1. Todo torneo no hamiltoniano es semi-hamiltoniano [10]. Es decir,


todo torneo es semi-hamiltoniano.

Demostración 3.2.1. Lo demostraremos por inducción, para ello tomaremos el


torneo con el menor número de aristas posible, es decir, con una única conexión
para cada par de vértices v1 , v2 ∈ V . Si se cumple para estos torneos, también se
Capı́tulo 3. Métodos de resolución exactos 31

cumplirá si añadimos más aristas.


Lo vemos para los grafos de dos y tres vértices:
- Para n = 2, tendrı́amos los grafos representados en la Figura 3.1.

Figura 3.1: Torneos de dos nodos con el número mı́nimo de aristas posibles.

En este primer caso, vemos fácilmente que existen caminos hamiltonianos para
los dos grafos posibles: para a) tenemos (12) y b) tenemos (21).

- Para n = 3, tendrı́amos los 8 grafos representados en la Figura 3.2.

Figura 3.2: Torneos de tres nodos con el número mı́nimo de aristas posibles.

En este segundo caso, también es sencillo ver que podemos encontrar caminos
hamiltonianos para los ocho grafos posibles. Para a): (123); para b): (132); para c):
(312); para d): (123), (231) y (312); para e): (213); para f): (132), (213) y (321);
para g): (321) y para h): (231).

- Lo suponemos cierto para n = k: ∃(v1 v2 ....vk−1 vk ) camino hamiltoniano. Lo


comprobamos para n = k + 1, sabiendo que ∃(v1 v2 ....vk−1 vk ) camino hamiltoniano.

Como estamos trabajando con un torneo D = (V, A), el vértice vk+1 que añada-
mos será de grado k, puesto que se añadirá una arista (entrante o saliente) uniendo
el nuevo vértice vk+1 con cada uno de los k vértices restantes. Esto es: g(vk+1 ) =
32 3.2. Búsqueda basada en óptimos locales

g + (vk+1 ) + g − (vk+1 ) = k, donde g + (vk+1 ), g − (vk+1 ) ∈ {0, 1, ..., k}.


Distinguimos tres casos:
(i) Si g + (vk+1 ) = k y g − (vk+1 ) = 0 Ô⇒ todas las aristas de vk+1 son incidentes
Ô⇒ (vi , vk+1 ) ∈ A, ∀i ∈ {1, 2, ..., k} Ô⇒ (vk , vk+1 ) ∈ A Ô⇒ (v1 v2 ...vk vk+1 )
es camino hamiltoniano.
(ii) Si g + (vk+1 ) = 0 y g − (vk+1 ) = k Ô⇒ todas las aristas salen de vk+1 Ô⇒
(vk+1 , vi ) ∈ A, ∀i ∈ {1, 2, ..., k} Ô⇒ (vk+1 , v1 ) ∈ A Ô⇒ (vk+1 v1 v2 ...vk ) es
camino hamiltoniano.
(iii) Si g + (vk+1 ) = l y g − (vk+1 ) = k − l para l ∈ {1, ..., k − 1}.
Existen dos opciones:
a) ∃(vk+1 , v1 ) ∈ A Ô⇒ (vk+1 v1 v2 ...vk ) es camino hamiltoniano.
b) (vk+1 , v1 ) ∈/ A y ∃ al menos un vértice vi tal que (vi , vk+1 ) ∈ A
y (vk+1 , vi+1 ) ∈ A para algún i ∈ {1, 2, 3, ..., k − 1} Ô⇒
(v1 v2 ...vi−1 vi vk+1 vi+1 ...vk ) es camino hamiltoniano. Esto es, si hay unas aris-
tas que entran y otras que salen, existirán dos vértices consecutivos vi y vi+1 ,
tales que haya una arista que salga del vértice vi y llegue al vértice vk+1 y
otra arista que vaya de vk+1 a vi+1 . ◻

Por tanto, podemos afirmar que el digrafo óptimo construido siempre contendrá
al menos un camino hamiltoniano.

Teorema 3.2.2. σ = (σ1 σ2 ...σn ) es un camino hamiltoniano del grafo óptimo del
LOP, si y sólo si σ ∈ Sn es óptimo local del LOP bajo el vecindario adyacente.

Demostración 3.2.2. Supongamos que σ = (σ1 σ2 ...σn ) es un camino hamiltoniano


del grafo óptimo del LOP, por tanto (σi , σi+1 ) ∈ A, ∀i ∈ {1, ..., n − 1}. Entonces, por
la forma en la que hemos construido el grafo:


⎪ bσ 1 σ 2 ≥ bσ2 σ1



⎪ bσ 2 σ 3 ≥ bσ3 σ2 bσi σi+1 ≥ bσi+1 σi
⎨ ⇐⇒ { ⇐⇒

⎪ ... ∀i ∈ {1, ..., n − 1}



⎩ bσn−1 σn ≥ bσn σn−1
⇐⇒ σ óptimo local del LOP por el vecindario adyacente Nady (σ)
por el Teorema 2.3.1. ◻

En conclusión, hemos conseguido demostrar que en nuestro grafo óptimo siem-


pre podemos encontrar, al menos, un camino hamiltoniano y que será óptimo local
bajo el vecindario adyacente valiéndonos de los Teoremas 3.2.1 y 3.2.2.

Ejemplo 3.2.1. Si tomamos la matriz B = [bij ] ∈ M at4×4 (N ∪ {0}) y obtenemos


las parejas simétricamente localizadas:

⎛0 2 1 7⎞
Ô⇒ {{b12 , b21 }, {b13 , b31 }, {b14 , b41 }, {b23 , b32 },
⎜7 0 8 3⎟
B=⎜ ⎟ {b24 , b42 }, {b34 , b43 }} =
⎜5 9 0 2⎟
⎝11 = {{2, 7}, {1, 5}, {7, 11}, {8, 9}, {3, 1}, {2, 3}}
1 3 0⎠
Capı́tulo 3. Métodos de resolución exactos 33

Analizamos cada pareja para construir nuestro digrafo óptimo. Como nues-
tra matriz es de tamaño 4, el conjunto de vértices será: V = {1, 2, 3, 4}. Para
construir el conjunto de aristas debemos analizar cada pareja {bij , bji }, comen-
zamos con la primera pareja {b12 , b21 } = {2, 7} donde el mayor de los valores es
7, por tanto la primera arista que incluiremos en A′ será (2, 1). Análogamen-
te, analizamos el resto de las parejas y obtenemos el conjunto de aristas A′ =
{(2, 1), (3, 1), (4, 1), (3, 2), (2, 4), (4, 3)}. Por lo que el digrafo óptimo D′ = (V, A′ )
asociado serı́a el representado en la Figura 3.3.

Figura 3.3: Digrafo óptimo asociado al LOP con matriz B.

Posibles caminos hamiltonianos: {(4321), (3241), (2431)}. Vamos a analizarlos


uno a uno:
f ((4321)) = 36
(4321) Ô⇒ {
Nady ((4321)) = {(3421), (4231), (4312)}

Si (4321) es un óptimo local para Nady ((4321))


Ô⇒ f ((4321)) = 36 ≥ f (σ), ∀σ ∈ Nady ((4321)). Comprobémoslo:

− f (σ 1 ) = f ((3421)) = 35 ≤ 36 = f ((4321))
− f (σ 2 ) = f ((4231)) = 35 ≤ 36 = f ((4321))
− f (σ 3 ) = f ((4312)) = 31 ≤ 36 = f ((4321))

f ((3241)) = 36
(3241) Ô⇒ {
Nady ((3241)) = {(2341), (3421), (3214)}

Si (3241) es unóptimo local para Nady ((3241))


Ô⇒ f ((3241)) = 37 ≥ f (σ), ∀σ ∈ Nady ((3241)). Comprobémoslo:

− f (σ 1 ) = f ((2341)) = 36 ≤ 37 = f ((3241))
− f (σ 2 ) = f ((3421)) = 35 ≤ 37 = f ((3241))
− f (σ 3 ) = f ((3214)) = 35 ≤ 37 = f ((3241))

f ((2431)) = 37
(2431) Ô⇒ {
Nady ((2431)) = {(4231), (2341), (2413)}

Si (2431) es unóptimo local para Nady ((2431))


Ô⇒ f ((2431)) = 37 ≥ f (σ), ∀σ ∈ Nady ((2431)). Comprobémoslo:
34 3.2. Búsqueda basada en óptimos locales

− f (σ 1 ) = f ((4231)) = 35 ≤ 37 = f ((2431))
− f (σ 2 ) = f ((2341)) = 36 ≤ 37 = f ((2431))
− f (σ 3 ) = f ((2413)) = 33 ≤ 37 = f ((2431))

En este ejemplo hemos comprobado que los caminos hamiltonianos del grafo ópti-
mo de la matriz del LOP son óptimos locales, y por tanto el óptimo global será
una de estas tres permutaciones. Esto es, calculando únicamente el valor de tres
permutaciones hemos conseguido obtener la solución del problema sin necesidad
de evaluar las 4! = 24 permutaciones que forman el espacio de búsqueda S4 . Ası́,
para este ejemplo tenemos que la solución es 37 y las permutaciones con las que
obtenemos dicho valor son: (3241) y (2431).

Acabamos de observar que valiéndonos de la relación que hemos establecido


entre el grafo óptimo asociado a la matriz del LOP y sus caminos hamiltonianos
es posible resolver el LOP. Sin embargo, la búsqueda de caminos hamiltonianos es
un problema NP, y de acuerdo con lo que hemos afirmado en los capı́tulos anterio-
res, el problema de la ordenación lineal es del tipo NP-Completo. Es decir, con la
caracterización de los óptimos locales del vecindario adyacente, hemos conseguido
obtener métodos de resolución más eficaces para el LOP, pero como la complejidad
del problema no es polinómica en la dimensión del problema, no existe un algoritmo
con complejidad temporal polinómica en la dimensión del problema que converja
al óptimo. En consecuencia, si queremos obtener la solución, debemos aplicar un
método exacto cuyo tiempo de ejecución sea no polinómico en la dimensión del
problema. Formularemos un método exacto basado en la búsqueda de los óptimos
locales, valiéndonos de la construcción del grafo óptimo y de la relación establecida
en el Teorema 3.2.2.

3.2.2. Búsqueda exacta basada en los caminos hamiltonianos


del grafo óptimo
Basado en el desarrollo teórico presentado, proponemos un nuevo método de reso-
lución del LOP nunca usado hasta el momento. Nuestro algoritmo programado en
R1 funcionará de la siguiente forma:

(i) Dada una matriz del LOP de tamaño n construimos el grafo óptimo asociado
a dicha matriz, tal y como hemos descrito en la Subsección 3.2.1.

(ii) En segundo lugar buscamos los caminos hamiltonianos del grafo óptimo que
sabemos por el Teorema 3.2.2 que serán óptimos locales del LOP para el
vecindario adyacente.

(iii) Se aplica el algoritmo de la búsqueda exhaustiva tomando como espacio de


búsqueda únicamente el conjunto de los caminos hamiltonianos.

Este método se ha conseguido aplicar a una matriz de tamaño 15 que se mues-


tra en el Ejemplo 3.2.2.

1
Este algoritmo se puede encontrar en la Sección E.2 del Apéndice E.
Capı́tulo 3. Métodos de resolución exactos 35

Ejemplo 3.2.2. Dada la matriz representada en la Figura 3.4, construimos un


función que calcula su grafo óptimo que se muestra en la Figura 3.5.

Figura 3.4: Matriz aleatoria de tamaño 15.

Figura 3.5: Digrafo óptimo asociado a la matriz.

En el digrafo se han encontrado más de 400 caminos. Después, se ha calculando


el valor de la función objetivo en estos puntos factibles dados por los caminos hamil-
tonianos y se ha guardado el mayor de ellos, es decir, el óptimo global. Obteniendo
como valor máximo de la función objetivo 6546.

3.3. Comparativa de tiempos de ejecución y con-


clusiones
Para comparar la búsqueda exhaustiva con la búsqueda mediante digrafos óptimos
tomamos matrices aleatorias de diferentes tamaños y medimos los tiempos de eje-
cución2 . Hacemos esto con 10 matrices de diferentes tamaños y se calcula la media
2
Este desarrollo ha sido programado con R y se encuentra en la Sección E.5 del Apéndi-
ce E.
36 3.3. Comparativa de tiempos de ejecución y conclusiones

del valor de la función objetivo que se recoge en las gráficas de la Figura 3.6. En
ambas gráficas se recoge en el eje horizontal el tamaño de la matriz y en el eje
vertical el tiempo en segundos a escala natural y a escala logarı́tmica, a izquierda
y derecha, respectivamente.

Figura 3.6: Gráfica comparativa del tiempo de ejecución de la búsque-


da exhaustiva (naranja) y búsqueda basada en los caminos hamiltonianos
(azul), a escala natural (izquierda) y a escala logarı́tmica (derecha).

Como podemos ver, para matrices de tamaño pequeño los tiempos de ejecución
son similares en ambos métodos. De hecho, en la gráfica a escala logarı́tmica, po-
demos apreciar que la búsqueda exhaustiva es más rápida para tamaños menores o
iguales a 6. Sin embargo, a medida que aumentamos el tamaño de la matriz, el tiem-
po de ejecución aumenta de forma exponencial para ambos métodos. No obstante,
podemos observar que para matrices de tamaño mayores o iguales a 7 el tiempo
de ejecución es mucho mayor para la búsqueda exhaustiva que para la búsque-
da mediante digrafos óptimos. Además, para matrices de tamaño 10 la búsqueda
exhaustiva se detiene sin resultados tras unos dı́as de ejecución; mientras que la
búsqueda mediante digrafos óptimos puede darse en un tiempo de ejecución facti-
ble hasta matrices de tamaño 15 tal y como se ha mostrado en el Ejemplo 3.2.2.
Capı́tulo 4

Métodos de resolución
metaheurı́sticos

Como se ha observado en el Capı́tulo 3, los métodos exactos aplicados a este proble-


ma son más costosos computacionalmente. Por ello, si se busca obtener una solución
de forma rápida, no son adecuados. En estos casos, es preferible hacer uso de un
método aproximado, sin olvidar que la optimalidad no está grantizada.

En este capı́tulo, se resuelve el LOP mediante métodos metaheurı́sticos. Es-


tos métodos son de naturaleza muy diversos, pero pueden ser clasificados en dos
categorı́as:
− Métodos basados en una única solución [4]: partimos de una solución inicial
y la vamos mejorando paso a paso. El algoritmo de este tipo más habitual es
la búsqueda local.

− Métodos basados en una población o un conjunto de soluciones [4]: parti-


mos de un conjunto de soluciones que vamos modificando en cada iteración
según la estrategia escogida. Algunos de los algoritmos más comunes son los
algoritmos evolutivos.

4.1. Búsqueda Local


La búsqueda local es un método metaheurı́stico basado en una única solución.
Se selecciona un punto factible de partida, generalmente de forma aleatoria si no
hay información preliminar sobre el problema, y se calcula su valor de función
objetivo. A continuación, se calcula el vecindario del punto factible elegido. Después,
se calcula el valor de la función objetivo de los puntos factibles del vecindario. Si uno
de los valores es mayor que el valor de la función objetivo del punto factible inicial,
se vuelve a ejecutar el algoritmo tomando como punto factible de partida aquel
cuyo valor de función objetivo es mayor. En caso contrario, el algoritmo finaliza
devolviendo el mayor valor de función objetivo obtenido. El principal inconveniente
de este método suele ser que el algoritmo se detiene cuando encuentra un óptimo
local, haciendo que el óptimo global se alcance en pocas ocasiones.

37
38 4.1. Búsqueda Local

4.1.1. Búsqueda local para la resolución del LOP

Se describen a continuación los criterios fijados para la construcción del algoritmo


programado en R1 que ejecuta búsqueda local al LOP.

(i) Inicialización:
- El algoritmo requiere de la matriz del LOP y opcionalmente de una per-
mutación como punto factible inicial. Si se tiene alguna información previa
del problema, la utilizaremos para tomar la permutación inicial, en el caso
de que esta permutación no se especifique se tomará una de forma aleatoria.
- Se calcula el valor de la función objetivo para de la permutación seleccio-
nada.

(ii) Iteración:
- Se calcula el vecindario de la permutación seleccionada. Los vecindarios
que han sido utilizados son: vecindario adyacente, vecindario intercambio y
vecindario inserción que han sido descritos en la Sección 2.3.
- Se calcula el valor de la función objetivo de cada una de las permutaciones
que forman el vecindario.
- Se selecciona la permutación cuyo valor de función objetivo sea mayor y
esta pasa a ser la permutación seleccionada para la siguiente iteración.

(iii) Resultado:
- El algoritmo finaliza cuando el valor de la función objetivo de todas las per-
mutaciones del vecindario es menor o igual que la permutación seleccionada.
- Se devuelve el valor de la función objetivo de la permutación seleccionada
en la última iteración.

4.1.2. Búsqueda exhaustiva aplicada al LOP

Se programa con R el algoritmo de la búsqueda local2 y se ejecuta 50 veces con


cada uno de los tres vecindarios sobre la matriz de tamaño 15 del Ejemplo 3.2.2
cuyo resultado sabemos que es 6546. Este algoritmo es muy eficaz, sin embargo en
ninguna de las 150 ejecuciones se ha conseguido alcanzar el óptimo global. En la
Tabla 4.1 se recoge información sobre los resultados obtenidos: el tiempo medio de
ejecución, el valor mı́nimo y máximo de función objetivo, la media aritmética, la
desviación porcentual relativa media (ARPD( %)= ∑i∈{1...n} ∣f (σf)−f (σ ∗ )∣ 1
i

(σ ∗ ) n
) donde

f (σ ) es el óptimo global y el número de iteraciones realizadas antes de finalizar.

1
Este algoritmo se puede encontrar en la Sección E.3 del Apéndice E.
2
Este desarrollo se puede encontrar en la Sección E.5 del Apéndice E.
Capı́tulo 4. Métodos de resolución metaheurı́ticos 39

Vecindario Tiempo Rango soluciones X̄ ARPD( %) Iteraciones


Adyacente 0.02 (5157,6257) 5827 10.99 12
Intercambio 0.02 (5454,6175) 5769 11.87 4
Inserción 0.11 (5167,6476) 5759 12.02 4

Tabla 4.1: Se muestra el tiempo medio de ejecución en segundos (Tiempo), la


mejor y peor solución obtenida entre las 50 ejecuciones (Rango soluciones), la
media de las soluciones obtenidas (X̄ ), desviación porcentual relativa media
(ARPR( %)) y el número de vecindarios que ha explorado el algoritmo o
equivalentemente el número de iteraciones realizadas antes de finalizar.

Vistos los resultados deducimos que la la optimalidad del algoritmo es muy


débil, pues en ninguna de las ocasiones se ha conseguido alcanzar el óptimo global.
Siendo el vecindario adyacente el que mejores resultados en media obtiene. Otro
dato relevante es el número de iteraciones medias necesarias para alcanzar el resul-
tado del algoritmo, en este caso el vecindario adyacente es el que más iteraciones,
en media, necesita para finalizar. No obstante, como el vecindario adyacente es el
de menor cardinal, el tiempo de ejecución es igual o menor que para los otros dos
vecindarios. Aún ası́, en cuanto al tiempo de ejecución, todos los algoritmos son
muy eficaces.

4.2. Algoritmos genéticos


Los algoritmos genéticos (AG) se enmarcan dentro de los algoritmos evolutivos y
son métodos metaheurı́sticos basados en un conjunto de puntos factibles o pobla-
ción que tienen su base en la teorı́a de la evolución genética postulada por Darwin
(1859)[5]. Los principios básicos de los algoritmos genéticos fueron dados por Jonh
Henry Holland en la década de los 70 y posteriormente otros autores profundizaron
en ellos, siendo los más relevantes: Goldberg (1989)[5], Davis (1991)[5], Michalewicz
(1992)[5], Reeves (1993)[5].

Los algoritmos genéticos funcionan del siguiente modo:


(i) Inicialización:
- Se selecciona un conjunto de puntos factibles o individuos que se de-
nomina población inicial, puede hacerse de forma aleatoria o con algún
criterio previamente fijado. El tamaño de la población será siempre me-
nor que el espacio de búsqueda y de ello dependerá, en parte, el tiempo
de ejecución. Pues a mayor tamaño de población, mayor será el tiempo
de ejecución.
- A cada individuo se le otorga un valor que evalúa la bondad de dicho
individuo, a este valor se le denomina fitness que será el valor de la
función objetivo del problema. Se seleccionan los individuos que pasarán
a la fase de iteración.
(ii) Iteración:
- Se somete a los individuos a un operador de cruce y mutación que de-
penderán de la naturaleza del espacio de búsqueda del problema. Para
40 4.2. Algoritmos genéticos

el cruce serán necesarios, al menos, dos individuos elegidos, generalmen-


te, al azar y los individuos resultantes tendrán propiedades de ambos
antecesores. Mientras que para la mutación solamente es necesario un
individuo. Los operadores de cruce y mutación no tienen por qué apli-
carse a todos los individuos, pueden depender de una probabilidad de
cruce y mutación, respectivamente, o de algún otro criterio previamente
fijado. Ası́ se crearán nuevos individuos.
- Se calcula el fitness los individuos obtenidos.
- Se seleccionan los individuos que pasarán a la siguiente iteración de
entre los nuevos individuos o del conjunto formado por los nuevos indi-
viduos y sus antecesores. El tamaño del conjunto que pasa a la siguiente
iteración puede ser fijo en todas las iteraciones o de tamaño variable.
La selección de individuos se hace en base al fitness, pero no necesaria-
mente se seleccionan todos los individuos que mejor fitness tengan.

(iii) Resultado:

- El algoritmo finaliza cuando se cumple un criterio de parada prefijado


que en en muchas ocasiones es el número de iteraciones. Sin embargo,
se pueden establecer otros criterios como por ejemplo: la varianza del
fitness de la población o la obtención de un valor fitness determinado.
- Se devuelve el valor del mejor fitness obtenido en la última iteración.

4.2.1. Algoritmos genéticos para la resolución del LOP


A continuación, se detallan los criterios que se han utilizado para la construcción
de algoritmos genéticos que se aplicarán a la resolución del LOP y posteriormente
se analizarán los resultados obtenidos. Para la construcción de estos algoritmos se
ha utilizado la codificación mediante permutaciones y matrices.

Se ha desarrollado en R3 el programa que ejecuta un algoritmo genético cuyos


criterios fijos son los siguientes:
Selección de la población inicial aleatoria.

Se somete a todos los individuos de la población a un operador de cruce, esto


es, la probabilidad de cruce es 1.

Selección elitista de individuos para siguiente iteración, esto es, los puntos
factibles elegidos en cada iteración serán los de mayor fitness entre los nuevos
individuos y sus antecesores.

El criterio de parada es el número de iteraciones.


El programa precisa de los siguientes parámetros a decidir por el usuario:

Tamaño de la población inicial.

Tipo de cruce a elegir entre:


3
Este algoritmo se puede encontrar en la Sección E.3 del Apéndice E.
Capı́tulo 4. Métodos de resolución metaheurı́ticos 41

- Orden: se elige una parte arbitraria de la primera permutación y se


copia esta parte en la permutación resultante. Se copian de la segunda
permutación los números que no están en la permutación resultante
del siguiente modo: se comienza a la derecha del punto de corte de la
parte copiada, se utiliza el orden de la segunda permutación y se vuelve
al principio al alcanzar el final. La segunda permutación resultante se
obtiene análogamente intercambiando el orden en el que se toman las
permutaciones.
Ejemplo 4.2.1. Sean σ = (123654) y ω = (345621) las dos permuta-
ciones de partida, construimos las dos permutaciones resultantes del
siguiente modo:

⎪ σ = (1 236 54) ⎫
⎪ ⎪

⎪ σ = (123654) ⎫

⎨ ⎪
⎪ { ⎪


⎪ (⋯456⋯⋯) ⎪

⎪ (345612) ⎪


⎩ ⎬ Ô⇒ ⎬

⎪ ⎪ ω = (345621) ⎪
⎪ ω = (3 456 21) ⎪

⎪ {



⎨ ⎪

⎪ (123645) ⎪


⎪ (⋯236⋯⋯) ⎪
⎭ ⎭

Ası́, las permutaciones obtenidas son: (345612) y (123645).
- Parcialmente mapped: se selecciona un segmento aleatorio de la prime-
ra permutación y se copia en la permutación resultante. Comenzando
desde el primer punto de cruce, se buscan los elementos en dicho seg-
mento de la segunda permutación que no han sido copiados. Para cada
uno de estos i, mirar en la permutación resultante qué elemento j ha
sido copiado en su lugar desde la primera permutación. Situar i en la
posición ocupada j en la segunda permutación, ya que sabemos que no
pondremos j allı́. Si la posición ocupada por j en la segunda permuta-
ción ha sido rellenada en la posición k, poner i en la posición ocupada
por k en la segunda permutación. Tras haber tratado los elementos del
segmento, el resto se rellena de la segunda permutación. El segundo
punto factible se crea análogamente invirtiendo el orden en el que se
toman las permutaciones.
Ejemplo 4.2.2. Sean σ = (123654) y ω = (345621) las dos permuta-
ciones de partida, construimos las dos permutaciones resultantes del
siguiente modo:
⎧ ⎧ ⎧
⎪ σ = (1 236 54) ⎫
⎪ ⎪



⎪ σ = (1 236 54) ⎫




⎪ σ = (1 236 54) ⎫



⎨ ⎪
⎪ ⎨ ⎪
⎪ ⎨ ⎪


⎪ (⋯ 456 ⋯⋯) ⎪⎪
⎪ ⎪
⎪ (1 456 ⋯⋯) ⎪

⎪ ⎪
⎪ (1 456 32) ⎪


⎩ ⎬ Ô⇒ ⎩ ⎩
⎬ Ô⇒ ⎧ ⎬
⎧ ⎧
⎪ ω = (3 456 21) ⎪
⎪ ⎪



⎪ ω = (3 456 21) ⎪




⎪ ω = (3 456 21) ⎪



⎨ ⎪

⎪ ⎨ ⎪

⎪ ⎨ ⎪



⎪ (⋯ 236 ⋯⋯) ⎪
⎭ ⎪
⎪ (⋯ 236 ⋯1) ⎪
⎭ ⎪
⎪ (5 236 41) ⎪

⎩ ⎩ ⎩

Ası́, las permutaciones obtenidas son: (145632) y (523641).


Tipo de mutación a elegir entre:
- Inserción: se toman dos elementos aleatoriamente (primero uno, después
otro), se mueve el segundo a continuación del primero y se desplaza el
resto.
42 4.2. Algoritmos genéticos

Ejemplo 4.2.3. Sea σ = (123654) creamos una posible permutación


resultante tras una mutación por inserción:
(123654) Ô⇒ (123654) Ô⇒ (123564)
La permutación resultante ha sido: (123564)
- Intercambio: se toman dos elementos aleatoriamente y se intercambian.
Ejemplo 4.2.4. Sea σ = (123654) creamos una posible permutación
resultante tras una mutación por intercambio:
(123654) Ô⇒ (125634)
La permutación resultante ha sido: (125634)
- Inversión: se toman dos elementos aleatoriamente y se invierte los ele-
mentos de la subcadena contenida entre ellos.
Ejemplo 4.2.5. Sea σ = (123654) creamos una posible permutación
resultante tras una mutación por inversión:
(123654) Ô⇒ (125634)
La permutación resultante ha sido: (125634)
- Scramble: se selecciona un subconjunto de elementos aleatoriamente y
se reordena aleatoriamente los elementos en esas posiciones.
Ejemplo 4.2.6. Sea σ = (123654) creamos una posible permutación
resultante tras una mutación por scramble:
(123654) Ô⇒ (125364)
La permutación resultante ha sido: (125364)
Probabilidad de mutación.
Número de individuos que pasan a la siguiente iteración.
Número de iteraciones.

4.2.2. Algoritmos genéticos aplicados al LOP


Dado que los algoritmos genéticos son métodos de resolución metaheurı́sticos la
optimalidad no está garantizada, por este motivo además del tiempo de ejecución
es necesario observar la robustez y la bondad del método. Para ello, se ejecutará el
algoritmo aplicado al problema LOP dado por la matriz de tamaño 15 del Ejemplo
3.2.2 cuya solución es 6546. El algoritmo se ejecutará 504 veces recogiendo no solo
el tiempo de ejecución medio, si no también el rango de valores del fitness, para
calcular la media, la desviación porcentual relativa media (que mide la distancia
relativa a la solución) y el número de veces que se ha alcanzado el óptimo glo-
bal. Esto se hace tres veces variando los parámetros no fijados del algoritmo para
analizar qué parámetros devuelven mejores resultados. En este caso se ha decidido
fijar el criterio de parada en 100 iteraciones, para observar qué efectos tienen sobre
el valor del fitness y el tiempo de ejecución los parámetros: número de individuos
de la población inicial, número de individuos de las iteraciones y probabilidad de
mutación.
4
Este desarrollo se encuentra en la Sección E.5 del Apéndice E.
Capı́tulo 4. Métodos de resolución metaheurı́ticos 43

Primera elección de parámetros


Para las primeras 50 ejecuciones se han utilizado los siguientes parámetros para el
algoritmo genético:
Individuos de la población inicial: 75
Individuos de las iteraciones: 20
Probabilidad de mutación: 0.1
Número de iteraciones: 100
Tras cada ejecución se recoge el tiempo empleado y la solución obtenida. Estos
resultados se recogen en la Tabla 4.2.

Cruce Mutación Tiempo Rango soluciones X̄ ARPP( %) Óptimo


Orden Intercambio 0.377 (6250, 6488) 6382 2.51 0
Orden Inserción 0.336 (6262, 6546) 6418 1.96 1
Orden Inversión 0.344 (6210, 6493) 6357 2.89 0
Orden Scramble 0.345 (6226, 6538) 6386 2.45 0
Mapped Intercambio 1.445 (6310, 6546) 6430 1.78 1
Mapped Inserción 1.443 (6334, 6546) 6456 1.38 2
Mapped Inversión 1.464 (6310, 6520) 6407 2.12 0
Mapped Scramble 1.457 (6250, 6527) 6427 1.81 0

Tabla 4.2: Se muestra el tiempo medio de ejecución en segundos (Tiempo),


la mejor y peor solución obtenida entre las 50 ejecuciones (Rango solucio-
nes), la media de las soluciones obtenidas X̄ , desviación porcentual relativa
media(ARPR) y el número de ocasiones en las que se ha alcanzado el valor
de función objetivo del óptimo global 6546.

En este caso, podemos apreciar dos aspectos relevantes. En primer lugar, la


eficacia de estos algoritmos genéticos, pues el peor de los tiempos de ejecución es
inferior a 1.5 segundos. Siendo los algoritmos con cruce mapped los más costosos
computacionalmente. En segundo lugar, la variabilidad de las soluciones y el valor
del ARPD implican que el algoritmo no es robusto, pues obtendremos una ma-
la solución con una alta probabilidad. No obstante, se ha alcanzado la solución
óptima con tres de los algoritmos (orden-inserción, mapped -intercambio y mapped -
inserción), aunque en pocas ocasiones.

En conclusión, podemos decir que la elección de parámetros no ha sido adecuada


para obtener una solución buena y robusta. Sin embargo, los algoritmos son muy
eficaces.

Segunda elección de parámetros


En este segundo supuesto, se aumentará el número de puntos factibles que forman
la población inicial y el número de puntos factibles que se toman en cada itera-
ción. Esto supondrá un aumento en el tiempo de ejecución, por contra reducir la
probabilidad de mutación reducirá el tiempo de ejecución. Para ver estos supues-
tos se toman los parámetros variables que se dan a continuación y se recogen los
resultados del algoritmo en la Tabla 4.3.
44 4.2. Algoritmos genéticos

Individuos de la población inicial: 100


Individuos de las iteraciones: 40
Probabilidad de mutación: 0.05
Número de iteraciones: 100

Cruce Mutación Tiempo Rango soluciones X̄ ARPP( %) Óptimo


Orden Intercambio 0.654 (6269, 6527) 6402 2.20 0
Orden Inserción 0.654 (6378, 6528) 6473 1.12 0
Orden Inversión 0.659 (6290, 6546) 6416 1.98 2
Orden Scramble 0.661 (6249, 6529) 6423 1.88 0
Mapped Intercambio 2.853 (6338, 6538) 6453 1.42 0
Mapped Inserción 2.856 (6399, 6546) 6478 1.04 2
Mapped Inversión 2.924 (6300, 6546) 6440 1.62 1
Mapped Scramble 2.869 (6330, 6546) 6456 1.38 1

Tabla 4.3: Se muestra el tiempo medio de ejecución en segundos (Tiempo),


la mejor y peor solución obtenida entre las 50 ejecuciones (Rango solucio-
nes), la media de las soluciones obtenidas X̄ , desviación porcentual relativa
media(ARPR) y el número de ocasiones en las que se ha alcanzado el óptimo
global 6546 (Óptimo).

Con estos resultados podemos obtener algunas conclusiones relevantes. Como


era previsible, el tiempo de ejecución ha aumentado respecto a la primera elección
de parámetros, pues el tiempo es aproximadamente el doble, siendo, de nuevo, los
algoritmos con cruce parcialmente mapped los más costosos computacionalmente.
Por otro lado, es destacable que el valor del ARPD se ha reducido en todos los ca-
sos, esto es, ha disminuido la probabilidad de obtener una mala solución. Además,
se ha llegado a alcanzar la solución óptima en más ocasiones.

Resumiendo, los parámetros elegidos en este caso, aportan mejores resultados


del fitness que los elegidos en el primer caso.

Tercera elección de parámetros iniciales


En tercer lugar, dado que el tiempo de ejecución de los algoritmos de la Sección 4.2.2
ha sido factible, se aumentará la probabilidad de mutación lo que supondrá un
aumento en en el tiempo de ejecución pues se explorarán más puntos del espacio
de búsqueda, esperando conseguir mejores resultados del fitness. Mientras que los
demás parámetros variables se mantendrán con los mismos valores. Para ver estos
supuestos se toman los parámetros variables que se dan a continuación y se recogen
los resultados del algoritmo en la Tabla 4.4.
Individuos de la población inicial: 75
Individuos de las iteraciones: 40
Probabilidad de mutación: 0.5
Número de iteraciones: 100
Capı́tulo 4. Métodos de resolución metaheurı́ticos 45

Cruce Mutación Tiempo Rango soluciones X̄ ARPD( %) Óptimo


Orden Intercambio 0.674 (6325, 6546) 6460 1.31 3
Orden Inserción 0.684 (6411, 6546) 6509 0.57 11
Orden Inversión 0.754 (6280, 6546) 6474 1.64 1
Orden Scramble 0.761 (6329, 6546) 6474 1.11 5
Mapped Intercambio 2.950 (6433, 6546) 6493 0.81 5
Mapped Inserción 3.038 (6475, 6546) 6521 0.39 20
Mapped Inversión 2.979 (6365, 6546) 6476 1.07 3
Mapped Scramble 2.999 (6436, 6546) 6511 0.53 13

Tabla 4.4: Se muestra el tiempo medio de ejecución en segundos (Tiempo),


la mejor y peor solución obtenida entre las 50 ejecuciones (Rango solucio-
nes), la media de las soluciones obtenidas X̄ , desviación porcentual relativa
media(ARPR) y el número de ocasiones en las que se ha alcanzado el óptimo
global 6546 (Óptimo).

En vista de los resultados podemos decir que los parámetros escogidos en este
tercer caso son mejores que los anteriores. Por un lado, el aumento del tiempo de
ejecución frente a los tiempos de ejecución de la segunda elección de parámetros es
insignificante. Por otro lado, el valor del ARPD se ha reducido considerablemente,
esto es obtendremos valores fitness alejados de la solución óptima con una proba-
bilidad pequeña. Además, se ha conseguido alcanzar la solución óptima con todas
las combinaciones de cruce-mutación y en más ocasiones.

4.3. Comparativa y conclusiones


En resumen, vistos los resultados obtenidos con los métodos metaheurı́sticos aplica-
dos, podemos obtener algunas conclusiones relevantes. En primer lugar, la eficacia
de estos algoritmos, pues en el peor de los casos desarrollados el tiempo de ejecución
medio es de apenas tres segundos. No obstante, los algoritmos genéticos que hemos
aplicado obtienen la solución óptima con una frecuencia muy baja y la búsqueda
local lo hace con una frecuencia aún menor, en nuestro caso la búsqueda local no ha
conseguido alcanzar el óptimo global en ningún caso. Esto es, aunque la búsqueda
local es el más eficaz, la optimalidad y la robustez no son adecuadas. Este método
podrı́a ser usado para obtener un valor aproximado rápidamente, pero la probabi-
lidad de conseguir el óptimo global es muy pequeña.

Los algoritmos genéticos presentan mejores resultados que la búsqueda local en


la resolución de este problema, pues en este problema han conseguido alcanzar el
óptimo global en diversas ocasiones. Cabe destacar que la optimalidad, la robustez
y la eficacia de estos métodos dependen en gran medida de los parámetros iniciales
escogidos. Los parámetros que obtienen mejores resultados del fitness son los esco-
gidos en el tercer caso, aún no siendo los más eficaces consideramos que esta es la
mejor elección de los parámetros de entre las tres testadas. En cuanto al tipo de
cruce, los mejores valores fitness se consiguen con los algoritmos que usan el cruce
parcialmente mapped. Cabe destacar que el cruce parcialmente mapped es más cos-
toso computacionalmente que el cruce de orden. En cuanto a las mutaciones, son
46 4.3. Comparativa y conclusiones

intercambio e inserción las que mejores valores del fitness arrojan.

No obstante, si ejecutásemos el algoritmo una única vez, la solución obtenida


no serı́a la óptima en una alto número de ocasiones, para disminuir el número de
casos en los que no se alcanza el óptimo y conseguir un mejor fitness, serı́a necesario
aumentar el número de iteraciones, aún ası́ la optimalidad no está garantizada. Por
contra, al aumentar el número de iteraciones, el tiempo de ejecución aumentará,
esto es, supondrá una pérdida de eficacia. Pero el ARPD disminuirá, obteniendo
una solución buena y robusta con una mayor probabilidad. Observamos esto en el
Ejemplo 4.3.1 descrito a continuación.

Ejemplo 4.3.1. Tomamos el algoritmo que utiliza el cruce de orden y la muta-


ción inserción y lo aplicamos a una matriz de tamaño 60 cuya solución es 4220885 .
Para comprobar los supuestos descritos anteriormente, comenzamos ejecutando el
algoritmo con 100 iteraciones y aumentando el número de iteraciones cada 20 eje-
cuciones6 , recogiendo la solución y el tiempo de ejecución en cada caso, se muestra
a continuación en las Figuras 4.1, 4.2 y 4.3.

Figura 4.1: En el eje horizontal se recoge el número de iteraciones y en el eje


vertical los valores mı́nimo, máximo y medio del fitness de las 20 ejecuciones.

En la Figura 4.1 es fácil observar que a medida que el número de iteraciones


aumenta el valor del fitness va aproximándose cada vez más a la solución. Además,
la diferencia entre el peor y el mejor resultado disminuye a medida que aumentan
las iteraciones, aún no habiendo obtenido en ninguna ocasión el óptimo global. Es-
to, lo podemos apreciar midiendo el valor del ARPD que se muestra en la Figura 4.2.

5
Esta matriz y su solución ha sido obtenida en: http://comopt.ifi.uni-
heidelberg.de/software/LOLIB/
6
Este desarrollo se puede encontrar en la Sección E.5 del Apéndice E.
Capı́tulo 4. Métodos de resolución metaheurı́ticos 47

Figura 4.2: En el eje horizontal se recoge el número de iteraciones y en el


eje vertical el valor del ARPD( %).

Como hemos podido observar en las Figuras 4.1 y 4.2 a medida que aumentamos
el número de iteraciones el algoritmo mejora en cuanto a optimalidad y robustez,
no obstante la eficacia disminuye tal y como se puede apreciar en la Figura 4.3 que
mide los tiempos medios de ejecución.

Figura 4.3: En el eje horizontal se recoge el número de iteraciones y en el


eje vertical el tiempo medio de ejecución en segundos.
Capı́tulo 5

Método de resolución
metaheurı́stico propuesto

En vista de los resultados obtenidos en el Capı́tulo 4 se busca mejorar los métodos


ya descritos en la literatura para que se adapten mejor al LOP. Para ello, se han
probado diferentes ideas de algoritmos1 hasta dar con el que se describe en este
capı́tulo.

5.1. Nuevo método metaheurı́stico propuesto


A continuación, se propone un nuevo método metaheurı́stico que tiene como base
los algoritmos metaheurı́sticos descritos en el Capı́tulo 4 junto con la caracterización
de los óptimos locales descritos en el Capı́tulo 22 .

5.1.1. Descripción del método heurı́stico


El método que se describe a continuación es un método metaheurı́stico basado en
una población que consta de tres partes: inicialización, iteración y resultado.

Inicialización:
− Se selecciona al azar una población inicial de puntos factibles.
− Se calcula el valor de función objetivo para dichos puntos.
Iteración:
− Se crean nuevos factibles mediante los operadores de cruce de orden y
parcialmente mapped descritos en la Sección 4.2.
− Se calcula el valor de la función objetivo de los nuevos puntos factibles.
− Para cada nuevo punto factible seleccionado se comprueba si es óptimo
local de un vecindario prefijado. En este caso se han considerado los
tres vecindarios descritos en la Sección 2.3 (adyacente, intercambio e
1
La descripción e implementación de estos algoritmos se puede encontrar en la
aSección E.4 del Apéndice E.
2
Este algoritmo se puede encontrar en la Sección E.4 del Apéndice E.

49
50 5.1. Nuevo método metaheurı́stico propuesto

inserción) y la caracterización de los óptimos locales para cada vecin-


dario (dada por los Teorema 2.3.1, 2.3.2 y 2.3.3 respectivamente). Si el
punto factible es un óptimo local, pasa a la siguiente iteración, por el
contrario, si el punto factible no es óptimo local se aplica la búsqueda
local con el vecindario prefijado.
− Se seleccionan los puntos factibles cuyo valor de función objetivo sea
mayor entre los nuevos puntos factibles generados y los seleccionados
anteriormente.
Resultado:
− El algoritmo finaliza cuando se llega a un número de iteraciones prefi-
jadas.
− Se devuelve el mayor valor de función objetivo obtenido en la última
iteración junto con el punto factible que ha dado como resultado dicho
valor.

5.1.2. Elección de parámetros iniciales


Al igual que en los algoritmos genéticos la elección de los parámetros iniciales
(número de puntos factibles de la población inicial, número de puntos factibles en
cada iteración y número de iteraciones) afectarán al comportamiento del mismo.
Para comprobar la eficacia y la bondad de ajuste de este nuevo método descri-
to, tomamos la matriz de tamaño 15 del Ejemplo 3.2.2 cuya solución es 6546 y
aplicamos el método descrito 50 veces con tres elecciones diferentes de parámetros
iniciales3 . En cada caso analizaremos qué combinación de cruce y vecindario es la
mejor opción en cuanto a optimalidad, robustez y eficacia.

Primera elección de parámetros iniciales


número de puntos factibles de la población inicial: 75
número de puntos factibles en cada iteración: 20
Número de iteraciones: 100

Cruce Vecindario Tiempo Rango soluciones X̄ ARPP( %) Óptimo


Orden Adyacente 2.56 (6319, 6546) 6470 1.16 4
Orden Intercambio 1.61 (6216, 6473) 6344 2.74 0
Orden Inserción 3.12 (6230, 6471) 6354 2.93 0
Mapped Adyacente 3.70 (6381, 6546) 6489 0.86 7
Mapped Intercambio 1.86 (6264, 6487) 3382 2.50 0
Mapped Inserción 3.43 (6216, 6523) 6384 2.47 0

Tabla 5.1: Se muestra el tiempo medio de ejecución en segundos (Tiempo), la


mejor y peor solución obtenida entre las 50 ejecuciones (Rango soluciones),
la media de las soluciones obtenidas X̄ , desviación porcentual relativa media
(ARPR( %)) y el número de ocasiones en las que se ha alcanzado el óptimo
global 6546 (Óptimo).
3
Este desarrollo se puede encontrar en la Sección E.5 del Apéndice E.
Capı́tulo 5. Método de resolución metaheurı́stico propuesto 51

Con esta primera elección de parámetros vemos que los métodos que hacen
uso del vecindario adyacente son los que mejores resultados aportan. Mientras que
el resto de métodos no consiguen alcanzar la solución óptima en ninguna de las
50 ejecuciones. En cuanto a la eficacia, todos los algoritmos son muy eficaces pues
necesitan menos de cuatro segundos para obtener una solución, destacan en eficacia
los métodos que hacen uso del vecindario intercambio.

Segunda elección de parámetros iniciales

número de puntos factibles de la población inicial: 100

número de puntos factibles en cada iteración: 20

Número de iteraciones: 100

Cruce Vecindario Tiempo Rango soluciones X̄ ARPP( %) Óptimo


Orden Adyacente 3.46 (6377, 6546) 6485 0.93 6
Orden Intercambio 3.45 (6201, 6490) 6388 2.41 0
Orden Inserción 5.75 (6239, 6546) 6387 2.44 1
Mapped Adyacente 4.34 (6443, 6546) 6510 0.55 9
Mapped Intercambio 3.34 (6213, 6479) 6394 2.32 0
Mapped Inserción 5.12 (6235, 6519) 6396 1.77 0

Tabla 5.2: Se muestra el tiempo medio de ejecución en segundos (Tiempo), la


mejor y peor solución obtenida entre las 50 ejecuciones (Rango soluciones),
la media de las soluciones obtenidas X̄ , desviación porcentual relativa media
(ARPR( %)) y el número de ocasiones en las que se ha alcanzado el óptimo
global 6546 (Óptimo).

Esta segunda elección de parámetros mejora los resultados respecto a la elec-


ción anterior, aunque el tiempo de ejecución ha aumentado en todos los casos.
Siguen destacando por su optimalidad y robustez los métodos que hacen uso de del
vecindario adyacente.

Tercera elección de parámetros iniciales

número de puntos factibles de la población inicial: 75

número de puntos factibles en cada iteración: 40

Número de iteraciones: 100


52 5.1. Nuevo método metaheurı́stico propuesto

Cruce Vecindario Tiempo Rango soluciones X̄ ARPP( %) Óptimo


Orden Adyacente 30 (6377, 6546) 6510 0.54 15
Orden Intercambio 2.12 (6238, 6520) 6378 2.56 0
Orden Inserción 4.26 (6203, 6528) 6386 2.44 0
Mapped Adyacente 35.78 (6448, 6546) 6527 0.23 29
Mapped Intercambio 3.68 (6239, 6546) 6391 2.26 1
Mapped Inserción 8.11 (6236, 6511) 6409 2.08 0

Tabla 5.3: Se muestra el tiempo medio de ejecución en segundos (Tiempo), la


mejor y peor solución obtenida entre las 50 ejecuciones (Rango soluciones),
la media de las soluciones obtenidas X̄ , desviación porcentual relativa media
(ARPR( %)) y el número de ocasiones en las que se ha alcanzado el óptimo
global 6546 (Óptimo).

Con esta tercera elección de parámetros, los métodos menos eficaces son aquellos
que hacen uso del vecindario adyacente, sin embargo son los que mejores resultados
arrojan. Destaca el método que combina cruce parcialmente mapped con el vecin-
dario adyacente que ha alcanzado la solución en 29 de las 50 ejecuciones. Además,
el valor medio de función objetivo es el mayor de todos y la desviación porcentual
relativa media es solamente del 0.23 %, esto es, el método es muy robusto.

5.1.3. Conclusiones
En conclusión, en vista de los resultados obtenidos para el ejemplo testado con los
métodos metaheurı́sticos podemos obtener algunas conclusiones. En primer lugar,
la eficacia de estos métodos heurı́sticos, pues en el peor de los casos el tiempo de eje-
cución medio para un problema de dimensión 15 ha sido al rededor de 30 segundos.
Este caso se ha dado con los métodos que hacen uso del vecindario adyacente que
son los computacionalmente más costosos, siendo los métodos que mejor bondad de
ajuste tienen. Los métodos que hacen uso de los vecindarios inserción e intercambio
son menos costosos, pero arrojan peores resultados dan en cuanto a optimalidad.
En cuanto al tipo de cruce, destaca el cruce de orden en cuanto a eficacia y el cruce
parcialmentemapped en cuanto a bondad de ajuste.

Destaca en las instancias 3 el método que hace uso del cruce parcialmente
mapped junto con el vecindario adyacente. Si bien este es el método más costoso
computacionalmente de todos los heurı́sticos testados, también es el que más veces
alcanza el óptimo -casi en un 60 % de las ocasiones- y cuyo ARPD es menor -inferior
al 0.25 %. Para esta matriz de datos los parámetros iniciales escogidos en en tercer
caso son los más adecuados. Aún ası́ en un 40 % de las ocasiones no se consigue
alcanzar el óptimo global, para mejorar aún más este resultado, podrı́amos aumen-
tar el número de iteraciones lo que supondrá un aumento en la optimalidad y la
robustez del método pero una pérdida de eficacia. Observamos esto en el Ejemplo
5.1.1.

Ejemplo 5.1.1. Tomamos el algoritmo que hace uso del cruce parcialmente map-
ped y del vecindario adyacente y lo aplicamos a la matriz del 4.3.1 de dimensión
60, cuya solución sabemos que es 422088. Para comprobar lo afirmado previamente
comenzamos ejecutando el algoritmo con 100 iteraciones y vamos aumentando el
Capı́tulo 5. Método de resolución metaheurı́stico propuesto 53

número de iteraciones cada 10 ejecuciones4 . En cada ejecución se recoge la solución


y el tiempo de ejecución que se muestra de forma gráfica en las Figuras 5.1 y 5.2.

Figura 5.1: En el eje horizontal se recoge el número de iteraciones y en el eje


vertical los valores mı́nimo, máximo y medio del fitness de las 10 ejecuciones.

En la Figura 5.1 vemos que aún con pocas iteraciones el valor medio obtenido
es cercano a la solución. Además es fácil observar que a medida que el número de
iteraciones aumenta el valor medio del fitness aumenta acercándose a la solución.
No obstante, el aumento del número de iteraciones provoca un aumento en el tiem-
po de ejecución tal y como se aprecia en la Figura 5.2.

4
Este desarrollo se puede encontrar en la Sección E.5 del Apéndice E.
54 5.2. Comparativa

Figura 5.2: En el eje horizontal se recoge el número de iteraciones y en el


eje vertical el tiempo medio de ejecución en segundos.

5.2. Comparativa
La naturaleza de los métodos descritos en los Capı́tulos 3, 4 y 5 es muy diversa, por
lo que no se puede hacer una comparativa global o establecer un ranking total. Lo
que si podemos hacer es establecer un orden en función la eficacia, la optimalidad
o la robustez para los ejemplos probados. Ordenaremos los métodos de mejor a
peor según estas tres caracterı́sticas según los ejemplos probados, en el caso de los
métodos que tienen diferentes versiones, escogeremos los de mayor optimalidad en
todos los casos. Esto es, clasificaremos los dos métodos exactos, la búsqueda local
con el vecindario adyacente, el algoritmo genético que utiliza el cruce parcialmente
mapped y la mutación inserción y el nuevo método metaheurı́stico que hace uso del
cruce parcialmente mapped y el vecindario adyacente.

Eficacia Optimlidad y robustez


(i) Búsqueda local (i) Exacto basado en caminos hamil-
(ii) Algoritmo genético tonianos y búsqueda exhaustiva
(iii) Heurı́stico (ii) Heurı́stico
(iv) Exacto basado en caminos hamil-
tonianos (iii) Algoritmo genético

(v) Búsqueda exhaustiva (iv) Búsqueda local

Con esta clasificación es evidente que a medida que se gana en eficacia, se pierde
en optimalidad y robustez, por este motivo, dependiendo de la situación que se re-
coja en el problema y de las necesidades del usuario será más aconsejable utilizar un
método u otro. Si se busca una solución exacta se deberá hacer uso de la búsqueda
exhaustiva o preferiblemente del método exacto basado en caminos hamiltonianos,
ya que en cuanto a optimalidad y robustez ambos son iguales por ser métodos
exactos, pero el segundo método es más eficaz. Si por el contrario fuese necesaria
Capı́tulo 5. Método de resolución metaheurı́stico propuesto 55

una ejecución rápida, lo más adecuado serı́a hacer uso de la búsqueda local o un
algoritmo genético. No obstante, es necesario recordar que la búsqueda local arroja
malos resultados para este problema por lo que es desaconsejable usarla, ya que
los algoritmos genéticos aportan mejores resultados y el tiempo de ejecución no es
excesivo. Si se busca un equilibrio entre bondad de ajuste y eficacia, entonces el
nuevo método metaheurı́stico propuesto para este problema es la mejor opción.
Capı́tulo 6

Conclusiones y trabajo
futuro

En este último capı́tulo se recogen las principales conclusiones que se han obtenido
a lo largo del documento, ası́ como los inconvenientes que han surgido al aplicar
cada tipo de método. Por último, se propondrán varias ideas en las que seguir
trabajando en la mejora de los nuevos algoritmos propuestos.

6.1. Conclusiones
En este documento he descrito problemas de optimización combinatoria profundi-
zando en el problema de la ordenación lineal. Aunque aparentemente el problema
de la ordenación lineal puede parecer sencillo debido a sus propiedades y a su si-
metrı́a, esto no es ası́, pues se trata de un problema NP-Completo. Es decir, no se
conoce ningún algoritmo que resuelva todas sus instancias en un tiempo polinómico
en la dimensión del problema, y además, dado un punto factible, tampoco se puede
comprobar si es solución del problema. Además he definido tres vecindarios y he
estudiado las propiedades del problema de la ordenación lineal bajo estos vecinda-
rios. Gracias al estudio de las propiedades del problema y la caracterización de los
vecindarios dadas en el Capı́tulo 2, he conseguido resolver el problema mediante
diferentes métodos, dos de ellos nuevos.

A continuación, se recopilan las ventajas y desventajas de los métodos descritos


en los capı́tulos anteriores. Claramente, gracias a la comprensión del problema y el
desarrollo de sus propiedades se ha conseguido profundizar en nuevos métodos de
resolución y el avance en el desarrollo de sus propiedades supondrá la mejora de los
métodos de resolución.

6.1.1. Métodos exactos


- El principal beneficio de estos métodos es su optimalidad, siempre está garanti-
zada, esto es, siempre nos aseguran obtener el óptimo global.
- El problema principal es su eficacia pues el tiempo de ejecución es muy superior
a los otros métodos descritos en este trabajo.
- Además, en la búsqueda mediante caminos hamiltonianos, si los elementos de las

57
58 6.2. Trabajo futuro

parejas simétricamente localizadas {bij , bji } tienen el mismo valor, el grafo asociado
al LOP tendrá dos aristas entre los vértices i, j y por tanto la cantidad de posi-
bles caminos hamiltonianos aumenta notablemente. Consecuentemente, aumenta el
tiempo de ejecución.
- En cuanto a los dos métodos exactos descritos en el Capı́tulo 3 cabe destacar la
eficacia del método basado en los caminos hamiltonianos del grafo óptimo frente a
la búsqueda exhaustiva.

6.1.2. Métodos metaheurı́sticos


- La caracterı́stica más destacable de estos problemas es el ahorro en el tiempo de
ejecución, pues son métodos muy eficaces.
- Asimismo, pueden ser aplicados a problemas muy diversos sin necesidad de pro-
fundizar en las propiedades del problema.
- El mayor inconveniente es la falta de garantı́a en la optimalidad. Además, cuando
no se tiene información suficiente sobre el problema, no se puede asegurar que el
resultado obtenido sea el óptimo global.
- Considerando los dos métodos metaheurı́sticos descritos en el Capı́tulo 4, podemos
decir que la búsqueda local no es un procedimiento adecuado para este problema
en cuanto a optimalidad se refiere. Mientras que los algoritmos genéticos aportan
mejores valores de la función objetivo.
- Asimismo, hay que tener en cuenta que para los algoritmos genéticos, los paráme-
tros iniciales del problema juegan un papel fundamental en el comportamiento del
método y, a priori, no se puede saber qué combinación de parámetros iniciales será
la más adecuada.

6.1.3. Método metaheurı́stico propuesto


- La aportación de este método es el equilibrio entre eficacia y bondad de ajuste.
Gracias al desarrollo de las propiedades y la caracterización de los óptimos locales
del método, se consigue que el óptimo global se alcance en un alto porcentaje pese
a ser un método aproximado.
- El mayor inconveniente es que por ser un método mrtaheurı́stico, la optimalidad
no está garantizada.
- Además, los parámetros del método tienen un papel fundamental en la solución
final y no podemos establecerlos de forma óptima.

6.2. Trabajo futuro


En este documento se han desarrollado dos métodos nuevos. En primer lugar un
método exacto que ha supuesto un avance en eficiencia respecto a los métodos
exactos descritos hasta la fecha. En segundo lugar, un método metaheurı́stico que
supone una mejorı́a en cuanto a la bondad de ajuste para este problema con res-
pecto a los métodos metaheurı́sticos ya conocidos. No obstante, como se ha citado
en la Sección 6.1 estos algoritmos presentan algunos inconvenientes o desventajas
que convendrı́a solventar en un futuro.
Capı́tulo 6. Conclusiones y trabajo futuro 59

Vistas las debilidades del nuevo algoritmo exacto descrito en el Capı́tulo 3, serı́a
conveniente buscar un método heurı́stico eficiente, bueno y robusto que resuelva el
problema de la búsqueda de caminos hamiltonianos en un tiempo polinómico. La
búsqueda de caminos ha sido mucho más estudiada a fin de encontrar el camino de
peso mı́nimo entre dos vértices de un grafo, por analogı́a con el problema del via-
jero/a (TSP)1 . Por el contrario, el LOP trata de maximizar, pero en la propiedad
(iv) de la Sección 2.2 hemos visto que podemos reconvertir el LOP en un problema
de minimización tomando como entrada la transpuesta de la matriz o tomando
la función objetivo f ′ descrita mediante la Ecuación (2.5) que calcula la suma de
los elementos situados por debajo de la diagonal principal. De este modo, podrı́an
adaptarse métodos heurı́sticos para la resolución del TSP a la resolución del LOP.

Una segunda idea serı́a seguir desarrollando y mejorando el método heurı́stico


propuesto en el Capı́tulo 5. Como se ha citado algunas de las principales desventajas
de este problema son: la inexistencia de una pauta para la elección de los paráme-
tros iniciales, la pérdida de eficacia con respecto a otros métodos metaheurı́sticos y
la falta de garantı́a para alcanzar el óptimo global. Para solventar esto se describen
a continuación algunas posibles mejoras. En primer lugar, serı́a conveniente reali-
zar un estudio estadı́stico para poder establecer una regla con la que determinar
los parámetros iniciales del problema para ası́ poder obtener mejores resultados.
Además, estudiar un criterio de parada diferente al número de iteraciones en rela-
ción al valor de función objetivo ayudarı́a a mejorar la optimalidad y la eficacia,
por ejemplo, el porcentaje de mejora en el valor de la función objetivo en cada ite-
ración. También podrı́a ser ventajoso estudiar el número de puntos factibles con un
mismo valor de función objetivo en cada iteración y eliminar o modificar al menos
uno de ellos, a fin de explorar una mayor sección del espacio de búsqueda y obtener
el óptimo global con una mayor probabilidad.

1
Este es uno de los problemas clásicos de optimización discreta o combinatoria y se
puede encontrar en el Apéndice A.
Apéndice A

Problemas más relevantes de


optimización combinatoria

El problema del viajero/a (Traveling Salesperson Problem - TSP) [1]: este


problema consiste en recorrer n ciudades comenzando y finalizando en la
misma ciudad haciendo que el coste del camino sea mı́nimo. Dependiendo de
la instancia escogida, podemos asociar este coste con diferentes conceptos,
siendo los más comunes: la distancia del camino o el tiempo empleado para
recorrerlo.
Para modelizarlo podemos usar diferentes representaciones del problema co-
mo por ejemplo: grafos o matrices. El más habitual es un grafo ponderado
G = (V, A, W ) en el que cada vértice de V = {1, 2, ..., n} representa una ciu-
dad, mientras que cada una de las aristas de A = {(i, j)∣i, j ∈ V ∧ i =/ j} se
identifica con los caminos de una ciudad i, a otra j, y W = {wij ∣i, j ∈ V ∧
i =/ j} el conjunto que recoge los pesos del grafo que se identifican con el coste
de ir de la ciudad i a la j, con i, j ∈ {1, ..., n}, i =/ j. Estos costes asociados,
wij , serán los parámetros bajo los que se define la función objetivo f . En
este caso, un punto factible se puede representar mediante cualquier permu-
tación de las n ciudades, σ = (σ1 σ2 ....σn ) ∈ Sn donde Sn representa el grupo
simétrico. Cada posición i de la permutación indica la ciudad que debemos
visitar en i-ésimo lugar. Sin pérdida de generalidad, podemos fijar la ciudad
de partida σ1 = k que es a la que tenemos que regresar tras haber visitado
todas. Esta será la única restricción que exijamos para definir este problema,
pero según la instancia escogida podrı́amos exigir más restricciones. Ası́, po-
demos definir el espacio de búsqueda S del siguiente modo:
S = {σ = (kσ2 ...σn ) ∈ Sn } donde Sn es el grupo de permutaciones de n
elementos y definimos la función objetivo a minimizar como:

f ∶ Sn Ð→ R+
n−1
σ z→ wkσ2 + ∑ wσj σj+1 + wσn k
j=2

Aunque la solución a este problema consiste en encontrar el coste mı́nimo


necesario para recorrer todas las ciudades empezando y finalizando en una
dada, nos interesa saber en qué orden han de recorrerse las ciudades para

61
62

lograr este valor. Esto es, no sólo nos interesa el valor mı́nimo de f , sino el
punto factible σ ∈ Sn en el que se alcanza esta solución.
El problema de la mochila discreta [2]: en este problema se tiene un conjunto
de n objetos, J = {1, 2, ..., n}, donde cada objeto j ∈ {1, ..., n} tiene un peso ωj
y un valor vj asociados. Se trata de llenar una mochila de capacidad máxima
W para obtener el valor máximo posible, teniendo en cuenta que no todos
los objetos caben en la mochila. Esto es, la solución es el valor máximo que
podemos llevar en la mochila. En este caso, cualquier combinación de k < n
objetos será un punto factible para este problema siempre y cuando la suma
del peso de los k objetos no sea mayor que W . Para representar un punto
factible de este problema podrı́amos usar conjuntos de números enteros o
vectores binarios. En este ejemplo, utilizaremos subconjuntos formados por
los elementos de J que serán los que metamos en la mochila. Ası́, definimos
S y f del siguiente modo:
k
S = {{j1 , j2 , ..., jk } ⊂ J∣ ∑ ωji ≤ W },
i=1

f ∶ S Ð→ R+
k
{j1 , j2 , ..., jk } z→ ∑ vji
i=1

Maximizando f se obtiene el valor máximo que se puede tener en la mochila.


No obstante, también interesa saber qué combinación de estos objetos dan
dicha solución, esto es, qué subconjunto de J se ha elegido.

El problema de empaquetado de conjuntos [2]: sean J = {j1 , j2 , ..., jn } una


colección de elementos y H = {h1 , h2 , ..., hm } una colección de conjuntos
formados por elementos de J, donde cada hi = {ji1 , ji2 , ..., jid } tiene un coste
o un beneficio asociado ai . El problema consiste en empaquetar todos los
elementos de J mediante elementos de H, sin solapamientos, de forma que el
beneficio sea máximo o el coste sea mı́nimo. Pero no solo nos interesa el valor
de la función objetivo, sino también qué empaquetamiento da este valor.
En este caso un punto factible será cualquier subconjunto de conjuntos de
H que contenga exactamente cada elemento de J una única vez. Por lo que
podemos definir el par (S, f ) del siguiente modo:
S = {{hi1 , hi2 , ..., hik } ⊂ H∣∀jl ∈ J, ∃!hi0 ∣jl ∈ hi0 }

f ∶ S Ð→ R
k
{hi1 , hi2 , ..., hik } z→ ∑ ail
l=1

El problema del árbol recubridor mı́nimo (Minimal Spanning Tree - MST) [2]:
dado un grafo (V, A), donde V = {1, ..., n} representa un conjunto de vértices
y A = {{i, j}∣i, j = 1, ..., n} un conjunto de aristas con un valor asociado aij ,
se busca encontrar el subgrafo conectado y sin ciclos que contiene todos los
elementos de V y un subconjunto de A cuyo valor asociado sea mı́nimo.
Para este problema, un punto factible serı́a cualquier subgrafo compuesto
por todos los vértices del grafo original y un subconjunto de k aristas, tales
Apéndice A. Problemas más relevantes de optimización combinatoria 63

que formen un grafo conectado y sin ciclos (independientemente del coste


asociado a sus aristas). Ası́ que podemos definir S y f del siguiente modo:
S = {A′ ⊂ A ∣ (V, A′ ) es conexo y sin ciclos},

f ∶ S Ð→ R+
A′ z→ ∑ aij
(i,j)∈A′

Calculando el mı́nimo de esta función f encontramos la solución, aunque


también nos interesa saber cuáles son estas aristas escogidas.
Apéndice B

Aplicaciones LOP

El problema de la ordenación lineal tiene aplicaciones en diversos campos tales como


[11]: la economı́a, la agregación de preferencias individuales, rankings deportivos,
teorı́a de grafos, antropologı́a...

Una de las principales aplicaciones de este problema se da en economı́a [11],


por ello, vamos a describir cómo podemos hacer la asociación entre un conjun-
to de datos económicos y el LOP. Podemos escribir el problema en los siguientes
términos: supongamos que la economı́a se divide en n sectores y se recogen los va-
lores que aporta cada sector a los demás. Esto es, tenemos una matriz de valores
B = [bij ] ∈ M atn×n (R) en la que cada entrada bij representa el valor que el sector
i sirve al j en un tiempo determinado. Estos valores pueden representar diferentes
conceptos, tales como: cantidad de mercancı́as servidas, importaciones o exporta-
ciones de cada sector i a cada sector j... En consecuencia, dependiendo de los datos
recogidos el objetivo de nuestro problema será reordenar los sectores de manera que
se maximicen beneficios o se minimicen pérdidas.

Otra de las aplicaciones son los rankings deportivos [11]. Supongamos que en
una liga deportiva cada equipo juega contra cada uno de los demás n − 1 equipos
dos veces. El ganador consigue 3 puntos y en caso de empate, ambos consiguen
1 punto. Finalizados todos los encuentros, en caso de que dos equipos tengan la
misma puntuación, queda como vencedor aquel equipo que haya conseguido en-
cajar más goles a su adversario. Con estos goles se puede construir una matriz
A = [aij ] ∈ M atn×n (N ∪ {0}) en la que cada entrada aij representa el número de
tantos que el equipo i ha conseguido contra el equipo j. En este caso, el objetivo
es maximizar las puntuaciones de nuestro equipo y/o minimizar las de nuestros
adversarios. Por lo que, si encontramos el orden de filas y columnas de la matriz
que haga que la suma de los elementos por encima de la diagonal sea máxima, en-
contrarı́amos un nuevo ranking. En este nuevo ranking el vencedor, que quedarı́a en
primera posición, es el equipo que más tantos haya conseguido encajar a sus rivales.

Una aplicación más es la asignación de preferencias individuales [11]. Suponga-


mos que hay n personas y cada una de ellas ordena una lista de n elementos según
sus preferencias individuales. Ahora queremos crear una única lista que diste lo me-
nos posible de las listas creadas por las n personas. Para ello, construimos la matriz

65
66

B = [bij ] ∈ M atn×n (N ∪ {0}), de modo que en este caso, cada entrada bij representa
el número de personas que prefieren el elemento i al elemento j. Resolviendo el pro-
blema y encontrando la reordenación de filas y columnas que maximizan la suma
de las entradas por encima de la diagonal principal obtendremos la lista de prefe-
rencias que mejor se adapte de forma global a las listas de preferencias individuales.

Otros problemas que podemos modelizar como un LOP son problemas asocia-
dos a grafos [2]. Por ejemplo, supongamos que tenemos un grafo dirigido donde D =
(V, A, W ) donde V = {1, ...n} representa el conjunto de vértices, A = {(i, j)∣i, j ∈ V }
representa el conjunto de aristas y W = {wij ∣(i, j) ∈ A} representa los pesos aso-
ciados a cada arista. Entonces, el problema consiste en encontrar A′ ⊆ A tal que
G = (V, A′ , W ′ ) donde W ′ = {wij ∣(i, j) ∈ A′ }, sea un grafo sin ciclos y cuyo peso
asociado sea mı́nimo. Este problema se puede convertir en un LOP construyendo
la matriz del siguiente modo: B = [bij ] ∈ M atn×n (R) donde bij representa el peso
de la arista (i, j) si existe y 0 en caso contrario. En este caso nuestro objetivo es
minimizar la suma del peso de nuestro grafo. Aunque también podemos definir el
problema de forma análoga buscando maximizar el peso del grafo, valiéndonos de
la Propiedad (iv) de la Sección 2.2.

Un segundo ejemplo de grafos es el de la minimización de cruces [2]. Suponga-


mos que tenemos un grafo bipartito H = (V, A), con la bipartición V = W1 ∪ W2 .
El problema consiste en dibujar los nodos en dos lı́neas paralelas en una de ellas
situaremos los vértices W1 y en la otra lı́nea los de W2 . Después, dibujaremos las
aristas del grafo que unirán los dos conjuntos de vértices. En este caso, nuestro
objetivo es encontrar en qué orden debemos colocar los vértices para que los cruces
entre las aristas sean mı́nimos. Esto, lo podemos convertir en un LOP en el que
cada entrada bij ∈ (N ∪ {0}) representa el número de cruces de la arista (i, j). Ası́
que, una vez obtenida nuestra matriz LOP nuestro objetivo será minimizar el valor
de la suma de los elementos por encima de la diagonal, o lo que es equivalente,
minimizar el número de cruces entre las aristas de nuestro grafo.
Apéndice C

Conceptos básicos sobre


grafos

C.1. Definiciones
Definición C.1.1. Un grafo simple G consiste en un par de conjuntos finitos V y
A donde cada elemento de V se llama vértice y cada elemento de A se llama arista,
las cuales son conjuntos no ordenados de dos vértices.
G = (V, A) donde V = {1, 2, ..., n} y A = {{i, j}∣i, j ∈ V }

Definición C.1.2. Sea G = (V, A) donde V = {1, ..., n} y A = {{i, j}∣i, j ∈ V } un


grafo, definimos la matriz de adyacencia del grafo M ∈ M atn×n ({0, 1}), donde mij
toma el valor 1 si la arista {i, j} ∈ A o 0 en caso de que la arista {i, j} ∈/ A.

Ejemplo C.1.1. Dado G podemos representarlo mediante dos estructuras. En la


Figura C.1 observamos la representación del grafo por medio de nodos y aristas (a
la izquierda) y su matriz de adyacencia (a la derecha).

G = ({1, 2, 3, 4, 5}, {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 5}})

Figura C.1: Grafo simple y su matriz de adyacencia.

Definición C.1.3. Un grafo dirigido o digrafo D consiste en dos conjuntos finitos


V y A donde cada elemento de V es un vértice y cada elemento de A es una arista.
En este caso, las aristas se expresan mediante pares ordenados, es decir: cada arista

67
68 C.1. Definiciones

tiene una orientación especı́fica.


D = (V, A) donde V = {1, 2, ..., n} y A = {(i, j)∣i, j ∈ V }

Nota: La matriz de adyacencia de un grafo simple siempre será simétrica; en


un digrafo, por el contrario, la matriz no siempre tendrá por qué ser simétrica.

Definición C.1.4. Llamaremos grado de un vértice v ∈ V y representaremos por


g(v) al número de aristas que inciden sobre él.
En un digrafo podemos definir otros dos conceptos relacionados con el grado del
vértice:
- Grado positivo de v, g + (v): número de aristas que llegan a v.
- Grado negativo de v, g − (v): número de aristas que salen de v.
Nota: g(v) = g + (v) + g − (v).

Ejemplo C.1.2. Dado el digrafo

D = ({1, 2, 3, 4, 5}, {(1, 2), (2, 4), (3, 5), (4, 1), (5, 2)}),

se observa su representación en la Figura C.2, y se muestra en la Tabla C.1 los


grados de sus vértices.

vértice g + (v) g − (v) g(v)


1 1 1 2
2 2 1 3
3 0 1 1
4 1 1 2
5 1 1 2

Tabla C.1: Grados de los vértices del


Figura C.2: Grafo dirigido. digrafo.

Definición C.1.5. Un digrafo D se dice completo si para cada par de vértices


i, j ∈ V existen dos aristas (i, j), (j, i) ∈ A. Esto es, D = (V, A) donde V = {1, 2, ..., n}
y A = {(i, j)∣∀i, j ∈ V, i =/ j}.

Definición C.1.6. Un grafo ponderado P consiste en tres conjuntos finitos V , A


y W donde cada elemento de V es un vértice, cada elemento de A es una arista y
cada elemento de W un peso asociado a cada una de las aristas.
P = (V, A) donde V = {1, ⋯, n} es el conjunto de vértices, A = {(ai , aj )∣ai , aj ∈ V } es
el conjunto de aristas que tienen un peso asociado, esto es: W = {wij ∣w((ai , aj )) =
wij , ∀(ai , aj ) ∈ A}} es el conjunto de los pesos asociados.
En el caso de que el grafo no sea dirigido, enronces wij = wji , ∀i, j ∈ {1, ..., n};
mientras que si el grafo es dirigido, estos valores pueden ser distintos.

Ejemplo C.1.3.

P = {({1, 2, 3, 4, 5}, {(1, 2), (1, 3), (1, 4), (2, 3), (4, 5)}, {3, 7, 5, 9, 4}}.
Apéndice C. Conceptos básicos sobre grafos 69

Figura C.3: Grafo ponderado.

Definición C.1.7. Un camino de un grafo es una secuencia de aristas del grafo


tales que cada par de aristas consecutivas comparten un vértice común. Se denota
por (v1 v2 ...vk ) de modo que: (vi , vi+1 ) ∈ A, ∀i ∈ {1, ..., k − 1}.

Definición C.1.8. Un ciclo es un camino en el que el vértice inicial y final son


el mismo. Esto es, es un camino tal que (v1 v2 ...vk v1 ) donde: (vi , vi+1 ) ∈ A, ∀i ∈
{1, ..., k − 1} y (vk , v1 ) ∈ A.

Definición C.1.9. Diremos que un grafo es cı́clico si contiene, al menos, un ciclo


y diremos que es acı́clico si no contiene ningún ciclo.

Definición C.1.10. Un camino es hamiltoniano si cada vértice del grafo aparece


exactamente una vez. Es decir: (v1 , ..., vn ) siendo n el número de vértices del grafo
y tal que: vi =/ vj , ∀i, j ∈ {1, ..., n} y (vi , vi+1 ) ∈ A, ∀i ∈ {1, ..., n − 1}.

Definición C.1.11. Diremos que un grafo es hamiltoniano si tiene un ciclo hamilto-


niano, es decir, si tiene un ciclo que recorre todos los vértices del grafo exactamente
una vez a excepción del primero que se toma como inicial y final.

Definición C.1.12. Diremos que un grafo es semi-hamiltoniano si contiene un


camino hamiltoniano.

Nota: todo grafo hamiltoniano es semi-hamiltoniano.

Ejemplo C.1.4. Si retomamos el Ejemplo C.1.1 del grafo simple podemos encon-
trar un camino hamiltoniano, por ejemplo: (41325).

Definición C.1.13. Un torneo es un digrafo D = (V, A) en el que ∀v1 , v2 ∈ V ,


existe (v1 , v2 ) ∈ A o (v2 , v1 ) ∈ A.
Apéndice D

Más conceptos sobre los tres


vecindarios descritos sobre Sn

D.1. Vecindario Adyacente


Lema D.1.1. El vecindario adyacente de un una permutación de tamaño n, σ ∈ Sn ,
está formado por n − 1 permutaciones.

Demostración D.1.1. Desarrollaré la demostración por inducción sobre n, la lon-


gitud de la permutación, de ∣Nady (σ)∣ = n − 1, ∀σ ∈ Sn .

Primero lo comprobamos para las permutaciones de tamaño 2, 3 y 4:


Si σ ∈ S2 → σ = (σ1 σ2 ) Ð→ Nady (σ) = {(σ2 σ1 )}
∣Nady (σ)∣ = 1 = 2 − 1
Si σ ∈ S3 → σ = (σ1 σ2 σ3 ) Ð→ Nady (σ) = {(σ2 σ1 σ3 ), (σ1 σ3 σ2 )}
∣Nady (σ)∣ = 2 = 3 − 1
Si σ ∈ S4 → σ = (σ1 σ2 σ3 σ4 ) Ð→ Nady (σ) = {(σ2 σ1 σ3 σ4 ), (σ1 σ3 σ2 σ4 ), (σ1 σ2 σ4 σ3 )}
∣Nady (σ)∣ = 3 = 4 − 1

Suponemos que es cierto para σ ∈ Sn−1 : Nady (σ) = {(σ2 σ1 σ3 ...σn−1 ),


(σ1 σ3 σ2 σ4 ...σn−1 ), ..., (σ1 σ2 ...σi+1 σi ...σn−1 ), ..., (σ1 σ2 ...σn−1 σn−2 )} Ô⇒
Ô⇒ ∣Nady (σ)∣ = n − 2 y veamos que se cumple para σ ∈ Sn :
Nady (σ) = {(σ2 σ1 σ3 ...σn−1 σn ), (σ1 σ3 σ2 σ4 ...σn−1 σn ), ..., (σ1 σ2 ...σi+1 σi ...σn−1 σn ),
, ..., (σ1 σ2 ...σn−1 σn−2 σn )} ⊍ {(σ1 σ2 ...σn−2 σn σn−1 )}
Ô⇒ ∣Nady (σ)∣ = n − 2 + 1 = n − 1 ◻

A continuación se desarrolla una generalización del Teorema 2.3.1 que se ha


desarrollado en el Capı́tulo 3

Teorema D.1.1. Dado σ ∗ = (σ1∗ ...σi−1∗


σi∗ σi+1

...σn∗ ) óptimo local del LOP para el
vecindario de intercambio adyacente, toda permutación obtenida al intercambiar
los elementos de las posiciones adyacentes de k pares de elementos, de manera que
un mismo elemento no intervenga en más de un intercambio, dará un valor para la
función objetivo menor o igual que el valor de la función objetivo del óptimo local
encontrado σ ∗ .

71
72 D.2. Vecindario intercambio

Esto es, si σ ∗ = (σ1∗ ...σi∗1 −1 σi∗1 σi∗1 +1 ...σi∗2 −1 σi∗2 σi∗2 +1 ...σi∗k −1 σi∗k σi∗k +1 ...σn∗ ) ∈ Sn es ópti-
mo local para el vecindario de intercambio adyacente entonces:
f (σ ∗ ) ≥ f (σ),
∀σ ∈ N = {(σ1∗ ...σi∗1 −1 σi∗1 +1 σi∗1 ...σi∗2 −1 σi∗2 +1 σi∗2 ...σi∗k +1 σi∗k ...σn∗ ) ∈ Sn ∣ k ≤ ⌊ n2 ⌋ }

Demostración D.1.2. Si σ ∗ = (σ1∗ ⋯σi∗ ⋯σn∗ ) es un óptimo local para el vecindario


de intercambio adyacente, se cumple que:
bσi∗ σi+1
∗ ≥ bσi+1

σi∗ , ∀i ∈ {1, ..., n − 1}
Tomamos ahora la permutación
σ = (σ1∗ ⋯σi∗1 +1 σi∗1 ⋯σi∗2 +1 σi∗2 ⋯σi∗k +1 σi∗k ⋯σn∗ ) y calculamos el valor de la función y
aplicamos las desigualdades obtenidas en el teorema anterior :
f (σ) = f (σ ∗ ) − bσi∗ σi∗ +1 − ⋯ − bσi∗ σi∗ +1 + bσi∗ +1 σi∗ + ⋯ + bσi∗ +1 σi∗ =
= f (σ ∗ ) − bσi∗ σi∗ +1 + bσi∗ +1 σi∗ + ⋯ − bσi∗ σi∗ +1 + bσi∗ +1 σi∗ ≤
1 1 k k 1 1 k k

≤ f (σ ∗ ) − bσi∗ σi∗ +1 + bσi∗ σi∗ +1 + ⋯ − bσi∗ σi∗ +1 + bσi∗ σi∗ +1 = f (σ ∗ )


1 1 1 1 k k k k

Ô⇒ f (σ) ≤ f (σ ∗ )
1 1 1 1 k k k k

En conclusión podemos decir que si encontramos una permutación σ ∗ ∈ Sn que


sea óptima para el vecindario adyacente, además de descartar las n − 1 permutacio-
nes que forman el vecindario, sabemos que habrá Fn permutaciones cuyo valor de
la función objetivo será menor, siendo Fn el n-ésimo número de Fibonacci. Dada
una lista de n elementos, Fn cuenta de cuantas formas podemos reordenar los n
elementos intercambiando como mucho ⌊ n2 ⌋ pares de elementos adyacentes sin que
se intersequen. Recordemos que los números de Fibonacci se podı́an construir de
manera natural de manera recursiva del siguiente modo [8]:
F1 = 1,
F2 = 1,
Fn = Fn−1 + Fn−2 , ∀n ≥ 3.
Aunque también podemos darlos de forma no recursiva:
⌊n
2⌋
Fn+1 = ∑ (n−i
i
), ∀n ≥ 0.
i=0

D.2. Vecindario intercambio


Lema D.2.1. El vecindario intercambio de un una permutación de tamaño n,
σ ∈ Sn , está formado por n(n−1)
2
permutaciones.

Demostración D.2.1. Ahora desarrollaré la demostración por inducción sobre n,


la longitud de la permutación, de ∣Nint (σ)∣ = n(n−1)
2
, ∀σ ∈ Sn .
Primero lo comprobamos para las permutaciones de tamaño: 2, 3 y 4.
Si σ ∈ S2 → σ = (σ1 σ2 ) → Nint (σ) = {(σ2 σ1 )}
∣Nint (σ)∣ = 1 = 2(2−1)
2

Si σ ∈ S3 → σ = (σ1 σ2 σ3 ) → Nint (σ) = {(σ2 σ1 σ3 ), (σ3 σ2 σ1 ), (σ1 σ3 σ2 )}


∣Nint (σ)∣ = 3 = 3(3−1)
2

Si σ ∈ S4 → σ = (σ1 σ2 σ3 σ4 ) →Nint (σ) = {(σ2 σ1 σ3 σ4 ), (σ3 σ2 σ1 σ4 ), (σ4 σ2 σ3 σ1 ),


(σ1 σ3 σ2 σ4 ), (σ1 σ4 σ3 σ2 ), (σ1 σ2 σ4 σ3 )}
Apéndice D. Más conceptos sobre los tres vecindarios descritos sobre Sn 73

4(4−1)
∣Nint (σ)∣ = 6 = 2

Suponemos que es cierto para σ ∈ Sn−1


Nint (σ) = {(σ2 σ1 σ3 ...σn−1 ), (σ3 σ2 σ1 ...σn−1 ), ..., (σn−1 σ2 σ3 ...σ1 ), (σ1 σ3 σ2 ...σn−1 ), ...,
, ..., (σ1 σn−1 σ3 ...σ2 ), ..., (σ1 σ2 σ3 ...σn−1 σn−2 )} Ô⇒ ∣Nint (σ)∣ = (n−1)(n−2)
2
,

y veamos que se cumple para σ ∈ Sn :


Nint (σ) = {(σ2 σ1 σ3 ...σn−1 σn ), (σ3 σ2 σ1 ...σn−1 σn ), ..., (σn−1 σ2 σ3 ...σ1 σn ),
(σ1 σ3 σ2 ...σn−1 σn ), ..., (σ1 σn−1 σ3 ...σ2 σn ), ..., (σ1 σ2 σ3 ...σn−1 σn−2 σn )}
⊍ {(σn σ2 σ3 ...σn−1 σ1 ), (σ1 σn σ3 ...σn−1 σ2 ), ..., (σ1 σ2 σ3 ...σn σn−1 )}

(n − 1)(n − 2) n2 − 3n + 2 + 2n − 2 n2 − n n(n − 1)
Ô⇒ ∣Nint (σ)∣ = + (n − 1) = = =
2 2 2 2
. ◻
Al igual que en el caso anterior voy a generalizar el 2.3.2 del Capı́tulo 2 y
demostrar este resultado en el Teorema D.2.1.
Teorema D.2.1. Dada σ ∗ = (σ1∗ ...σi∗1 −1 σi∗1 σi∗1 +1 ...σi∗2 −1 σi∗2 σi∗2 +1 ...σi∗k −1 σi∗k σi∗k +1 ...σn∗ ) ∈
Sn solución óptima para el vecindario intercambio, toda permutación σ ∈ Sn ob-
tenida al realizar intercambios de los elementos de las posiciones de σ ∗ de modo
que los intercambios no se solapen ni se intersequen entre sı́, tendrá un valor de la
función objetivo menor o igual que el de σ ∗ .
Es decir, si σ ∗ = (σ1∗ ...σi∗1 −1 σi∗1 σi∗1 +1 ...σi∗2 −1 σi∗2 σi∗2 +1 ...σi∗k −1 σi∗k σi∗k +1 ...σn∗ ) ∈ Sn es ópti-
mo local de el vecindario intercambio Nint (σ ∗ ), entonces:
f (σ ∗ ) ≥ f (σ), ∀σ ∈ N = {σ = (σ1∗ ...σi∗1 −1 σi∗2 σi∗1 +1 ...σi∗2 −1 σi∗1 σi∗2 +1 ...
σi∗k−1 −1 σi∗k σi∗k−1 +1 ...σi∗k −1 σi∗k−1 σi∗k +1 ...σn∗ ) ∈ Sn ∣ k ≤ ⌊ n2 ⌋}
Demostración D.2.2. Supongamos que σ ∗ = (σ1∗ ⋯σi∗1 ⋯σi∗2 ⋯σi∗k ⋯σn∗ ) es un ópti-
mo local para el vecindario de intercambio, por lo que se cumple que:
j j−1 j j−1
∑ bσi∗ σk∗ + ∑ bσk∗ σj∗ ≥ ∑ bσk∗ σi∗ + ∑ bσj∗ σk∗ ,
k=i+1 k=i k=i+1 k=i
∀i ∈ {1, ..., n − 1} , ∀j ∈ {i + 1, ..., n}

Tomamos ahora la permutación


σ = (σ1∗ ⋯σi∗2 ⋯σi∗1 ⋯σi∗4 ⋯σi∗3 ⋯σi∗k ⋯σi∗k−1 ⋯σn∗ ) y calculamos el valor de la función y
aplicamos las desigualdades obtenidas en el teorema anterior :
f (σ) = f (σ ∗ ) − [bσi∗ σi∗ +1 + bσi∗ σi∗ +2 + ⋯ + bσi∗ σi∗ ] +
1 1 1 1 1 2
+ [bσi∗ σi∗ +1 + bσi∗ σi∗ +2 + ⋯ + bσi∗ σi∗ ] +
2 2 2 2 2 1
− [bσi∗ σi∗ + bσi∗ +1 σi∗ + ⋯ + bσi∗ −1 σi∗ ] +
1 2 1 2 2 2
+ [bσi∗ σi∗ + bσi∗ +1 σi∗ + ⋯ + bσi∗ −1 σi∗ ] + ⋯⋯⋯ =
2 1 2 1 1 1
i2 i1 i2 −1 i1 −1

= f (σ ) − ∑ bσi∗ σl∗ + ∑ bσi∗ σl∗ − ∑ bσl∗ σi∗ + ∑ bσl∗ σi∗ ⋯⋯⋯ =
l=i1 +1 1 l=i2 +1 2 l=i1 2 l=i2 1

i2 i2 −1 i1 i1 −1
= f (σ ∗ ) − [ ∑ bσi∗ σl∗ + ∑ bσl∗ σi∗ ] + [ ∑ bσi∗ σl∗ + ∑ bσl∗ σi∗ ] + ⋯ ≤
l=i1 +1 1 l=i1 2 l=i2 +1 2 l=i2 1

i2 i2 −1 i2 i2 −1
≤ f (σ ∗ ) − [ ∑ bσi∗ σl∗ + ∑ bσl∗ σi∗ ] + [ ∑ bσi∗ σl∗ + ∑ bσl∗ σi∗ ] + ⋯⋯⋯ = f (σ ∗ )
l=i1 +1 1 l=i1 2 l=i1 +1 1 l=i1 2

Ô⇒ f (σ) ≤ f (σ ∗ ) ◻
74 D.3. Vecindario Insercción

Como vemos, gracias a este teorema podemos asegurar que hay más permu-
taciones de las n(n−1)
2
que forman el vecindario intercambio que tendrán un valor
menor de la función objetivo. Exactamente, podemos descartar Mn soluciones, don-
de Mn representa el n-ésimo número de Motzkin. Una de las definiciones de Mn
viene dada del siguiente modo: dados n puntos situados equidistantemente sobre
una circunferencia, Mn cuenta el número de formas en las que se pueden dibujar
sobre la circunferencia cuerdas que unan los n puntos de modo que las cuerdas no
se crucen [8]:
M0 = 1,
M1 = 1,
n−1
Mn+1 = Mn + ∑ Mi Mn−1−i , ∀n ≥ 1.
i=0

D.3. Vecindario Insercción


Lema D.3.1. El vecindario inserción de un una permutación de tamaño n, σ ∈ Sn
está formdo por (n − 1)2 permutaciones.

Demostración D.3.1. Ahora vamos a ver la demostración por inducción sobre n,


longitud de la permutación, de ∣Nins (σ)∣ = (n − 1)2 , σ ∈ Sn

Primero lo comprobamos para los primeros términos:


Si σ ∈ S2 Ð→ σ = (σ1 σ2 ) Ð→ Nins (σ) = {(σ2 σ1 )}
∣Nint (σ)∣ = 1 = (2 − 1)2
Si σ ∈ S3 Ð→ σ = (σ1 σ2 σ3 ) Ð→ Nins (σ) = {(σ2 σ1 σ3 ), (σ2 σ3 σ1 ), (σ1 σ3 σ2 )}
∣Nins (σ)∣ = 4 = (3 − 1)2
Si σ ∈ S4 Ð→ σ = (σ1 σ2 σ3 σ4 )
Ð→ Nins (σ) = {(σ2 σ1 σ3 σ4 ), (σ2 σ3 σ4 σ1 ), (σ1 σ3 σ2 σ4 ), (σ1 σ3 σ4 σ2 ), (σ3 σ1 σ2 σ4 ),
(σ1 σ2 σ4 σ3 ), (σ4 σ1 σ2 σ3 ), (σ1 σ4 σ2 σ3 )}
∣Nins (σ)∣ = 9 = (4 − 1)2

Suponemos que es cierto para σ ∈ Sn−1 = {(σ2 σ1 σ3 ...σn−1 ), (σ2 σ3 σ1 ...σn−1 ), ...,
(σ2 σ3 ...σn−1 σ1 ), (σ1 σ3 σ2 ...σn−1 ), ..., (σn−1 σ1 σ2 ...σn−2 ), ..., (σ1 σ2 ...σn−1 σn−2 )}
Ô⇒ ∣Nins (σ)∣ = (n − 2)2 y veamos que se cumple para σ ∈ Sn :

Nins (σ) = {(σ2 σ1 σ3 ...σn−1 σn ), (σ2 σ3 σ1 ...σn−1 σn ), ..., (σ2 σ3 ...σn−1 σ1 σn ),


(σ1 σ3 σ2 ...σn−1 σn ), ..., (σn−1 σ1 σ2 ...σn−2 σn ), ..., (σ1 σ2 ...σn−1 σn−2 σn )} ⊍
{(σ2 σ3 ...σn−1 σn σ1 ), (σ1 σ3 ...σn−1 σn σ2 ), ..., (σ1 σ2 ...σn−2 σn σn−1 )} ⊍
{(σn σ1 σ2 σ3 ...σn−2 σn−1 ), (σ1 σn σ2 ...σn−2 σn−1 ), ..., (σ1 σ2 ...σn σn−2 σn−1 )}

Ô⇒ ∣Nins (σ)∣ = (n − 2)2 + (n − 1) + (n − 2) = n2 − 4n + 2 + 4 + 2n − 3 =


= n2 − 2n + 1 = (n − 1)2
Apéndice E

Implementación

En este apéndice se recogenlas funciones y programas diseñados para la experimen-


tación y el posterior análisis de los métodos que se describen a lo largo del trabajo.
En primer lugar se define la función objetivo del problema definida mediante la
Ecuación (2.2). Después se desarrollan los tres tipos de métodos en los Capı́tulo 3,
Capı́tulo 4 y Capı́tulo 5. Por último, el programa donde se aplican las funciones
descritas y se guardan sus resultados.

E.1. Función objetivo LOP

75
funcionObjetivoLOP <- function(matriz, permutacion){
n <- length(permutacion)
suma <- 0
for (i in 1:(n-1)){
for (j in (i+1):(n)){
suma <- suma + matriz[permutacion[i],permutacion[j]]
}
}
return(suma)
}

1
Apéndice E. Implementación 77

E.2. Métodos exactos


En esta sección se recoge el código de las funciones para el desarrollo de los métodos
exactos del Capı́tulo 3.

E.2.1. Búsqueda exhaustiva


En primer lugar, la búsqueda exhaustiva que genera todas las permutaciones y cal-
cula una a una su valor. Si el valor obtenido es mayor que el obtenido hasta ese
momento se reemplaza la solución (valor de la función objetivo) y el punto factible.
En caso de que el valor sea el mismo se agrega el punto factible a la lista de puntos
factibles solución. Cuando el resultado es menor, no se guarda.

E.2.2. Grafo óptimo


En segundo lugar, se utiliza el método basado en caminos hamiltonianos del grafo
óptimo. Se calculan los caminos hamiltonianos y se va calculando el valor de función
objetivo en caso de que el valor obtenido sea mayor se guarda, en caso de que sea
menor, no se guarda. Además se describen otras funciones relacionadas con el grafo
óptimo. Primero una función que dado un grafo y un camino comprueba si es
hamiltoniano. Una función para crear el grafo óptimo tal y como se ha descrito
en la Subsección 3.2.1. Otras dos que crean el grafo óptimo con ponderaciones.
Por último, una función que calcula la suma del peso de las aristas que forman un
camino.
#busqueda exhaustiva para el LOP

exhaustivoLOP<-function(matriz){
n<-dim(matriz)[1]
library(gtools)
sol<-0
permsol<-c()
permutaciones<-permutations(n,n,c(1:n))
for (i in 1:(dim(permutaciones)[1])){
if(sol<funcionObjetivoLOP(matriz,permutaciones[i,])){
sol<-funcionObjetivoLOP(matriz,permutaciones[i,])
permsol<-c(permutaciones[i,])
}
else if(sol==funcionObjetivoLOP(matriz,permutaciones[i,])){
permsol<-rbind(permsol, permutaciones[i,])
}

}
return(list(sol,permsol))
}

1
#busqueda de caminos hamiltonianos

hamiltonianos <-function(matrizgrafo,grafo){
library(gtools)
sol<-0
#caminos<-c()
n<-dim(matrizgrafo)[1]
permutaciones<-permutations(n,n,c(1:n))
for (i in 1:(dim(permutaciones)[1])){
if(is.hamiltonian(grafo,permutaciones[i,])==TRUE){
p<-funcionObjetivoLOP(matrizgrafo,permutaciones[i,])
if (p>sol){
sol<-p
}
}
}
return(sol)
}

#comprueba si un camino es hamiltoniano

is.hamiltonian<-function(grafo,camino){
s<-TRUE
n<-length(grafo)
if(n==length(camino)){
p<-length((1:n)[1:n %in%camino])
if(length((1:n)[1:n %in%camino])==n){
for (i in 1:(n-1)){
i<-i
if(grafo[camino[i],camino[i+1]]==FALSE){
s<-FALSE
break
}
}
}else{
s<-FALSE
}}else{
s<-FALSE
}
return(s)
}

#creacion de grafos optimos con ponderaciones

grafonoponderado<-function(matriz){
library("igraph")
grafotabla<-matrix(nrow=1,ncol=3)
n<-dim(matriz)[1]
grafomatriz<-matrix(0,nrow = n,ncol=n)
for(i in 1:(n-1)){
for(j in (i+1):(n)){
if(matriz[i,j]>=matriz[j,i]){
grafotabla<-rbind(grafotabla,c(i,j,1))

1
grafomatriz[i,j]<-1
}
if(matriz[i,j]<=matriz[j,i]){
grafotabla<-rbind(grafotabla,c(j,i,1))
grafomatriz[j,i]<-1
}
}
}
grafotabla<-grafotabla[-1,]
grafo<-graph.data.frame(grafotabla, directed = TRUE)
lista<-list("grafotabla"=grafotabla,"grafomatriz"=grafomatriz,"grafo"=grafo)
return(lista)
}

grafoponderado1<-function(matriz){
library("igraph")
#el valor de la arista i->j es el valor [i,j] de la matriz
grafotabla<-matrix(nrow=1,ncol=3)
n<-dim(matriz)[1]
grafomatriz<-matrix(0,nrow = n,ncol=n)
for(i in 1:(n-1)){
for(j in (i+1):(n)){
if(matriz[i,j]>=matriz[j,i]){
grafotabla<-rbind(grafotabla,c(i,j,matriz[i,j]))
grafomatriz[i,j]<-matriz[i,j]
}
if(matriz[i,j]<=matriz[j,i]){
grafotabla<-rbind(grafotabla,c(j,i,matriz[j,i]))
grafomatriz[j,i]<-matriz[j,i]
}
}
}
grafotabla<-grafotabla[-1,]
grafo<-graph.data.frame(grafotabla, directed = TRUE)
lista<-list("grafotabla"=grafotabla,"grafomatriz"=grafomatriz,"grafo"=grafo)
return(lista)

grafoponderado2<-function(matriz){
library("igraph")
#el valor de la arista i->j es el valor [i,j]-[j,i] de la matriz
grafotabla<-matrix(nrow=1,ncol=3)
n<-dim(matriz)[1]
grafomatriz<-matrix(0,nrow = n,ncol=n)
vertices<-c()
for(i in 1:(n-1)){
for(j in (i+1):(n)){
if(matriz[i,j]>=matriz[j,i]){
grafotabla<-rbind(grafotabla,c(i,j,matriz[i,j]-matriz[j,i]))
grafomatriz[i,j]<-matriz[i,j]-matriz[j,i]

2
}
if(matriz[i,j]<=matriz[j,i]){
grafotabla<-rbind(grafotabla,c(j,i,matriz[j,i]-matriz[i,j]))
grafomatriz[j,i]<-matriz[j,i]-matriz[i,j]
}
}
}
grafotabla<-grafotabla[-1,]
grafo<-graph.data.frame(grafotabla, directed = TRUE)
lista<-list("grafotabla"=grafotabla,"grafomatriz"=grafomatriz,"grafo"=grafo)
return(lista)
}

#valor de las aristas que forman el camino

pesocamino<-function(matrizgrafo, permutacion){
n <- length(permutacion)
suma <- 0
for (i in 1:(n-1)){
suma <- suma + matrizgrafo[permutacion[i],permutacion[i+1]]
}
return(suma)
}

3
82 E.3. Métodos metaheurı́sticos

E.3. Métodos metaheurı́sticos


En esta sección se recoge el código de las funciones para el desarrollo de los métodos
exactos del Capı́tulo 4.

E.3.1. Búsqueda local


La función de búsqueda local toma una matriz, opcionalmente una permutación y
un vecindario que se debe elegir entre 1:adyacente, 2:intercambio y 3:inserción (por
defecto utilizará el adyacente si no se especifica ninguno). Si la permutación inicial
no se da como dato de entrada a la función, se generará una de forma aleatoria. La
búsqueda local calcula el valor de la permutación inicial y su vecindario. Después
se calcula el valor de la función objetivo de los elementos que forman el vecindario,
si uno de ellos tiene un valor superior, se selecciona dicho punto factible y se repite
el proceso hasta encontrar un punto factible que sea óptimo local.
Además de la función de búsqueda local, se pueden observar otras seis funciones:
tres de ellas para la creación de los vecindarios (dada una permutación, devuelven
su vecindario adyacente, intercambio o inserción) y las otras tres comprueban si
dada una permutación es óptimo local de un vecindario (adyacente, intercambio o
inserción) gracias a la caracterización de los óptimos locales (dada por los Teoremas
2.3.1, 2.3.2 o 2.3.3 respectivamente).

E.3.2. Algoritmo genético


La función que ejecuta el algoritmo genético aplicado al LOP toma la matriz del
problema, el tamaño de población inicial, el número de puntos factibles que forman
parte en cada iteración, la probabilidad de mutación, el número de iteraciones (que
será el criterio de parada), el tipo de cruce -a elegir entre 1:cruce de orden y 2:par-
cialmente mapped - y el tipo de mutación -a elegir entre 1:intercambio, 2:inserción,
3:inversión y 4:scramble). Si el tipo de cruce y mutación no se especifican la función
e ejecutará con cruce de orden y mutación intercambio. Al ejecutar la función esta
llama a otras funciones, además de a la función que calcula el finess. Las funciones
de las que hace uso son: dos para realizar el cruce seleccionado (crece1 o cruce2),
cuatro para realizar la mutación seleccionada (mutacion1, mutacion2, mutacion3
o mutacion4) y una para la selección de puntos factibles que pasan a la siguiente
iteración mediante selección elitista entre los nuevos puntos factibles generados y
los puntos factibles de la iteración anterior (supervivientes).
#algoritmo de la busqueda local para el lop

localLOP <- function (matriz,permutacion=NULL, vecindario=1){

#matriz: matriz del problema


#permutacion: si se tiene alguna informacion del problema, si no, se genera
# despues de forma aleatoria
#vecindario: escogido para la b.local
# 1-adyacente, 2-intercambio, 3-inseccion
library(gtools)
library(R.utils)
n<-dim(matriz)[1]
#se genera la permutacion inicial de forma aleatoria si el usuario no la da
if(is.null(permutacion)){
permutacion<-permute(1:n)
}

valor <- -10000


iteraciones<-0
fitness<-funcionObjetivoLOP(matriz,permutacion)
if(vecindario==1){
vecindario<-vadyacente(permutacion)
while (valor<max(fitness)){
valor<-max(fitness)
k<-which.max(fitness)
permutacion<-vecindario[k,]

fitness<-c()
iteraciones<-iteraciones+1
for (i in 1:(n-1)){
vecindario<-vadyacente(permutacion)
fitness<-c(fitness, funcionObjetivoLOP(matriz,vecindario[i,]))
}
}
}
if(vecindario==2){
vecindario<-vintercambio(permutacion)
while (valor<max(fitness)){
valor<-max(fitness)
k<-which.max(fitness)
permutacion<-vecindario[k,]
fitness<-c()
iteraciones<-iteraciones+1
for (i in 1:(n-1)){
vecindario<-vintercambio(permutacion)
fitness<-c(fitness, funcionObjetivoLOP(matriz,vecindario[i,]))
}
}
}
if(vecindario==3){
vecindario<-vinserccion(permutacion)
while (valor<max(fitness)){
valor<-max(fitness)
k<-which.max(fitness)

1
permutacion<-vecindario[k,]
fitness<-c()
iteraciones<-iteraciones+1
for (i in 1:(n-1)){
vecindario<-vinserccion(permutacion)
fitness<-c(fitness, funcionObjetivoLOP(matriz,vecindario[i,]))
}
}
}

return(list("valor"=valor,"iteraciones"=iteraciones,"permutacion"=vecindario[k,]))
}

#dada una permutacion funciones que crean los vecindarios

vadyacente <- function(permutacion){


n<-length(permutacion)
vecindario<-matrix(nrow = n-1,ncol = n)

for(i in 1:(n-1)){
aux<-permutacion
nuevo1<-permutacion[i]
nuevo2<-permutacion[i+1]
aux[i]<-nuevo2
aux[i+1]<-nuevo1
vecindario[i,]<-aux
}

return(vecindario)
}

vintercambio<-function(permutacion){
n<-length(permutacion)
vecindario<-matrix(permutacion,nrow = n*(n-1)/2,ncol = n,byrow = TRUE)
k<-0
for(i in 1:(n-1)){
for(j in (i+1):n){
k<-k+1
vecindario[k,i]<-permutacion[j]
vecindario[k,j]<-permutacion[i]

}
}
return(vecindario)
}

vinserccion <- function(permutacion){


library(R.methodsS3)
library(R.utils)

2
n<-length(permutacion)
vecindario<-matrix(0,nrow = (n-1)^2, ncol=n)

i<-1
while (i<=(n-1)^2) {
for(j in 1:n){
for(k in 1:n){
if(j<k){
vecindario[i,]<-append(permutacion[-j],permutacion[j],after=(k-1))
i<-i+1
}
if(j>(k+1)){
vecindario[i,]<-append(permutacion[-j],permutacion[j],after=(k-1))
i<-i+1
}
}
}
}
return(vecindario)
}

#dado un problema LOP se comprueba si una permutacion es optimo local con la


#caracterizacion de la seccion 2.3 seg<U+663C><U+3E61>n los tres vecindarios

is.AdyOptimal<-function(matriz,perumtacion){
n<-length(permutacion)
suma1<-0
suma2<-0
for (i in 1:(n-1)){
suma1<-suma1+matriz[permutacion[i],perumtacion[i+1]]
suma2<-suma2+matriz[perumtacion[i+1],permutacion[i]]
}
if(suma1>=suma2){
return(TRUE)
}
else {return(FALSE)}
}

is.IntOptimal<-function(matriz,permutacion){
n<-length(permutacion)
suma1<-0
suma2<-0
suma3<-0
suma4<-0
for (i in 1:(n-1)) {
for (j in (i+1):n) {
suma1<-suma1+matriz[permutacion[i],permutacion[j]]
suma2<-suma2+matriz[permutacion[j-1],permutacion[i]]
suma3<-suma3+matriz[permutacion[j],permutacion[i]]
suma4<-suma4+matriz[permutacion[i],permutacion[j-1]]

3
}
if(suma1+suma3>=suma2+suma4){
return(TRUE)
}
else {return(FALSE)
}
}

is.InsOptimal<-function(matriz,permutacion){
n<-length(permutacion)
suma1<-0
suma2<-0
for (i in 1:(n-1)){
for(j in (i+1):n){
suma1<-suma1+matriz[permutacion[i],permutacion[j]]
suma2<-suma2+matriz[permutacion[j],permutacion[i]]
}
}
if(suma1<=suma2){
return(FALSE)
}
suma1<-0
suma2<-0
for (i in 3:n){
for(j in 1:(i-2)){
suma1<-suma1+matriz[permutacion[j],permutacion[i]]
suma2<-suma2+matriz[permutacion[i],permutacion[j]]
}
}
if(suma1>=suma2){
return(TRUE)
}
}

4
geneticoLOP <- function(matriz, popSize, numPadres, pm, numIteraciones, cruce = 1, mutacion = 1){

#matriz: es la matriz del problema.


#popSize: es la cantidad de cromosomas.
#numPadres: es la cantidad de cromosomas padres que se escogen para el torneo.
#pm: es la probabilidad de mutacion.
#numIteraciones: es el criterio de parada.
#cruce (por defecto = 1): es el tipo de cruce que se quiere usar. 1 cruce de orden, 2 parcialmente map
#mutacion (por defecto = 1): es el tipo de mutaci?n que se va a querer usar: 1 intercambio, 2 insercio

library(dplyr)
library(tidyr)
library(magrittr)
#Si el numero de padres es impar, restamos 1 para que no haya conflicto en el torneo.

if (numPadres%%2==1) numPadres <- numPadres-1

#Tama?o de las permutaciones.

permuSize <- dim(matriz)[1]

#Poblacion inicial.

poblacion <- matrix(0,nrow=popSize,ncol=permuSize)


fitness <- matrix(0,nrow=popSize,ncol=1)

for(i in 1:popSize){
poblacion[i,] <- sample(1:permuSize,permuSize)#sample para aleatoriedad
fitness[i] <- funcionObjetivoLOP(matriz,poblacion[i,])
}

#bucle principal. Criterio de parada: numero de iteraciones


for(jj in 1:numIteraciones){
matrizHijos <- matrix(0,nrow=numPadres,ncol=permuSize)
for (kk in 1:(numPadres/2))
{
#Seleccion de padres torneo (cojo 2 y me quedo con el mejor, dos veces)
quienes<-sample(1:popSize,2)
candidato1 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

quienes<-sample(1:popSize,2)
candidato2 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

#Cruce de orden
if (cruce == 1){
hijos <- cruce(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}
#Cruce parcialmente mapped
else if (cruce == 2){
hijos <- cruce2(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}

#mutacion por intercambio

1
if (mutacion == 1){
hijos <- mutacion1(hijos,pm,permuSize)
}
#mutacion por inserci?n
else if (mutacion == 2){
hijos <- mutacion2(hijos,pm,permuSize)
}
#mutacion por inversi?n
else if (mutacion == 3){
hijos <- mutacion3(hijos,pm,permuSize)
}
#mutacion por scramble
else if (mutacion == 4){
hijos <- mutacion4(hijos,pm,permuSize)
}

#Guardo los hijos


matrizHijos[((kk-1)*2+1):((kk-1)*2+2),] <- hijos
}

#Evaluacion de hijos
fitnessHijos <- matrix(0,nrow=numPadres,ncol=1)

for(i in 1:numPadres){
fitnessHijos[i] <- funcionObjetivoLOP(matriz, matrizHijos[i,])
}

#Seleccion supervivientes
res <- supervivientes(poblacion,fitness,matrizHijos,fitnessHijos,popSize,permuSize,numPadres)
poblacion <- res$pob
fitness <- res$fit

#imprime info
#print(sprintf("%2.0f) min= %3.0f max =%3.0f, media=%3.1f",jj,min(fitness),max(fitness),mean(fitness
#if(max(fitness)==(permuSize*(permuSize-1)/2)) break

#Resultado final
i <- which.max(fitness)
return(list("fitness"=fitness[i],"individuo"=poblacion[i,]))
#return(poblacion[i,])

2
cruce <- function(individuo1, individuo2,permuSize){

# cruce de orden
hijo1 <- rep(0,permuSize)
hijo2 <- rep(0,permuSize)

pos <- sort(sample(1:permuSize,2))


hijo1[pos[1]:pos[2]] <- individuo1[pos[1]:pos[2]]
hijo2[pos[1]:pos[2]] <- individuo2[pos[1]:pos[2]]

#construyo hijo 1
if (pos[2]<permuSize){
k<-pos[2]+1
for (j in (pos[2]+1):permuSize){

if (!(individuo2[j] %in% hijo1)){


hijo1[k] <- individuo2[j]
k <- k+1
if (k>permuSize) k <- 1
}
}
for (j in (1:(pos[2]))){

if (!(individuo2[j] %in% hijo1)){


hijo1[k] <- individuo2[j]
k <- k+1
if (k>permuSize) k <- 1
}
}
} else {
k <- 1
for (j in (1:(pos[2]))){
if (!(individuo2[j] %in% hijo1)){
hijo1[k] <- individuo2[j]
k <- k+1
if (k>permuSize) k <- 1
}
}

#construyo hijo 2

if (pos[2]<permuSize){
k<-pos[2]+1
for (j in (pos[2]+1):permuSize){
if (!(individuo1[j] %in% hijo2)){
hijo2[k] <- individuo1[j]
k <- k+1
if (k>permuSize) k <- 1
}
}

1
for (j in (1:(pos[2]))){
if (!(individuo1[j] %in% hijo2)){
hijo2[k] <- individuo1[j]
k <- k+1
if (k>permuSize) k <- 1
}
}
} else {
k <- 1
for (j in (1:(pos[2]))){
if (!(individuo1[j] %in% hijo2)){
hijo2[k] <- individuo1[j]
k <- k+1
if (k>permuSize) k <- 1
}
}
}
hijos<-matrix(c(hijo1,hijo2),ncol=permuSize,byrow=T)

return(hijos)
}

cruce2 <- function(individuo1, individuo2,permuSize){

# cruce parcialmente mapped


hijo1 <- rep(0,permuSize)
hijo2 <- rep(0,permuSize)

pos <- sort(sample(1:permuSize,2))


hijo1[pos[1]:pos[2]] <- individuo1[pos[1]:pos[2]]
hijo2[pos[1]:pos[2]] <- individuo2[pos[1]:pos[2]]

#construyo hijo 1

#Primero a?adimos los que no estan en el padre 2 en el intervalo entre posiciones.


for (k in pos[1]:pos[2]){
if (!individuo2[k] %in% individuo1[pos[1]:pos[2]]){
auxiliar <- individuo1[k]
while (auxiliar %in% individuo2[pos[1]:pos[2]]){
posicion <- which(individuo2 == auxiliar)
auxiliar <- individuo1[posicion]
}
posicion <- which(individuo2 == auxiliar)
hijo1[posicion] <- individuo2[k]
}
}
#Ahora a?adimos los restantes a partir del final de la posici?n 2
pos2 = pos[2]
for (j in 1:permuSize){
for (i in 1:permuSize){

2
valor <- (pos2 + j)%%permuSize
if ( valor== 0){
valor <- permuSize
}
valor2 <- (pos2 + i)%%permuSize
if ( valor2== 0){
valor2 <- permuSize
}
if (hijo1[valor] == 0 & !individuo2[valor2] %in% hijo1){
hijo1[valor] <- individuo2[valor2]
}
}
}
#construyo hijo 2

#Primero a?adimos los que no estan en el padre 2 en el intervalo entre posiciones.


for (k in pos[1]:pos[2]){
if (!individuo1[k] %in% individuo2[pos[1]:pos[2]]){
auxiliar <- individuo2[k]
while (auxiliar %in% individuo1[pos[1]:pos[2]]){
posicion <- which(individuo1 == auxiliar)
auxiliar <- individuo2[posicion]
}
posicion <- which(individuo1 == auxiliar)
hijo2[posicion] <- individuo1[k]
}
}
#Ahora a?adimos los restantes a partir del final de la posici?n 2
pos2 = pos[2]
for (j in 1:permuSize){
for (i in 1:permuSize){
valor <- (pos2 + j)%%permuSize
if ( valor== 0){
valor <- permuSize
}
valor2 <- (pos2 + i)%%permuSize
if ( valor2== 0){
valor2 <- permuSize
}
if (hijo2[valor] == 0 & !individuo1[valor2] %in% hijo2){
hijo2[valor] <- individuo1[valor2]
}
}
}
hijos<-matrix(c(hijo1,hijo2),ncol=permuSize,byrow=T)

return(hijos)
}

3
mutacion1 <- function(hijos,pm,permuSize)
{
# Mutacion por intercambio
for(i in 1:2){
if(runif(1)<pm){
pos <- sample(1:permuSize,2)
#hacer el cruce
guardar <- hijos[i,pos[1]]
hijos[i,pos[1]] <- hijos[i,pos[2]]
hijos[i,pos[2]] <- guardar
}
}
return(hijos)
}

mutacion2 <- function(hijos,pm,permuSize)


{
# Mutacion por insercion
for(i in 1:2){ # del 1 al 2 porque hay dos hijos
if(runif(1)<pm){ #runif(b)= numero aleatorio entre 0 y b
pos <- sample(1:permuSize,2)
#hijo i
guardo1<-hijos[i,pos[1]]

guardo3<-hijos[i,pos[2]]
if (pos[2]>pos[1]+1){
guardo2<-hijos[i,(pos[1]+1):(pos[2]-1)]
hijos[i,(pos[1]+2):pos[2]]<-guardo2
hijos[i,pos[1]+1]<-guardo3
}
if (pos[1]>pos[2]+1){
guardo2<-hijos[i,(pos[2]+1):(pos[1]-1)]
hijos[i, (pos[2]):(pos[1]-2)]<-guardo2
hijos[i, pos[1]-1]<-guardo3
hijos[i, pos[1]]<-guardo1
}
}
}
return(hijos)
}

mutacion3 <- function(hijos,pm,permuSize)


{
# Mutacion por inversion
for(i in 1:2){ # del 1 al 2 porque hay dos hijos
if(runif(1)<pm){ #runif(b)= numero aleatorio entre 0 y b
pos <- sample(1:permuSize,2)
pos<-sort(pos)
#hijo i
guardo1<-hijos[i, pos[1]:pos[2]]
guardo1<-rev(guardo1)

1
hijos[i, pos[1]:pos[2]]<-guardo1
}
}
return(hijos)
}

mutacion4 <- function(hijos,pm,permuSize)


{
# Mutacion por scramble
for(i in 1:2){ # del 1 al 2 porque hay dos hijos
if(runif(1)<pm){ #runif(b)= numero aleatorio entre 0 y b
pos <- sample(1:permuSize,2)
pos<-sort(pos)
#hijo i
guardo1<-hijos[i, pos[1]:pos[2]]
guardo1<-sample(guardo1)
hijos[i, pos[1]:pos[2]]<-guardo1
}
}
return(hijos)
}

2
supervivientes <- function(poblacion,fitness,matrizHijos,fitnessHijos,popSize,permuSize,numPadres)
{
# Seleccion elitista: los mejores
generacionActual <- matrix(0,nrow=popSize+numPadres,ncol=permuSize)
generacionActual[1:popSize,] <- poblacion
generacionActual[(popSize+1):(popSize+numPadres),] <- matrizHijos

fitnessGeneracion <- c(fitness,fitnessHijos)

orden <- order(fitnessGeneracion,decreasing =T)


poblacionOrdenada <- generacionActual[orden[1:popSize],]
fitnessOrdenada <- fitnessGeneracion[orden[1:popSize]]

return(list("pob"=poblacionOrdenada,"fit"=fitnessOrdenada))

1
Apéndice E. Implementación 95

E.4. Nuevos métodos heurı́sticos


En esta sección se recoge el código de las funciones para el desarrollo del nuevo
método heurı́stico del Capı́tulo 5. Además también se recogen algunas ideas de
heurı́sticos que no han sido considerados en el Capı́tulo 5 por su falta de eficacia
y/o bondad de ajuste para el ejemplo probado. Las funciones que se describen a
continuación hacen uso de otras funciones descritas en las secciones anteriores.

E.4.1. Heurı́sticos no recogidos en el Capı́tulo 5


En primer lugar se desarrollan algunas ideas de algoritmos heurı́sticos cuyos re-
sultados no han sido los esperados, bien por falta de eficacia, o bien por falta de
optimalidad para el ejemplo en el que han sido probados.

AG con restricciones
En este primer algoritmo se buscaba combinar la eficacia de los algoritmos genéticos
y la exactitud del método basado en los caminos hamiltonianos del digrafo óptimo
descrito en el Capı́tulo 3.
En primer lugar un algoritmo genético con restricciones aunque el LOP no tie-
ne restricciones se le agrega la restricción de que todos los puntos factibles (tanto
los escogidos como población inicial como los generados mediante cruce y muta-
ción) sean caminos hamiltonianos del grafo óptimo que se construye con la función
descrita en la Sección E.2. Vista la ineficacia de esta función también se probó
modificándolo para que la restricción de ser camino hamiltoniano sólo afectara a la
población inicial y después que sólo afectara a los puntos factibles generados por
cruce y mutación, aún ası́ la función siguió resultando ineficaz. A pesar de que los
algoritmos genéticos son muy eficaces, la restricción impuesta hace que la ejecución
sea muy ineficaz y el algoritmo necesite más tiempo de ejecución que un método
exacto.

AG con diferentes valores de funciones objetivo


Vista la ineficacia que genera el uso de la restricción de ser camino hamiltoniano
del grafo óptimo, se descarta el algoritmo anterior y se propone otro buscando la
idea de valorar más aquellos puntos factibles que sean caminos hamiltonianos del
grafo óptimo. Para ello, se programa un algoritmo genético que otorga a cada punto
factible utilizado en el algoritmo valores diferentes del fitness en función de si el
punto es o no camino hamiltoniano. En el caso recogido a continuación se adjudica
como valor de función objetivo 0 si no es camino hamiltoniano y el valor de función
objetivo en caso de que si sea camino hamiltoniano. Este algoritmo dio resultados
realmente malos para el ejemplo en el que se aplicó, peores que la búsqueda local.

AG modificando la matriz LOP


Dada la falta de optimalidad o de eficacia de los algoritmos anteriores para los
ejemplos resueltos, se busca un tercer heurı́stico que mejore los resultados de los
96 E.4. Nuevos métodos heurı́sticos

algoritmos anteriores. Para ello, se programa un algoritmo que, en primer lugar,


construya una matriz de pesos. En segundo lugar, se aplica un algoritmo genético
sobre la matriz de pesos cuya función objetivo es el peso del camino hamiltoniano
del grafo óptimo. Por último, se selecciona el punto factible con mejor fitness y
se utiliza para calcular el valor de función objetivo del LOP de la matriz original.
Dada B ∈ M atn×n (R) la matriz de un LOP, se probarán tres matrices de pesos
o ponderaciones para las aristas del digrafo óptimo, a cada arista (i, j) del grafo
óptimo asociado D = (V, A′ ) se le hace corresponder un peso pij que se recoge en
una matriz de pesos P ∈ M atn×n (R) y se construye de la siguiente manera:

(i)
1, si(i, j) ∈ A′
P ∈ M atn×n (R) = {
0, si(i, j) ∈/ A′

En este caso todas las aristas pertenecientes al digrafo óptimo tienen el mismo
valor.

(ii)
b , si(i, j) ∈ A′
P ∈ M atn×n (R) = { ij
0, si(i, j) ∈/ A′

En este caso, las aristas del digrafo óptimo tienen pesos diferentes en función
de la entrada matriz original. Ası́, las entradas de la matriz original con mayor
valor, también tendrán un mayor peso en la matriz de pesos.

(iii)
bij − bji , si(i, j) ∈ A′
P ∈ M atn×n (R) = {
0, si(i, j) ∈/ A′

En tercer lugar, esta ponderación también tiene en cuenta el valor de las


entradas de la matriz original, pero además, calcula la diferencia entre las
parejas simétricamente localizadas. Esto hace que se tenga en cuenta cuánto
más se aporta a la función objetivo si se elige la arista (i, j) frente a la (j, i).
Además, en caso de empates, el valor es cero.

Estas matrices de pesos tienen la particularidad de que contienen un mayor


número de entradas nulas, pues recogen los pesos de las aristas del grafo óptimo y
en caso que una arista no pertenezca al grafo óptimo, se le otorga el valor cero. Des
este modo se buscaba construir un algoritmo que convergiera más rápido hacia una
buena solución y seleccionara con mayor probabilidad los óptimos locales ya que
entre estos se encontrará el óptimo global. No obstante, este algoritmo tampoco
dio los resultados esperados pues muchos de los caminos hamiltonianos tenı́an el
mismo peso y sin embargo, el valor de función objetivo del LOP no era el mismo.
De este modo el algoritmo aportaba la misma relevancia a dos puntos factibles que
diferı́an en su fitness, consecuentemente el algoritmo no convergı́a de forma correcta.

Además de las tres ideas de algoritmos propuestos, se testearon algunas otras


ideas que tenı́an como base los algoritmos anteriores. También se probaron algunas
combinaciones y modificaciones de los tres algoritmos anteriores, pero en ninguno
de los casos se consiguieron los resultados esperados.
Apéndice E. Implementación 97

E.4.2. Heurı́stico propuesto en el Capı́tulo 5


Este algoritmo es el que mejor equilibrio ha conseguido entre optimalidad/robustez
y eficacia. La función requiere de los siguientes parámetros de entrada: la matriz del
LOP, el tamaño de la población inicial, el número de individuos seleccionados en
cada iteración, el número de iteraciones -supondrá el criterio de parada-, un cruce
-a elegir entre 1:cruce de orden y 2:parcialmente mapped - y un vecindario -a elegir
entre 1:adyacente, 2:intercambio y 3:inserción-. Si el tipo de cruce y de vecindario no
se especifican, se tomarán por defecto el cruce de orden y el vecindario adyacente.
En primer lugar el algoritmo comienza eligiendo los puntos factibles que forman
la población inicial de forma aleatoria, estos se evalúan según la función objetivo
del LOP y se escogen aquellos cuyo fitness es mayor. A continuación, comienza la
fase de iteración. En cada iteración se somete a los puntos factibles a un cruce, tras
ello se comprueba si los nuevos puntos factibles son óptimos locales del vecindario
escogido. Si el punto factible es óptimo local no se altera, si no lo es, se le aplica una
búsqueda local. Generados los nuevos puntos factibles se evalúan y se seleccionan
los que van a pasar a la siguiente iteración de entre los nuevos generados y los
de la iteración anterior. Este algoritmo es elitista, esto es, los puntos factibles que
pasan a la siguiente iteración son aquellos cuyo valor de función objetivo es mayor.
Una vez finalizadas las iteraciones, se devuelve el mayor valor de función objetivo
conseguido en la última iteración -o equivalentemente, el mayor valor de función
objetivo conseguido durante todo el proceso- junto con el punto factible con el que
se obtiene dicho valor.
geneticohamiltoniano<-function(matrizLOP, popSize, numPadres, pm, numIteraciones, cruce = 1, mutacion =

#matrizLOP: es la matriz del problema.


#popSize: es la cantidad de individuos.
#numPadres: es la cantidad de individuos padres que se escogen para el torneo.
#pm: es la probabilidad de mutacion.
#numIteraciones: es el criterio de parada.
#cruce (por defecto = 1): es el tipo de cruce que se quiere usar.
# 1 cruce de orden, 2 parcialmente mapped.
#mutacion (por defecto = 1): es el tipo de mutacion que se va a querer usar
# 1 intercambio, 2 insercion, 3 inversion, 4 scramble.

library(dplyr)
library(tidyr)
library(magrittr)
#Si el numero de padres es impar, restamos 1 para que no haya conflicto.

if (numPadres%%2==1) numPadres <- numPadres-1

#Tama<U+663C><U+3E31>o de las permutaciones.

permuSize <- dim(matriz)[1]

#Poblacion inicial.

poblacion <- matrix(0,nrow=popSize,ncol=permuSize)


fitness <- matrix(0,nrow=popSize,ncol=1)
grafo<-grafonoponderado(matrizLOP)$grafo
matriz<-grafonoponderado(matrizLOP)$grafomatriz
i<-1
while (i!=popSize) {
i<-i+1
print(i)
ind<-sample(1:permuSize,permuSize)
if(is.hamiltonian(grafo,ind)==TRUE){
poblacion[i,] <-ind #sample para aleatoriedad
fitness[i,] <- funcionObjetivoGrafo(matriz,ind)

}
}
prueba<-0
#bucle principal. Criterio de parada: numero de iteraciones
for(jj in 1:numIteraciones){
print(jj)
matrizHijos <- matrix(0,nrow=numPadres,ncol=permuSize)
kk<-0
while (kk!=numPadres/2){
#Seleccion de padres torneo (cojo 2 y me quedo con el mejor, dos veces)
quienes<-sample(1:popSize,2)
candidato1 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

quienes<-sample(1:popSize,2)
candidato2 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

1
#Cruce de orden
if (cruce == 1){
hijos <- cruce(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}
#Cruce parcialmente mapped
else if (cruce == 2){
hijos <- cruce2(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}

#mutacion por intercambio


if (mutacion == 1){
hijos <- mutacion1(hijos,pm,permuSize)
}
#mutacion por inserci?n
else if (mutacion == 2){
hijos <- mutacion2(hijos,pm,permuSize)
}
#mutacion por inversi?n
else if (mutacion == 3){
hijos <- mutacion3(hijos,pm,permuSize)
}
#mutacion por scramble
else if (mutacion == 4){
hijos <- mutacion4(hijos,pm,permuSize)
}
prueba<-prueba+1
print(prueba)
cond1<-is.hamiltonian(grafo,hijos[1])
cond2<-is.hamiltonian(grafo,hijos[2])
#Guardo los hijos
if(c(cond1,cond2)==c(TRUE,TRUE) ){

matrizHijos[((kk-1)*2+1):((kk-1)*2+2),] <- hijos


kk<-kk+1
print(kk)
}

#Evaluacion de hijos
fitnessHijos <- matrix(0,nrow=numPadres,ncol=1)

for(i in 1:numPadres){
fitnessHijos[i] <- funcionObjetivoLOP(matrizLOP, matrizHijos[i,])
}

#Seleccion supervivientes
res <- supervivientes(poblacion,fitness,matrizHijos,fitnessHijos,popSize,permuSize,numPadres)
poblacion <- res$pob
fitness <- res$fit
}

#Resultado final

2
i <- which.max(fitness)
valor<-funcionObjetivoLOP(matrizLOP,poblacion[i,])
return(valor)

3
.

geneticoGrafo <- function(matrizgrafo, grafo, matrizLOP, popSize, numPadres, pm, numIteraciones, cruce =

#matrizLOP: es la matriz del problema.


#matrizgrafo: es la matriz de las ponderaciones del grafo optimo
#grafo: es el grafo optimo
#popSize: es la cantidad de cromosomas.
#numPadres: es la cantidad de cromosomas padres que se escogen para el torneo.
#pm: es la probabilidad de mutacion.
#numIteraciones: es el criterio de parada.
#cruce (por defecto = 1): es el tipo de cruce que se quiere usar. 1 cruce de orden, 2 parcialmente map
#mutacion (por defecto = 1): es el tipo de mutaci?n que se va a querer usar: 1 intercambio, 2 insercio

library(dplyr)
library(tidyr)
library(magrittr)
#Si el numero de padres es impar, restamos 1 para que no haya conflicto en el torneo.

if (numPadres%%2==1) numPadres <- numPadres-1

#Tama?o de las permutaciones.

permuSize <- dim(matrizgrafo)[1]

#Poblacion inicial.

poblacion <- matrix(0,nrow=popSize,ncol=permuSize)


fitness <- matrix(0,nrow=popSize,ncol=1)

for(i in 1:popSize){
poblacion[i,] <- sample(1:permuSize,permuSize)#sample para aleatoriedad
if(is.hamiltonian(grafo,poblacion[i,])==TRUE){
fitness[i] <- funcionObjetivoGrafo(matrizgrafo,poblacion[i,])
}
}

#bucle principal. Criterio de parada: numero de iteraciones


for(jj in 1:numIteraciones){
matrizHijos <- matrix(0,nrow=numPadres,ncol=permuSize)
for (kk in 1:(numPadres/2))
{
#Seleccion de padres torneo (cojo 2 y me quedo con el mejor, dos veces)
quienes<-sample(1:popSize,2)
candidato1 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

quienes<-sample(1:popSize,2)
candidato2 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

#Cruce de orden
if (cruce == 1){
hijos <- cruce(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}
#Cruce parcialmente mapped

1
else if (cruce == 2){
hijos <- cruce2(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}

#mutacion por intercambio


if (mutacion == 1){
hijos <- mutacion1(hijos,pm,permuSize)
}
#mutacion por inserci?n
else if (mutacion == 2){
hijos <- mutacion2(hijos,pm,permuSize)
}
#mutacion por inversi?n
else if (mutacion == 3){
hijos <- mutacion3(hijos,pm,permuSize)
}
#mutacion por scramble
else if (mutacion == 4){
hijos <- mutacion4(hijos,pm,permuSize)
}

#Guardo los hijos


matrizHijos[((kk-1)*2+1):((kk-1)*2+2),] <- hijos
}

#Evaluacion de hijos
fitnessHijos <- matrix(0,nrow=numPadres,ncol=1)

for(i in 1:numPadres){
if(is.hamiltonian(grafo,matrizHijos[i,])==TRUE){
fitnessHijos[i] <- funcionObjetivoGrafo(matrizgrafo, matrizHijos[i,])
}else {fitnessHijos[i]<-0}
}

#Seleccion supervivientes
res <- supervivientes(poblacion,fitness,matrizHijos,fitnessHijos,popSize,permuSize,numPadres)
poblacion <- res$pob
fitness <- res$fit

#imprime info
#print(sprintf("%2.0f) min= %3.0f max =%3.0f, media=%3.1f",jj,min(fitness),max(fitness),mean(fitness
#if(max(fitness)==(permuSize*(permuSize-1)/2)) break

#Resultado final
i <- which.max(fitness)
valor<-funcionObjetivoLOP(matrizLOP,poblacion[i,])
return(list("fitnessgrafo"=fitness[i],"fitnessmatriz"=valor, "individuo"=poblacion[i,]))
#return(poblacion[i,])

2
geneticoponderado <- function( matrizLOP, popSize, numIteraciones, mutacion = 1,ponderaciæŸãÿşn =0){

#matrizLOP: es la matriz del problema.


#popSize: es la cantidad de individuos.
#numPadres: es la cantidad de individuos padres que se escogen para el torneo.
#pm: es la probabilidad de mutacion.
#numIteraciones: es el criterio de parada.
#cruce (por defecto = 1): es el tipo de cruce que se quiere usar.
# 1 cruce de orden, 2 parcialmente mapped.
#mutacion (por defecto = 1): es el tipo de mutacion que se va a querer usar
# 1 intercambio, 2 insercion, 3 inversion, 4 scramble.
#ponderacion (por defecto = 0): es el tipo de matriz de pesos que se construiræŤãÿś
# 0 (i), 1 (ii), 2(iii) de la subsecciæŸãÿşn 5.1.2

library(dplyr)
library(tidyr)
library(magrittr)
#Si el numero de padres es impar, restamos 1 para que no haya conflicto en el torneo.

if(ponderaciæŸãÿşn==0){
grafovalores<-grafonoponderado(matrizLOP)
grafo<-grafovalores$grafo
matrizgrafo<-grafovalores$grafomatriz
}
if(ponderaciæŸãÿşn==1){
grafovalores<-grafoponderado1(matrizLOP)
grafo<-grafovalores$grafo
matrizgrafo<-grafovalores$grafomatriz
}
if(ponderaciæŸãÿşn==2){
grafovalores<-grafoponderado2(matrizLOP)
grafo<-grafovalores$grafo
matrizgrafo<-grafovalores$grafomatriz
}

if (popSize%%2==1) popSize <- popSize-1


#Tama?o de las permutaciones.

permuSize <- dim(matrizgrafo)[1]

#Poblacion inicial.

poblacion <- matrix(0,nrow=popSize,ncol=permuSize)


fitness <- matrix(0,nrow=popSize,ncol=1)

for(i in 1:popSize){
poblacion[i,] <- sample(1:permuSize,permuSize)#sample para aleatoriedad
fitness[i] <- pesocamino(matrizgrafo,poblacion[i,])/2

#bucle principal. Criterio de parada: numero de iteraciones

1
for(kk in 1:numIteraciones){
matrizHijos <- matrix(0,nrow=numPadres,ncol=permuSize)
for (kk in 1:(numPadres/2))
{
#Seleccion de padres torneo (cojo 2 y me quedo con el mejor, dos veces)
quienes<-sample(1:popSize,2)
candidato1 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

quienes<-sample(1:popSize,2)
candidato2 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

#Cruce de orden
if (cruce == 1){
hijos <- cruce(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}
#Cruce parcialmente mapped
else if (cruce == 2){
hijos <- cruce2(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}
#mutacion por intercambio
if (mutacion == 1){
hijos <- mutacion1(hijos,1,permuSize)
}
#mutacion por inserci?n
else if (mutacion == 2){
hijos <- mutacion2(hijos,1,permuSize)
}
#mutacion por inversi?n
else if (mutacion == 3){
hijos <- mutacion3(hijos,1,permuSize)
}
#mutacion por scramble
else if (mutacion == 4){
hijos <- mutacion4(hijos,1,permuSize)
}

#Guardo los hijos


matrizHijos[2*(jj)-1,] <- hijos[1,]
matrizHijos[2*(jj),] <- hijos[2,]

}
#Evaluacion de hijos
fitnessHijos <- matrix(0,nrow=popSize,ncol=1)

for(i in 1:popSize){
fitnessHijos[i,1] <- pesocamino(matrizgrafo, matrizHijos[i,])
}
#Seleccion supervivientes
res <- supervivientes(poblacion,fitness,matrizHijos,fitnessHijos,popSize,permuSize,popSize)
poblacion <- res$pob
fitness <- res$fit
}

2
#Resultado final
i <- which.max(fitness)
valor<-funcionObjetivoLOP(matrizLOP,poblacion[i,])
return(list("fitnessgrafo"=fitness[i,],"fitnessmatriz"=valor, "individuo"=poblacion[i,]))
}

3
combinacionAGLocal <- function( matrizLOP, popSize,numPadres, numIteraciones, cruce = 1,vecindario=1){
#matrizLOP: es la matriz del problema.
#popSize: es la cantidad de individuos.
#numPadres: es la cantidad de individuos padres que se escogen para el torneo.
#numIteraciones: es el criterio de parada.
#cruce (por defecto = 1): es el tipo de cruce que se quiere usar.
# 1 cruce de orden, 2 parcialmente mapped.
#vecindario: escogido para la b.local
# 1-adyacente, 2-intercambio, 3-insecci<U+663C><U+3E33>n
library(dplyr)
library(tidyr)
library(magrittr)

#Si el numero de padres es impar, restamos 1 para que no haya conflicto en el torneo
if (numPadres%%2==1) numPadres <- numPadres-1

#Tama<U+663C><U+3E31>o de las permutaciones.

permuSize <- dim(matrizLOP)[1]

#Poblacion inicial.

poblacion <- matrix(0,nrow=popSize,ncol=permuSize)


fitness <- matrix(0,nrow=popSize,ncol=1)

for(i in 1:popSize){
poblacion[i,] <- sample(1:permuSize,permuSize)#sample para aleatoriedad
fitness[i] <- funcionObjetivoLOP(matrizLOP, poblacion[i,])
}

#bucle principal. Criterio de parada: numero de iteraciones


for(jj in 1:numIteraciones){
print(jj)
matrizHijos <- matrix(0,nrow=numPadres,ncol=permuSize)
for (kk in 1:(numPadres/2))
{
#Seleccion de padres torneo (cojo 2 y me quedo con el mejor, dos veces)
quienes<-sample(1:popSize,2)
candidato1 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

quienes<-sample(1:popSize,2)
candidato2 <- quienes[order(fitness[quienes],decreasing = TRUE)[1]]

#Cruce de orden
if (cruce == 1){
hijos <- cruce(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}
#Cruce parcialmente mapped
else if (cruce == 2){
hijos <- cruce2(poblacion[candidato1,],poblacion[candidato2,],permuSize)
}

if(vecindario==1) {

1
for (i in 1:2){
if(isFALSE(is.AdyOptimal(matrizLOP,hijos[i,]))){
hijos[i,]<-localLOP(matrizLOP,hijos[i,],1)$permutacion
}
}
}
else if(vecindario == 2) {
for (i in 1:2){
if(isFALSE(is.IntOptimal(matrizLOP,hijos[i,]))){
hijos[i,]<-localLOP(matrizLOP,hijos[i,],2)$permutacion
}
}
}
else if(vecindario == 3) {
for (i in 1:2){
if(isFALSE(is.InsOptimal(matrizLOP,hijos[i,]))){
hijos[i,]<-localLOP(matrizLOP,hijos[i,],3)$permutacion
}
}
}

#Guardo los hijos


matrizHijos[((kk-1)*2+1):((kk-1)*2+2),] <- hijos
}

#Evaluacion de hijos
fitnessHijos <- matrix(0,nrow=numPadres,ncol=1)

for(i in 1:numPadres){
fitnessHijos[i] <- funcionObjetivoLOP(matrizLOP, matrizHijos[i,])
}

#Seleccion supervivientes
res <- supervivientes(poblacion,fitness,matrizHijos,fitnessHijos,popSize,permuSize,numPadres)
poblacion <- res$pob
fitness <- res$fit

#imprime info
#print(sprintf("%2.0f) min= %3.0f max =%3.0f, media=%3.1f",jj,min(fitness),max(fitness),mean(fitness
#if(max(fitness)==(permuSize*(permuSize-1)/2)) break

#Resultado final
i <- which.max(fitness)
valor<-funcionObjetivoLOP(matrizLOP,poblacion[i,])
return(list("fitnessmatriz"=valor, "individuo"=poblacion[i,]))
#return(poblacion[i,])

2
108 E.5. Programa

E.5. Programa
Por último, se recoge el programa que se ha utilizado para evaluar todas las fun-
ciones anteriormente descritas, compararlas y posteriormente analizar y comprobar
su robustez, optimalidad y eficacia.
source("C:/Users/Usuario/Desktop/tfm/exhaustivoLOP.R")
source("C:/Users/Usuario/Desktop/tfm/funcionObjetivoLOP.R")
source("C:/Users/Usuario/Desktop/tfm/grafo.R")
source("C:/Users/Usuario/Desktop/tfm/localLOP.R")
source("C:/Users/Usuario/Desktop/tfm/geneticoLOP.R")
source("C:/Users/Usuario/Desktop/tfm/geneticoLOPv2.R")
source("C:/Users/Usuario/Desktop/tfm/cruce.R")
source("C:/Users/Usuario/Desktop/tfm/mutacion.R")
source("C:/Users/Usuario/Desktop/tfm/supervivientes.R")
source("C:/Users/Usuario/Desktop/tfm/geneticoLOPv3.R")
source("C:/Users/Usuario/Desktop/tfm/combinacionAGLocal.R")
setwd("C:/Users/Usuario/Desktop/tfm")

library(rlang)
library(tidyr)
set.seed(123)
matrizrand15<-matrix(sample(100,size=15*15,replace = TRUE),15,15)

################################################################################
############## RESOLUCION B.EXHAUSTIVA ####################################
################################################################################
#Resolucion de la matriz aleatoria de dimension 15
exhaustivoLOP(matrizrand15)

################################################################################
############## RESOLUCION GRAFOS OPTIMO #####################################
################################################################################
#Resolucion de la matriz aleatoria de dimension 15

grafo15<-grafonoponderado(matrizrand15)
plot(grafo15$grafo, layout=layout_with_kk, edge.color= "skyblue3")
grafovalorhamiltonianos<-hamiltonianos(matrizrand15,grafo15)

################################################################################
############## COMPARATIVA B.EXHAUSTIVA Vs GRAFO OPTIMO #####################
################################################################################
matrizTiemposExhaustivo <- matrix(0,nrow=7,ncol=11)
matrizTiemposHamil <- matrix(0,nrow=7,ncol=11)

#Bucle principal

for (i in 1:7){
for (j in 1:10){
#creamos matrices aleatorias para comparar cada dimension
matrizrandi<-matrix(sample(100,size=(i+3)*(i+3),replace = TRUE),i+3,i+3)
# Medimos el tiempo de ejecucion.

t <- proc.time()
solucionexhaustivo<-exhaustivoLOP(matrizrandi)$sol
t1 <- proc.time()-t

1
t1 <- t1
matrizTiemposExhaustivo[i,j] <- t1[3]

t <- proc.time()
grafocompleto<-grafonoponderado(matrizrandi)$grafo
solucionhamil<-hamiltonianos(matrizrandi,grafocompleto)
t1 <- proc.time()-t
matrizTiemposHamil[i,j] <- t1[3]
}
matrizTiemposExhaustivo[i,11]<-mean(matrizTiemposExhaustivo[i,])
matrizTiemposHamil[i,11]<-mean(matrizTiemposHamil[i,])
}

#crear fichero
write.csv(matrizTiemposExhaustivo,file = "matrizTiemposExhaustivo.csv")
write.csv(matrizTiemposHamil,file = "matrizTiemposHamil.csv")

################################################################################
############## RESOLUCION CON BUSQUEDA LOCAL ################################
################################################################################

#Resolucion de la matriz aleatoria de dimension 15

matrizFitnessLocal <- matrix(0,nrow=6,ncol=50)


matrizTiemposLocal<- matrix(0,nrow=3,ncol=50)
matrizIteracionesLocal<- matrix(0,nrow=3,ncol=50)
#Bucle principal

for(i in 1:3){
for (j in 1:50){
# Medimos el tiempo de ejecucion.
t <- proc.time()
local<-localLOP(matrizrand15,vecindario = i)
t1 <- proc.time()-t
solucion<-local$valor
iteraciones<-local$iteraciones

matrizFitnessLocal[i,j]<-solucion
matrizFitnessLocal[i+3,j]<-iteraciones
matrizTiemposLocal[i,j]<-t1[3]
}
}

#crear fichero
write.csv(matrizFitnessLocal,file = "matrizFitnessLocal.csv")
write.csv(matrizTiemposLocal,file = "matrizTiemposLocal.csv")

################################################################################
############## RESOLUCION CON AG ############################################
################################################################################

2
#######################Primer caso ############################################

#Resolucion de la matriz aleatoria de dimension 15

popSize <- 75
numPadres <- 20
pm <- 0.1
numIteraciones <- 100
ejecuciones <- 50

matrizFitness <- matrix(0,nrow=8,ncol=ejecuciones)


matrizTiempos <- matrix(0,nrow=8,ncol=1)

#Bucle principal

for (i in 1:2){
for (j in 1:4){

# Medimos el tiempo de ejecucion.

t <- proc.time()

for (k in 1:ejecuciones){
solucion1<-geneticoLOP(matrizrand15,popSize, numPadres, pm, numIteraciones, i, j)
fitness1<- solucion1$fitness
permutaciones1<-rbind(permutaciones,solucion1$individuos)
matrizFitness[(i-1)*4 + j, k] <- fitness1
}
t1 <- proc.time()-t
t1 <- t1/ejecuciones
matrizTiempos[(i-1)*4 + j] <- t1[3]
}
}

#crear fichero
write.csv(matrizFitness,file = "matrizFitnessAG1.csv")
write.csv(matrizTiempos,file = "matrizTiemposAG1.csv")

###################### Segundo caso ############################################

#Resolucion de la matriz aleatoria de dimension 15


popSize <- 100
numPadres <- 40
pm <- 0.05
numIteraciones <- 100
ejecuciones <- 50

matrizFitness2 <- matrix(0,nrow=8,ncol=ejecuciones)


matrizTiempos2 <- matrix(0,nrow=8,ncol=1)

#Bucle principal

3
for (i in 1:2){
for (j in 1:4){

# Medimos el tiempo de ejecucion.

t <- proc.time()

for (k in 1:ejecuciones){
solucion2<-geneticoLOP(matrizrand15,popSize, numPadres, pm, numIteraciones, i, j)
fitness2<- solucion2$fitness
permutaciones2<-rbind(permutaciones,solucion2$individuos)
matrizFitness2[(i-1)*4 + j, k] <- fitness2
}
t2 <- proc.time()-t
t2 <- t2/ejecuciones
matrizTiempos2[(i-1)*4 + j] <- t2[3]
}
}

#crear fichero
write.csv(matrizFitness2,file = "matrizFitnessAG2.csv")
write.csv(matrizTiempos2,file = "matrizTiemposAG2.csv")

#######################Tercer caso ############################################

#Resolucion de la matriz aleatoria de dimension 15


popSize <- 100
numPadres <- 40
pm <- 0.5
numIteraciones <- 100
ejecuciones <- 50

matrizFitness3 <- matrix(0,nrow=8,ncol=ejecuciones)


matrizTiempos3 <- matrix(0,nrow=8,ncol=1)

#Bucle principal

for (i in 1:2){
for (j in 1:4){

# Medimos el tiempo de ejecucion.

t <- proc.time()

for (k in 1:ejecuciones){
solucion3<-geneticoLOP(matrizrand15,popSize, numPadres, pm, numIteraciones, i, j)
fitness3<- solucion3$fitness
matrizFitness3[(i-1)*4 + j, k] <- fitness3
}
t3 <- proc.time()-t
t3 <- t3/ejecuciones

4
matrizTiempos3[(i-1)*4 + j] <- t3[3]

}
}

#crear fichero
write.csv(matrizFitness3,file = "matrizFitnessAG3.csv")
write.csv(matrizTiempos3,file = "matrizTiemposAG3.csv")

###############################################################################
#Como el tercer caso es el mejor, usamos estos parametros para ver los tiempos
#de ejecucion, la media y arpd en una matriz mas grande (dim=60) y aumentando
#las iteraciones. Solo con el cruce de orden y mutacion insercion

popSize <- 100


numPadres <- 40
pm <- 0.5
numIteraciones <- 100
ejecuciones <- 10

#cojemos una matriz mas grande 60x60 para resolverla


matrizk<-scan( "INPUT-OUTPUT-TABELLE 1970 ZU AB-WERK-PREISEN (INLAENDISCHE PRODUKTION).txt")
matrizk60<-matrix(data= matrizk ,nrow = 60, ncol = 60)

matrizFitnessk <- matrix(0,nrow=ejecuciones,ncol=20)


matrizTiemposk <- matrix(0,nrow=ejecuciones,ncol=1)

for (k in 1:ejecuciones){
numIteraciones<-numIteraciones+25*(k-1)
for (i in 1:20){
print(c(k,i))
t <- proc.time()
solucionk<-geneticoLOP(matrizk60,popSize, numPadres, pm, numIteraciones, 1, 2)
fitnessk<- solucionk$fitness
matrizFitnessk[k,i] <- fitnessk
}
t3 <- proc.time()-t
matrizTiemposk[k] <- t3[3]/20
}

#crear fichero
write.csv(matrizFitnessk,file = "matrizFitnessAGk12.csv")
write.csv(matrizTiemposk,file = "matrizTiemposAGk12.csv")

################################################################################
############## RESOLUCION HEURiSTICO FALLIDO ################################
################################################################################

#Resolucion de la matriz aleatoria de dimension 15


popSize <- 100

5
numPadres <- 40
pm <- 0.5
numIteraciones <- 100
ejecuciones <- 50

####primera ponderacion

matrizFitnessgrafo0 <- matrix(0,nrow=8,ncol=ejecuciones+5)


matrizFitnessgrafo0LOP <- matrix(0,nrow=8,ncol=ejecuciones+5)
matrizTiemposgrafo0 <- matrix(0,nrow=8,ncol=1)

#Bucle principal

for (i in 1:2){
for (j in 1:4){
print(j)
# Medimos el tiempo de ejecucion.

t <- proc.time()

for (k in 1:ejecuciones){
soluciongrafo0<-geneticoGrafo(matrizrand15,popSize, numPadres, pm, numIteraciones, i, j)
fitnessgrafo0<- soluciongrafo0$fitnessgrafo
matrizFitnessgrafo0[(i-1)*4 + j, k] <- fitnessgrafo0
fitnessgrafo0LOP<- soluciongrafo0$fitnessmatriz
matrizFitnessgrafo0LOP[(i-1)*4 + j, k] <- fitnessgrafo0LOP

}
t1 <- proc.time()-t
t1 <- t1/ejecuciones
matrizTiemposgrafo0[(i-1)*4 + j] <- t1[3]

}
}

#crear fichero
write.csv(matrizFitnessgrafo0,file = "matrizFitness_grafo0.csv")
write.csv(matrizTiemposgrafo0,file = "matrizTiempos_grafo0.csv")
write.csv(matrizFitnessgrafo0LOP,file = "matrizFitness_grafo0LOP.csv")

#####################################
####segunda ponderacion

matrizFitnessgrafo1 <- matrix(0,nrow=8,ncol=ejecuciones+5)


matrizTiemposgrafo1 <- matrix(0,nrow=8,ncol=1)
matrizFitnessgrafo1LOP <- matrix(0,nrow=8,ncol=ejecuciones+5)

#Bucle principal

6
for (i in 1:2){
for (j in 1:4){

# Medimos el tiempo de ejecucion.

t <- proc.time()

for (k in 1:ejecuciones){
soluciongrafo1<-geneticoGrafo(matrizrand15,popSize, numPadres, pm, numIteraciones, i, j)
fitnessgrafo1<- soluciongrafo1$fitnessgrafo
matrizFitnessgrafo1[(i-1)*4 + j, k] <- fitnessgrafo1
fitnessgrafo1LOP<- soluciongrafo1$fitnessmatriz
matrizFitnessgrafo1LOP[(i-1)*4 + j, k] <- fitnessgrafo1LOP
}

t1 <- proc.time()-t
t1 <- t1/ejecuciones
}
}

#crear fichero
write.csv(matrizFitnessgrafo1,file = "matrizFitness_grafo1.csv")
write.csv(matrizTiemposgrafo1,file = "matrizTiempos_grafo1.csv")
write.csv(matrizFitnessgrafo1LOP,file = "matrizFitness_grafo1LOP.csv")

#####################################
####tercera ponderacion

matrizFitnessgrafo2 <- matrix(0,nrow=8,ncol=ejecuciones+5)


matrizFitnessgrafo2LOP <- matrix(0,nrow=8,ncol=ejecuciones+5)
matrizTiemposgrafo2 <- matrix(0,nrow=8,ncol=1)

#Bucle principal

for (i in 1:2){
for (j in 1:4){

# Medimos el tiempo de ejecucion.

t <- proc.time()

for (k in 1:ejecuciones){
soluciongrafo2<-geneticoGrafo(matrizrand15,popSize, numPadres, pm, numIteraciones, i, j)
fitnessgrafo2<- soluciongrafo2$fitnessgrafo
matrizFitnessgrafo2[(i-1)*4 + j, k] <- fitnessgrafo2

7
fitnessgrafo2LOP<- soluciongrafo2$fitnessmatriz
matrizFitnessgrafo2LOP[(i-1)*4 + j, k] <- fitnessgrafo2LOP
}
t1 <- proc.time()-t
t1 <- t1/ejecuciones

}
}

#crear fichero
write.csv(matrizFitnessgrafo2,file = "matrizFitness_grafo2.csv")
write.csv(matrizTiemposgrafo2,file = "matrizTiempos_grafo2.csv")
write.csv(matrizFitnessgrafo2LOP,file = "matrizFitness_grafo2LOP.csv")

################################################################################
########################### HEURiSTICO BUENO ##############################
################################################################################

###################### Primer caso #############################################


#Resolucion de la matriz aleatoria de dimension 15
popSize <- 75
numPadres <- 20
numIteraciones <- 100
ejecuciones <- 50

matrizFitness <- matrix(0,nrow=6,ncol=ejecuciones)


matrizTiempos <- matrix(0,nrow=6,ncol=ejecuciones)

#Bucle principal
fila<-0
for (i in 1:2){
for (j in 1:3){
# Medimos el tiempo de ejecucion.
fila<-fila+1
for (k in 1:ejecuciones){
t <- proc.time()
solucion<-combinacionAGLocal( matrizrand15, popSize,numPadres, numIteraciones, cruce = i,vecindar
fitness<- solucion$fitnessmatriz
matrizFitness[fila , k] <- fitness
t1 <- proc.time()-t
matrizTiempos[fila,k] <- t1[3]
}
}
}

8
#crear fichero
write.csv(matrizFitness,file = "matrizFitnessHeuristico1.csv")
write.csv(matrizTiempos,file = "matrizTiemposHeuristico1.csv")

###################### Segundo caso ############################################


#Resolucion de la matriz aleatoria de dimension 15

popSize <- 100


numPadres <- 20
numIteraciones <- 100
ejecuciones <- 50

matrizFitness <- matrix(0,nrow=6,ncol=ejecuciones)


matrizTiempos <- matrix(0,nrow=6,ncol=ejecuciones)

#Bucle principal
fila<-0
for (i in 1:2){
for (j in 1:3){
# Medimos el tiempo de ejecucion.
fila<-fila+1
for (k in 1:ejecuciones){
t <- proc.time()
solucion<-combinacionAGLocal( matrizrand15, popSize,numPadres, numIteraciones, cruce = i,vecindar
fitness<- solucion$fitnessmatriz
matrizFitness[fila , k] <- fitness
t1 <- proc.time()-t
matrizTiempos[fila,k] <- t1[3]
}
}
}

#crear fichero
write.csv(matrizFitness,file = "matrizFitnessHeuristico2.csv")
write.csv(matrizTiempos,file = "matrizTiemposHeuristico2.csv")

###################### Tercer caso #############################################


#Resolucion de la matriz aleatoria de dimension 15

popSize <- 75
numPadres <- 40
numIteraciones <- 100
ejecuciones <- 50

matrizFitness <- matrix(0,nrow=6,ncol=ejecuciones+5)


matrizTiempos <- matrix(0,nrow=6,ncol=ejecuciones+5)

#Bucle principal
fila<-0
for (i in 1:2){

9
for (j in 1:3){
# Medimos el tiempo de ejecucion.
fila<-fila+1
for (k in 1:ejecuciones){
t <- proc.time()
solucion<-combinacionAGLocal( matrizrand15, popSize,numPadres, numIteraciones, cruce = i,vecindar
fitness<- solucion$fitnessmatriz
matrizFitness[fila , k] <- fitness
t1 <- proc.time()-t
matrizTiempos[fila,k] <- t1[3]
}
}
}

#crear fichero
write.csv(matrizFitness,file = "matrizFitnessHeuristico3.csv")
write.csv(matrizTiempos,file = "matrizTiemposHeuristico3.csv")

###############################################################################
#Como el tercer caso es el mejor, usamos estos parmetros para ver los tiempos
#de ejecucion, la media y arpd en una matriz mas grande y aumentando las iteraciones
numPadres<-75
popSize <- 40
ejecuciones <- 10

#cojemos una matriz mas grande 60x60 para resolverla


matrizk<-scan( "INPUT-OUTPUT-TABELLE 1970 ZU AB-WERK-PREISEN (INLAENDISCHE PRODUKTION).txt")
matrizk60<-matrix(data= matrizk ,nrow = 60, ncol = 60)

matrizFitnessk <- matrix(0,nrow=ejecuciones,ncol=10)


matrizTiemposk <- matrix(0,nrow=ejecuciones,ncol=1)

for (k in 1:ejecuciones){
numIteraciones <- 100
numIteraciones<-numIteraciones+25*(k-1)
for (i in 1:10){
print(c(k,i))
t <- proc.time()
solucionk<-combinacionAGLocal(matrizk60,popSize,numPadres,numIteraciones,2,1)
fitnessk<- solucionk$fitnessmatriz
matrizFitnessk2[k,i] <- fitnessk
}
t3 <- proc.time()-t
matrizTiemposk2[k] <- t3[3]/10
print(matrizFitnessk2[k,])
}

#crear fichero
write.csv(matrizFitnessk,file = "matrizFitnessHeuristicok21.csv")
write.csv(matrizTiemposk,file = "matrizTiemposHeuristicok21.csv")

10
################################################################################
############## GENERAR PDFs #####################################################
################################################################################

knitr::opts_chunk$set(eval = FALSE)
knitr::stitch('funcionObjetivoLOP.R')
knitr::stitch('exhaustivoLOP.R')
knitr::stitch('grafo.R')
knitr::stitch('localLOP.R')
knitr::stitch('geneticoLOP.R')
knitr::stitch('cruce.R')
knitr::stitch('mutacion.R')
knitr::stitch('supervivientes.R')
knitr::stitch('geneticoLOPv2.R')
knitr::stitch('geneticoLOPv3.R')
knitr::stitch('geneticoLOPv4.R')
knitr::stitch('combinacionAGLocal.R')
knitr::stitch('programa.R')

11
Bibliografı́a

[1] Christos H. Papadimitriou and Kenneth Steiglitz. Combinatorial optimization:


algorithms and complexity. Englewood cliffs, 1998.

[2] Rafael Marti. Procedimientos metaheuristicos en optimizacion combinatoria.


Universitat de Valencia, 2003.

[3] Josu Ceberio, Alexander Mendiburu, and Jose A. Lozano. The linear ordering
problem revisted. Technical report, University of The Basque Country, 2014.

[4] Borja Calvo, Josu Ceberio, and Usue Mori. Bilaketa heuristikoak - Teoria eta
Adibideak R Lengoaian. Universidad del Paı́s Vasco - Euskal Herriko Uniber-
tsitatea, 2017.

[5] Leticia Hernando. Apuntes algoritmos bioinspirados. 2022.

[6] Ricardo Peña Marı́. El problema que los informáticos no han podido resol-
ver en 45 años: https://elpais.com/tecnologia/2017/05/19/actualidad/
1495202801_698394.html, May 2017.

[7] Rafael Marti, Gerhard Reinelt, and Abraham Duarte. A benchmark library
and a comparison of heuristic methods for the linear ordering problem. Compu-
tational Optimization and Applications, 51:1297–1317, 04 2012.

[8] Leticia Hernando, Alexander Mendiburu, and Jose A. Lozano. Journey to the
center of the linear ordering problem. In Proceedings of the 2020 Genetic and
Evolutionary Computation Conference, page 201–209, New York, NY, USA,
2020. Association for Computing Machinery.

[9] Stefan Chanas and prezemyslaw Kobylanski. A new heuristic algorithm solving
the linear ordering problem. Computational Optimization and Applications,
6:191–205, 06 1996.

[10] Robin Wilson. Introduction to graph theory. Prentice hall, 1996.

[11] Rafael Marti and Gerhard Reinelt. The linear ordering problem. Springer,
2011.

121
Estudio del problema de la
ordenación lineal (LOP) y propuesta
de métodos de resolución.
Malena Urruchua Fernández
Trabajo de Fin de Máster en Modelización e Investigación
Matemática, Estadı́stica y Computación
Dirigido por Leticia Hernando Rodriguez
Leioa, 13 de julio de 2022

1
ÍNDICE

1. Problemas de optimización combinatoria.


2. Problema de la ordenación lineal (LOP).
3. Métodos de resolución exactos.
4. Métodos de resolución metaheurı́sticos.
5. Método de resolución metaheurı́stico propuesto.
6. Conclusiones y trabajo futuro.

2
1. Problemas de optimización combinatoria.
Problemas de optimización

3
1. Problemas de optimización combinatoria.
Problemas de optimización

Definición (Problema de optimización)


⎪ Max/Min f ((x1 , ..., xn ))





⎨ sujeto a:


⎪ ((x xn )) ≤ 0, i = 1, ..., m



gi ,
1 2x , ...,
((x
⎩ j 1 2
h , x , ..., xn )) = 0, j = 1, ..., p
donde: f , gi , hj ∶ S Ð→ R son funciones de (x1 , x2 , ..., xn ) ∈ S.

3
1.Problemas de optimización combinatoria
Métodos de resolución y Complejidad temporal

4
1.Problemas de optimización combinatoria
Métodos de resolución y Complejidad temporal

● Exactos

● Aproximados

− Metaheurı́sticos

− Heurı́sticos

4
1.Problemas de optimización combinatoria
Métodos de resolución y Complejidad temporal

● Exactos ● Problemas P
● Problemas NP
● Problemas NP-Duros
● Aproximados

− Metaheurı́sticos

− Heurı́sticos

4
2.Problema de la ordenación lineal
Definición y representación mediante matrices

5
2.Problema de la ordenación lineal
Definición y representación mediante matrices

● Representación: matrices [bij ]n×n

5
2.Problema de la ordenación lineal
Definición y representación mediante matrices

● Representación: matrices [bij ]n×n


● Espacio de búsqueda: S = Sn

5
2.Problema de la ordenación lineal
Definición y representación mediante matrices

● Representación: matrices [bij ]n×n


● Espacio de búsqueda: S = Sn
● Función objetivo a maximizar:

f ∶ Sn z→ R
n n−1 n
σ = (σ1 ...σn ) z→ ∑ bijσ = ∑ ∑ bijσ
i<j i=1 j=i+1

5
2.Problema de la ordenación lineal
Definición y representación mediante matrices

● Representación: matrices [bij ]n×n


● Espacio de búsqueda: S = Sn
● Función objetivo a maximizar:

f ∶ Sn z→ R
n n−1 n n−1 n
σ = (σ1 ...σn ) z→ ∑ bijσ = ∑ ∑ bijσ = ∑ ∑ bσi σj
i<j i=1 j=i+1 i=1 j=i+1

5
2.Problema de la ordenación lineal
Definición y representación mediante matrices

● Representación: matrices [bij ]n×n


● Espacio de búsqueda: S = Sn
● Función objetivo a maximizar:

f ∶ Sn z→ R
n n−1 n n−1 n
σ = (σ1 ...σn ) z→ ∑ bijσ = ∑ ∑ bijσ = ∑ ∑ bσi σj
i<j i=1 j=i+1 i=1 j=i+1

● Ejemplo: Tomamos B ∈ Mat3×3 (R) y σ = (132) ∈ S3 .

5
2.Problema de la ordenación lineal
Definición y representación mediante matrices

● Representación: matrices [bij ]n×n


● Espacio de búsqueda: S = Sn
● Función objetivo a maximizar:

f ∶ Sn z→ R
n n−1 n n−1 n
σ = (σ1 ...σn ) z→ ∑ bijσ = ∑ ∑ bijσ = ∑ ∑ bσi σj
i<j i=1 j=i+1 i=1 j=i+1

● Ejemplo: Tomamos B ∈ Mat3×3 (R) y σ = (132) ∈ S3 .


10 1 2 filas 10 1 2 columnas 10 2 1
B =( 3 10 4 ) Ð→ ( 5 6 10 ) Ð→ ( 5 10 6 ) = Bσ
5 6 10 3 10 4 3 4 10

5
2.Problema de la ordenación lineal
Definición y representación mediante matrices

● Representación: matrices [bij ]n×n


● Espacio de búsqueda: S = Sn
● Función objetivo a maximizar:

f ∶ Sn z→ R
n n−1 n n−1 n
σ = (σ1 ...σn ) z→ ∑ bijσ = ∑ ∑ bijσ = ∑ ∑ bσi σj
i<j i=1 j=i+1 i=1 j=i+1

● Ejemplo: Tomamos B ∈ Mat3×3 (R) y σ = (132) ∈ S3 .


10 1 2 filas 10 1 2 columnas 10 2 1
B =( 3 10 4 ) Ð→ ( 5 6 10 ) Ð→ ( 5 10 6 ) = Bσ
5 6 10 3 10 4 3 4 10
f ((132)) = 2 + 1 + 6 = 9

5
2. Problema de la ordenación lineal
Definición y representación mediante digrafos

6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos

● Representación: digrafos ponderados completos D = (V , A)

6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos

● Representación: digrafos ponderados completos D = (V , A)


● Espacio de búsqueda: torneo acı́clico T = (V , A′ ) ⊂ D

6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos

● Representación: digrafos ponderados completos D = (V , A)


● Espacio de búsqueda: torneo acı́clico T = (V , A′ ) ⊂ D
● Función objetivo a maximizar:

f ∶ A Ð→ R
A′ z→ f (A′ ) = ∑ wij
(i,j)∈A′

6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos

● Representación: digrafos ponderados completos D = (V , A)


● Espacio de búsqueda: torneo acı́clico T = (V , A′ ) ⊂ D
● Función objetivo a maximizar:

f ∶ A Ð→ R
A′ z→ f (A′ ) = ∑ wij
(i,j)∈A′

6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos

● Representación: digrafos ponderados completos D = (V , A)


● Espacio de búsqueda: torneo acı́clico T = (V , A′ ) ⊂ D
● Función objetivo a maximizar:

f ∶ A Ð→ R
A′ z→ f (A′ ) = ∑ wij
(i,j)∈A′

● Ejemplo: Tomamos el digrafo D y el torneo acı́clico T .

f (A′ ) = 2 + 1 + 6 = 9

6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos

● Representación: digrafos ponderados completos D = (V , A)


● Espacio de búsqueda: torneo acı́clico T = (V , A′ ) ⊂ D
● Función objetivo a maximizar:

f ∶ A Ð→ R
A′ z→ f (A′ ) = ∑ wij
(i,j)∈A′

● Teorema: Son equivalentes en un torneo:


- Es acı́clico.
- El grado positivo g + (o negativo g − ) es diferente para todos
los vértices.
- Tiene un único camino hamiltoniano.

6
2.Problema de la ordenación lineal
Equivalencia entre las representaciones

Matriz B = (bij )n×n ∈ Mat(R) y Digrafo completo ponderado


permutación σ = (σ1 ...σn ) ∈ Sn D = (V , A) y torneo acı́clico
T = (V , A′ ) ⊂ D

7
2.Problema de la ordenación lineal
Equivalencia entre las representaciones

Matriz B = (bij )n×n ∈ Mat(R) y Digrafo completo ponderado


permutación σ = (σ1 ...σn ) ∈ Sn D = (V , A) y torneo acı́clico
- bij T = (V , A′ ) ⊂ D
- ωij

7
2.Problema de la ordenación lineal
Equivalencia entre las representaciones

Matriz B = (bij )n×n ∈ Mat(R) y Digrafo completo ponderado


permutación σ = (σ1 ...σn ) ∈ Sn D = (V , A) y torneo acı́clico
- bij T = (V , A′ ) ⊂ D
- (σ1 ...σn ) - ωij
- único camino hamiltoniano del
torneo

7
2.Problema de la ordenación lineal
Equivalencia entre las representaciones

Matriz B = (bij )n×n ∈ Mat(R) y Digrafo completo ponderado


permutación σ = (σ1 ...σn ) ∈ Sn D = (V , A) y torneo acı́clico
- bij T = (V , A′ ) ⊂ D
- (σ1 ...σn ) - ωij
- único camino hamiltoniano del
- σi = k
torneo
- g + (k) = i − 1 y g − (k) = n − i

7
2.Problema de la ordenación lineal
Propiedades (I)

Sean σ = (σ1 σ2 ...σn ) ∈ Sn y B ∈ Matn×n (R):

8
2.Problema de la ordenación lineal
Propiedades (I)

Sean σ = (σ1 σ2 ...σn ) ∈ Sn y B ∈ Matn×n (R):


1. bii , i ∈ {1, ..., n}, no aportan ningún valor a f (σ)
Ejemplo propiedad 1
⎛10 1 2 ⎞
B σ =⎜ 3 10 4 ⎟ f (σ) = 1 + 2 + 4 = 7
⎝ 5 6 10⎠

8
2.Problema de la ordenación lineal
Propiedades (I)

Sean σ = (σ1 σ2 ...σn ) ∈ Sn y B ∈ Matn×n (R):


1. bii , i ∈ {1, ..., n}, no aportan ningún valor a f (σ)
2. Parejas simétricamente localizadas respecto a la diagonal
principal {bij , bji } permanecen asociadas ∀σ ∈ Sn .
Ejemplo propiedad 2

8
2.Problema de la ordenación lineal
Propiedades (I)

Sean σ = (σ1 σ2 ...σn ) ∈ Sn y B ∈ Matn×n (R):


1. bii , i ∈ {1, ..., n}, no aportan ningún valor a f (σ)
2. Parejas simétricamente localizadas respecto a la diagonal
principal {bij , bji } permanecen asociadas ∀σ ∈ Sn .
3. Para cada pareja {bij , bji } una de las entradas se encuentra
por encima de la diagonal principal y la otra por debajo,
∀σ ∈ Sn Ô⇒ ∑ min{bij , bji } ≤ f (σ) ≤ ∑ max{bij , bji }.
i<j i<j

8
2.Problema de la ordenación lineal
Propiedades (II)

Sean σ = (σ1 σ2 ...σn ) ∈ Sn y B ∈ Matn×n (R):

9
2.Problema de la ordenación lineal
Propiedades (II)

Sean σ = (σ1 σ2 ...σn ) ∈ Sn y B ∈ Matn×n (R):


4. Si σ maximiza f , σ minimiza:

f ′ ∶ Sn Ð→ R
n n−1 n
σ z→ f ′ (σ) = ∑ bijσ = ∑ ∑ bijσ
i>j j=1 i=j+1

9
2.Problema de la ordenación lineal
Propiedades (II)

Sean σ = (σ1 σ2 ...σn ) ∈ Sn y B ∈ Matn×n (R):


4. Si σ maximiza f , σ minimiza:

f ′ ∶ Sn Ð→ R
n n−1 n
σ z→ f ′ (σ) = ∑ bijσ = ∑ ∑ bijσ
i>j j=1 i=j+1

5. Si B ∈ Matn×n (R) es simétrica Ô⇒ f (σ) = ∑ bij = ∑ bij .


i<j i>j

9
2. Problema de la ordenación lineal
Vecindario adyacente

10
2. Problema de la ordenación lineal
Vecindario adyacente

Definición (Vecindario adyacente)


Sea σ = (σ1 σ2 ...σi σi+1 ...σn ) ∈ Sn , el vecindario adyacente es:

Nady ∶ Sn Ð→ P(Sn )\∅


σ z→ Nady (σ) = {(σ1 σ2 ...σi+1 σi ...σn ) ∈ Sn ∣
i ∈ {1, ..., n − 1}}

10
2. Problema de la ordenación lineal
Vecindario adyacente

Definición (Vecindario adyacente)


Sea σ = (σ1 σ2 ...σi σi+1 ...σn ) ∈ Sn , el vecindario adyacente es:

Nady ∶ Sn Ð→ P(Sn )\∅


σ z→ Nady (σ) = {(σ1 σ2 ...σi+1 σi ...σn ) ∈ Sn ∣
i ∈ {1, ..., n − 1}}

Ejemplo
Si σ ∈ S4 → σ = (σ1 σ2 σ3 σ4 )
Ð→ Nady (σ) = {(σ2 σ1 σ3 σ4 ), (σ1 σ3 σ2 σ4 ), (σ1 σ2 σ4 σ3 )}

10
2. Problema de la ordenación lineal
Vecindario adyacente

Definición (Vecindario adyacente)


Sea σ = (σ1 σ2 ...σi σi+1 ...σn ) ∈ Sn , el vecindario adyacente es:

Nady ∶ Sn Ð→ P(Sn )\∅


σ z→ Nady (σ) = {(σ1 σ2 ...σi+1 σi ...σn ) ∈ Sn ∣
i ∈ {1, ..., n − 1}}

Lema
El vecindario adyacente de σ ∈ Sn está formado por n − 1
permutaciones.

10
2. Problema de la ordenación lineal
Vecindario adyacente

Definición (Vecindario adyacente)


Sea σ = (σ1 σ2 ...σi σi+1 ...σn ) ∈ Sn , el vecindario adyacente es:

Nady ∶ Sn Ð→ P(Sn )\∅


σ z→ Nady (σ) = {(σ1 σ2 ...σi+1 σi ...σn ) ∈ Sn ∣
i ∈ {1, ..., n − 1}}

Teorema
Dado σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn alcanza el óptimo local ⇐⇒ los
elementos de la matriz B = [bij ]n×n del LOP satisfacen:

∗ ≥ bσ ∗ σ ∗ , ∀i ∈ {1, ..., n − 1}.


bσi∗ σi+1 i+1 i

10
2.Problema de la ordenación lineal
Vecindario intercambio

11
2.Problema de la ordenación lineal
Vecindario intercambio

Definición (vecindario intercambio)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:

Nint ∶ Sn Ð→ P(Sn )\∅


σ z→ Nint (σ) = {(σ1 σ2 ...σj ...σi ...σn ) ∈ Sn ∣
i, j ∈ {1, ..., n}, i < j}

11
2.Problema de la ordenación lineal
Vecindario intercambio

Definición (vecindario intercambio)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:

Nint ∶ Sn Ð→ P(Sn )\∅


σ z→ Nint (σ) = {(σ1 σ2 ...σj ...σi ...σn ) ∈ Sn ∣
i, j ∈ {1, ..., n}, i < j}

Ejemplo
Si σ ∈ S4 → σ = (σ1 σ2 σ3 σ4 )
Ð→ Nint (σ) = {(σ2 σ1 σ3 σ4 ), (σ3 σ2 σ1 σ4 ), (σ4 σ2 σ3 σ1 ),
(σ1 σ3 σ2 σ4 ), (σ1 σ4 σ3 σ2 ), (σ1 σ2 σ4 σ3 )}

11
2.Problema de la ordenación lineal
Vecindario intercambio

Definición (vecindario intercambio)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:

Nint ∶ Sn Ð→ P(Sn )\∅


σ z→ Nint (σ) = {(σ1 σ2 ...σj ...σi ...σn ) ∈ Sn ∣
i, j ∈ {1, ..., n}, i < j}

Lema
n(n−1)
El vecindario intercambio de σ ∈ Sn está formado por 2
permutaciones.

11
2.Problema de la ordenación lineal
Vecindario intercambio

Definición (vecindario intercambio)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:

Nint ∶ Sn Ð→ P(Sn )\∅


σ z→ Nint (σ) = {(σ1 σ2 ...σj ...σi ...σn ) ∈ Sn ∣
i, j ∈ {1, ..., n}, i < j}

Teorema
Dado σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn alcanza un óptimo local ⇐⇒ las
entradas de la matriz B = [bij ]n×n satisfacen:
j j−1 j j−1
∑ bσi∗ σk∗ + ∑ bσk∗ σj∗ ≥ ∑ bσk∗ σi∗ + ∑ bσj∗ σk∗ ,
k=i+1 k=i k=i+1 k=i
∀i ∈ {1, ..., n − 1} , ∀j ∈ {i + 1, ..., n}
11
2.Problema de la ordenación lineal
Vecindario inserción

12
2.Problema de la ordenación lineal
Vecindario inserción

Definición (vecindario inserción)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:
Nins ∶ Sn Ð→ P(Sn )\∅
σ z→ Nins (σ) = {(σ1 ....σj σi σj+1 ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i < j}
∪ {(σ1 ....σj−1 σi σj ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i > j}

12
2.Problema de la ordenación lineal
Vecindario inserción

Definición (vecindario inserción)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:
Nins ∶ Sn Ð→ P(Sn )\∅
σ z→ Nins (σ) = {(σ1 ....σj σi σj+1 ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i < j}
∪ {(σ1 ....σj−1 σi σj ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i > j}

Ejemplo
Si σ ∈ S4 → σ = (σ1 σ2 σ3 σ4 )
Ð→ Nins (σ) = {(σ2 σ1 σ3 σ4 ), (σ2 σ3 σ1 σ4 ), (σ2 σ3 σ4 σ1 ),
(σ1 σ3 σ2 σ4 ), (σ1 σ3 σ4 σ2 ), (σ3 σ1 σ2 σ4 ),
(σ1 σ2 σ4 σ3 ), (σ4 σ1 σ2 σ3 ), (σ1 σ4 σ2 σ3 )}

12
2.Problema de la ordenación lineal
Vecindario inserción

Definición (vecindario inserción)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:
Nins ∶ Sn Ð→ P(Sn )\∅
σ z→ Nins (σ) = {(σ1 ....σj σi σj+1 ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i < j}
∪ {(σ1 ....σj−1 σi σj ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i > j}

Lema
El vecindario inserción de σ ∈ Sn está formado por (n − 1)2
permutaciones.

12
2.Problema de la ordenación lineal
Vecindario inserción

Definición (vecindario inserción)


Sea σ = (σ1 σ2 ...σi ...σj ...σn ) ∈ Sn , el vecindario intercambio es:
Nins ∶ Sn Ð→ P(Sn )\∅
σ z→ Nins (σ) = {(σ1 ....σj σi σj+1 ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i < j}
∪ {(σ1 ....σj−1 σi σj ....σn )∣i ∈ {3, ..., n}, j ∈ {1, ..., n − 2}, i > j}

Teorema
Dado σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn alcanza un óptimo local ⇐⇒ las
entradas de la matriz B = [bij ]n×n satisfacen:
j j
∑ bσi∗ σk∗ ≥ ∑ bσk∗ σi∗ , ∀i ∈ {1, ..., n − 1}, ∀j ∈ {i + 1, ..., n}
k=i+1 k=i+1
i−1 i−1
∑ bσk∗ σi∗ ≥ ∑ bσi∗ σk∗ , ∀i ∈ {3, ..., n}, ∀j ∈ {1, ..., i − 2}
k=j k=j
12
3. Métodos exactos
Búsqueda exhaustiva

13
3. Métodos exactos
Búsqueda exhaustiva

● Exploran todos los puntos factibles del espacio de búsqueda.

13
3. Métodos exactos
Búsqueda exhaustiva

● Exploran todos los puntos factibles del espacio de búsqueda.


● Selecciona los de mayor valor de función objetivo.

13
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:
● Se buscan las parejas simétricamente localizadas {bij , bji }.

⎛0 4 2⎞
B =⎜1 0 3⎟ Ô⇒ {{4, 1}, {2, 5}, {3, 3}}
⎝5 3 0⎠

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:
● Se buscan las parejas simétricamente localizadas {bij , bji }.
● Se selecciona el mayor de los valores parea cada pareja.
Ô⇒ {{4, 1}, {2, 5}, {3, 3}}

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:
● Se buscan las parejas simétricamente localizadas {bij , bji }.
● Se selecciona el mayor de los valores parea cada pareja.
Ô⇒ {{b12 , b21 }, {b13 , b31 }, {b23 , b32 }}
● Dibujamos n vértices y obtenemos las aristas:

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:
● Se buscan las parejas simétricamente localizadas {bij , bji }.
● Se selecciona el mayor de los valores parea cada pareja.
Ô⇒ {{b12 , b21 }, {b13 , b31 }, {b23 , b32 }}
● Dibujamos n vértices y obtenemos las aristas:
- Si bij es el mayor, se dibuja (i, j)

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:
● Se buscan las parejas simétricamente localizadas {bij , bji }.
● Se selecciona el mayor de los valores parea cada pareja.
Ô⇒ {{b12 , b21 }, {b13 , b31 }, {b23 , b32 }}
● Dibujamos n vértices y obtenemos las aristas:
- Si bij es el mayor, se dibuja (i, j)
- Si bji es el mayor, se dibuja (j, i)

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:
● Se buscan las parejas simétricamente localizadas {bij , bji }.
● Se selecciona el mayor de los valores parea cada pareja.
Ô⇒ {{b12 , b21 }, {b13 , b31 }, {b23 , b32 }}
● Dibujamos n vértices y obtenemos las aristas:
- Si bij es el mayor, se dibuja (i, j)
- Si bji es el mayor, se dibuja (j, i)
- Si bij = bji , se dibujan (i, j) y (j, i)

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

n(n−1)
Digrafo de n vértices y al menos 2 aristas:
● Se buscan las parejas simétricamente localizadas {bij , bji }.
● Se selecciona el mayor de los valores parea cada pareja.
Ô⇒ {{b12 , b21 }, {b13 , b31 }, {b23 , b32 }}
● Dibujamos n vértices y obtenemos las aristas:
- Si bij es el mayor, se dibuja (i, j)
- Si bji es el mayor, se dibuja (j, i)
- Si bij = bji , se dibujan (i, j) y (j, i)

Ô⇒ El digrafo óptimo siempre es un torneo o contiene un torneo


Ô⇒ El digrafo óptimo es siempre semi-hamiltoniano.

14
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

15
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

Teorema
σ = (σ1 σ2 ...σn ) un camino hamiltoniano del digrafo óptimo
⇐⇒ σ ∈ Sn es óptimo local del LOP bajo el vecindario adyacente.

15
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

Teorema
σ = (σ1 σ2 ...σn ) un camino hamiltoniano del digrafo óptimo
⇐⇒ σ ∈ Sn es óptimo local del LOP bajo el vecindario adyacente.

Demostración.
σ = (σ1 σ2 ...σn ) es un camino hamiltoniano del digrafo óptimo
⇐⇒ (σi , σi+1 ) ∈ A, ∀i ∈ {1, ..., n − 1}.

15
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

Teorema
σ = (σ1 σ2 ...σn ) un camino hamiltoniano del digrafo óptimo
⇐⇒ σ ∈ Sn es óptimo local del LOP bajo el vecindario adyacente.

Demostración.
σ = (σ1 σ2 ...σn ) es un camino hamiltoniano del digrafo óptimo
⇐⇒ (σi , σi+1 ) ∈ A, ∀i ∈ {1, ..., n − 1}.
Entonces, por la forma en la que hemos construido el digrafo
óptimo:


⎪ bσ1 σ2 ≥ bσ2 σ1


⎪ bσ2 σ3 ≥ bσ3 σ2 bσi σi+1 ≥ bσi+1 σi
⎨ ⇐⇒ {

⎪ ... ∀i ∈ {1, ..., n − 1}

⎪ ≥ bσn σn−1
⎩ bσn−1 σn

15
3. Métodos exactos
Búsqueda basada en los óptimos locales del vecindario adyacente

Teorema
σ = (σ1 σ2 ...σn ) un camino hamiltoniano del digrafo óptimo
⇐⇒ σ ∈ Sn es óptimo local del LOP bajo el vecindario adyacente.

Demostración.
σ = (σ1 σ2 ...σn ) es un camino hamiltoniano del digrafo óptimo
⇐⇒ (σi , σi+1 ) ∈ A, ∀i ∈ {1, ..., n − 1}.
Entonces, por la forma en la que hemos construido el digrafo
óptimo:


⎪ bσ1 σ2 ≥ bσ2 σ1


⎪ bσ2 σ3 ≥ bσ3 σ2 bσi σi+1 ≥ bσi+1 σi
⎨ ⇐⇒ { ⇐⇒

⎪ ... ∀i ∈ {1, ..., n − 1}

⎪ ≥ bσn σn−1
⎩ bσn−1 σn
⇐⇒ σ óptimo local del LOP del vecindario adyacente Nady (σ)
15
3.Métodos de resolución exactos
comparativa

16
3.Métodos de resolución exactos
comparativa

● Búsqueda exhaustiva
● Búsqueda basada en los caminos hamiltonianos del digrafo
óptimo

16
3.Métodos de resolución exactos
comparativa

● Búsqueda exhaustiva
● Búsqueda basada en los caminos hamiltonianos del digrafo
óptimo

Figure: Gráfica comparativa del tiempo de ejecución de la búsqueda


exhaustiva (naranja) y búsqueda basada en los caminos hamiltonianos
(azul), a escala natural (izquierda) y a escala logarı́tmica (derecha).
16
3. métodos de resolución exactos
comparativa

Figure: Matriz dimensión 15x15 con su digrafo óptimo, cuya solución


es: 6546.

17
4.Métodos de resolución metaheurı́sticos

18
4.Métodos de resolución metaheurı́sticos

● Métodos aproximados.

18
4.Métodos de resolución metaheurı́sticos

● Métodos aproximados.
● Métodos genéricos.

18
4.Métodos de resolución metaheurı́sticos

● Métodos aproximados.
● Métodos genéricos.
● Tipos:
- Basados en un punto factible.
- Basados en un conjunto de puntos factibles.

18
4.Métodos de resolución metaheurı́sticos
Búsqueda local aplicada al LOP

19
4.Métodos de resolución metaheurı́sticos
Búsqueda local aplicada al LOP

● Se toma una permutación σ ∈ Sn y se calcula su valor de


función objetivo.

19
4.Métodos de resolución metaheurı́sticos
Búsqueda local aplicada al LOP

● Se toma una permutación σ ∈ Sn y se calcula su valor de


función objetivo.
● Se obtiene el vecindario de σ (adyacente, intercambio o
inserción).

19
4.Métodos de resolución metaheurı́sticos
Búsqueda local aplicada al LOP

● Se toma una permutación σ ∈ Sn y se calcula su valor de


función objetivo.
● Se obtiene el vecindario de σ (adyacente, intercambio o
inserción).
● Se calcula el valor de función objetivo de las permutaciones
del vecindario.

19
4.Métodos de resolución metaheurı́sticos
Búsqueda local aplicada al LOP

● Se toma una permutación σ ∈ Sn y se calcula su valor de


función objetivo.
● Se obtiene el vecindario de σ (adyacente, intercambio o
inserción).
● Se calcula el valor de función objetivo de las permutaciones
del vecindario.
● Se selecciona la permutación cuyo valor de función objetivo es
mayor.
- Si es una permutación del vecindario, se repite el proceso.
- Si es la permutación seleccionada en primer lugar, el
algoritmo finaliza.

19
4.Métodos de resolución metaheurı́sticos
Búsqueda local aplicada al LOP

● Se toma una permutación σ ∈ Sn y se calcula f (σ).


● Se obtiene el vecindario de σ (adyacente, intercambio o inserción).
● Se calcula el fitness de las permutaciones del vecindario.
● Se selecciona la permutación cuyo fitness es mayor.
- Si es una permutación del vecindario, se repite el proceso.
- Si es la permutación seleccionada en primer lugar, el algoritmo
finaliza.
Vecindario Tiempo Rango soluciones X̄ ARPD(%) Iteraciones
Adyacente 0.02 (5157,6257) 5827 10.99 12
Intercambio 0.02 (5454,6175) 5769 11.87 4
Inserción 0.11 (5167,6476) 5759 12.02 4

Table: Se muestra el tiempo medio de ejecución en segundos (Tiempo),


la mejor y peor solución obtenida entre las 50 ejecuciones (Rango
soluciones), la media de las soluciones obtenidas (X̄ ), desviación
porcentual relativa media (ARPR(%)) y número de iteraciones realizadas
antes de finalizar. 20
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se somete a parte de los individuos a un operador de
mutación según una probabilidad.

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se somete a parte de los individuos a un operador de
mutación según una probabilidad.
- Se calcula el fitness de los nuevos individuos obtenidos.

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se somete a parte de los individuos a un operador de
mutación según una probabilidad.
- Se calcula el fitness de los nuevos individuos obtenidos.
- Pasan a la siguiente iteración los de mayor fitness entre los
nuevos individuos generados y los de la iteración anterior.

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se somete a parte de los individuos a un operador de
mutación según una probabilidad.
- Se calcula el fitness de los nuevos individuos obtenidos.
- Pasan a la siguiente iteración los de mayor fitness entre los
nuevos individuos generados y los de la iteración anterior.
● Resultado:
- El algoritmo finaliza cuando se alcanza un número de
iteraciones.

21
4.Métodos de resolución metaheurı́sticos
Algoritmos genéticos aplicados al LOP

● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se somete a parte de los individuos a un operador de
mutación según una probabilidad.
- Se calcula el fitness de los nuevos individuos obtenidos.
- Pasan a la siguiente iteración los de mayor fitness entre los
nuevos individuos generados y los de la iteración anterior.
● Resultado:
- El algoritmo finaliza cuando se alcanza un número de
iteraciones.
- Se devuelve el mayor fitness de la última iteración y el
individuo con el que se ha conseguido dicho valor.
21
4. Métodos de resolución metaheurı́sticos.
Algoritmos genéticos aplicados al LOP.

22
4. Métodos de resolución metaheurı́sticos.
Algoritmos genéticos aplicados al LOP.

● Individuos de la población inicial: 75


● Individuos de las iteraciones: 40
● Probabilidad de mutación: 0.5
● Número de iteraciones: 100

22
4. Métodos de resolución metaheurı́sticos.
Algoritmos genéticos aplicados al LOP.

● Individuos de la población inicial: 75


● Individuos de las iteraciones: 40
● Probabilidad de mutación: 0.5
● Número de iteraciones: 100
Cruce Mutación Tiempo Rango soluciones X̄ ARPD(%) Óptimo
Orden Intercambio 0.674 (6325, 6546) 6460 1.31 3
Orden Inserción 0.684 (6411, 6546) 6509 0.57 11
Orden Inversión 0.754 (6280, 6546) 6474 1.64 1
Orden Scramble 0.761 (6329, 6546) 6474 1.11 5
Mapped Intercambio 2.950 (6433, 6546) 6493 0.81 5
Mapped Inserción 3.038 (6475, 6546) 6521 0.39 20
Mapped Inversión 2.979 (6365, 6546) 6476 1.07 3
Mapped Scramble 2.999 (6436, 6546) 6511 0.53 13

Table: Se muestra el tiempo medio de ejecución en segundos (Tiempo),


la mejor y peor solución obtenida entre las 50 ejecuciones (Rango
soluciones), la media de las soluciones obtenidas X̄ , desviación porcentual
relativa media(ARPR) y el número de ocasiones en las que se ha
alcanzado el óptimo global 6546 (Óptimo). 22
5.Método de resolución metaheurı́stico
propuesto

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se comprueba si son óptimos locales, si no lo son Ô⇒
búsqueda local.

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se comprueba si son óptimos locales, si no lo son Ô⇒
búsqueda local.
- Pasan a la siguiente iteración los de mayor fitness entre los
nuevos individuos generados y los de la iteración anterior.
● Resultado:

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se comprueba si son óptimos locales, si no lo son Ô⇒
búsqueda local.
- Pasan a la siguiente iteración los de mayor fitness entre los
nuevos individuos generados y los de la iteración anterior.
● Resultado:
- El algoritmo finaliza cuando se alcanza un número de
iteraciones.

23
5.Método de resolución metaheurı́stico
propuesto
● Inicialización:
- Población inicial aleatoria.
- Se calcula el fitness de los individuos de la población inicial.
● Iteración:
- Se somete a todos los individuos a un operador de cruce.
- Se comprueba si son óptimos locales, si no lo son Ô⇒
búsqueda local.
- Pasan a la siguiente iteración los de mayor fitness entre los
nuevos individuos generados y los de la iteración anterior.
● Resultado:
- El algoritmo finaliza cuando se alcanza un número de
iteraciones.
- Se devuelve el mayor fitness de la última iteración y el
individuo con el que se ha conseguido dicho valor.
23
5.Método de resolución metaheurı́stico
propuesto

24
5.Método de resolución metaheurı́stico
propuesto
● número de puntos factibles de la población inicial: 75
● número de puntos factibles en cada iteración: 40
● Número de iteraciones: 100

24
5.Método de resolución metaheurı́stico
propuesto
● número de puntos factibles de la población inicial: 75
● número de puntos factibles en cada iteración: 40
● Número de iteraciones: 100
Cruce Vecindario Tiempo Rango soluciones X̄ ARPP(%) Óptimo
Orden Adyacente 30 (6377, 6546) 6510 0.54 15
Orden Intercambio 2.12 (6238, 6520) 6378 2.56 0
Orden Inserción 4.26 (6203, 6528) 6386 2.44 0
Mapped Adyacente 35.78 (6448, 6546) 6527 0.23 29
Mapped Intercambio 3.68 (6239, 6546) 6391 2.26 1
Mapped Inserción 8.11 (6236, 6511) 6409 2.08 0

Table: Se muestra el tiempo medio de ejecución en segundos (Tiempo),


la mejor y peor solución obtenida entre las 50 ejecuciones (Rango
soluciones), la media de las soluciones obtenidas X̄ , desviación porcentual
relativa media (ARPR(%)) y el número de ocasiones en las que se ha
alcanzado el óptimo global 6546 (Óptimo).
24
6.Conclusiones y trabajo futuro
Conclusiones métodos exactos

25
6.Conclusiones y trabajo futuro
Conclusiones métodos exactos

+ Optimalidad garantizada.

25
6.Conclusiones y trabajo futuro
Conclusiones métodos exactos

+ Optimalidad garantizada.
− Computacionalmente costosos.

25
6.Conclusiones y trabajo futuro
Conclusiones métodos exactos

+ Optimalidad garantizada.
− Computacionalmente costosos.
● Método basado en los caminos hamiltonianos del digrafo
óptimo mayor eficacia que la búsqueda exhaustiva.

25
6.Conclusiones y trabajo futuro
Conclusiones métodos exactos

+ Optimalidad garantizada.
− Computacionalmente costosos.
● Método basado en los caminos hamiltonianos del digrafo
óptimo mayor eficacia que la búsqueda exhaustiva.
● A mayor cantidad de empates bij = bji Ô⇒ mayor cantidad
de aristas Ô⇒ mayor tiempo de ejecución.

25
6.Conclusiones y trabajo futuro
Conclusiones métodos metaheurı́sticos

26
6.Conclusiones y trabajo futuro
Conclusiones métodos metaheurı́sticos

+ Muy eficaces.

26
6.Conclusiones y trabajo futuro
Conclusiones métodos metaheurı́sticos

+ Muy eficaces.
− Optimalidad no garantizada.

26
6.Conclusiones y trabajo futuro
Conclusiones métodos metaheurı́sticos

+ Muy eficaces.
− Optimalidad no garantizada.
● Algoritmos genéticos mayor optimalidad que la búsqueda local.

26
6.Conclusiones y trabajo futuro
Conclusiones métodos metaheurı́sticos

+ Muy eficaces.
− Optimalidad no garantizada.
● Algoritmos genéticos mayor optimalidad que la búsqueda local.
● Solución depende de los parámetros iniciales.

26
6.Conclusiones y trabajo futuro
Conclusiones método metaheurı́stico propuesto

27
6.Conclusiones y trabajo futuro
Conclusiones método metaheurı́stico propuesto

+ Equilibrio entre eficacia y bondad de ajuste.

27
6.Conclusiones y trabajo futuro
Conclusiones método metaheurı́stico propuesto

+ Equilibrio entre eficacia y bondad de ajuste.


− Optimalidad no garantizada.

27
6.Conclusiones y trabajo futuro
Conclusiones método metaheurı́stico propuesto

+ Equilibrio entre eficacia y bondad de ajuste.


− Optimalidad no garantizada.
● Solución depende de los parámetros iniciales.

27
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método exacto basado en la búsqueda de caminos


hamiltonianos del digrafo óptimo

28
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método exacto basado en la búsqueda de caminos


hamiltonianos del digrafo óptimo

Heurı́stico para la búsqueda de caminos → Caminos mı́nimos de


digrafos ponderados (TSP).

28
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método exacto basado en la búsqueda de caminos


hamiltonianos del digrafo óptimo

Heurı́stico para la búsqueda de caminos → Caminos mı́nimos de


digrafos ponderados (TSP).
1. Caminos mı́nimos Ô⇒ Minimizar Ô⇒ reconvertir el
problema utilizando la propiedad (iv) del LOP.

28
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método exacto basado en la búsqueda de caminos


hamiltonianos del digrafo óptimo

Heurı́stico para la búsqueda de caminos → Caminos mı́nimos de


digrafos ponderados (TSP).
1. Caminos mı́nimos Ô⇒ Minimizar Ô⇒ reconvertir el
problema utilizando la propiedad (iv) del LOP.
2. Digrafos ponderados Ô⇒ ponderar las aristas del digrafo
óptimo.

28
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método exacto basado en la búsqueda de caminos


hamiltonianos del digrafo óptimo

Heurı́stico para la búsqueda de caminos → Caminos mı́nimos de


digrafos ponderados (TSP).
1. Caminos mı́nimos Ô⇒ Minimizar Ô⇒ reconvertir el
problema utilizando la propiedad (iv) del LOP.
2. Digrafos ponderados Ô⇒ ponderar las aristas del digrafo
óptimo.

28
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método metaheurı́stico propuesto

29
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método metaheurı́stico propuesto

29
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método metaheurı́stico propuesto

1. Elección de parámetros iniciales.

29
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método metaheurı́stico propuesto

1. Elección de parámetros iniciales.


2. Criterio de parada.

29
6.Conclusiones y trabajo futuro
Trabajo futuro

Mejora del método metaheurı́stico propuesto

1. Elección de parámetros iniciales.


2. Criterio de parada.
3. Eliminar o modificar puntos factibles con el mismo fitness.

29
Estudio del problema de la
ordenación lineal (LOP) y propuesta
de métodos de resolución.

Gracias por vuestra atención

Leioa, 13 de julio de 2022

30

También podría gustarte