Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción vii
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
B. Aplicaciones LOP 65
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.
vii
viii
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
2 1.1. Descripción matemática y definiciones básicas
blem - LOP)1 .
Problema de la ordenación
lineal
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
1
La descripción de las aplicaciones más relevantes se encuentra en el Apéndice B.
7
8 2.1. Definición
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
⎛ 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.
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.
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
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.
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
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.
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. ◻
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.
○ σ 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
⎧
⎪ 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
⎩ ⎩
⎛ 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
De este modo, podemos ver que las posiciones que varı́an son las siguientes:
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.
(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
○ 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
(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
N ∶ S Ð→ P(S)\Ø
(x1 x2 ...xn ) z→ N ((x1 x2 ...xn ))
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 .
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}}.
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
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}.
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}
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
∗ ]+
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
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
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
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
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
29
30 3.2. Búsqueda basada en óptimos locales
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′ .
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).
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).
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
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.
⎧
⎪ 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. ◻
⎛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.
− 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)}
− 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)}
− 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).
(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.
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
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.
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
37
38 4.1. Búsqueda Local
(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.
(σ ∗ ) 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
(iii) Resultado:
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.
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.
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
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.
Método de resolución
metaheurı́stico propuesto
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
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.
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
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
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.
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.
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.
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.
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
f ∶ Sn Ð→ R+
n−1
σ z→ wkσ2 + ∑ wσj σj+1 + wσn k
j=2
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
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
f ∶ S Ð→ R+
A′ z→ ∑ aij
(i,j)∈A′
Aplicaciones LOP
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.
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.
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 }
G = ({1, 2, 3, 4, 5}, {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 5}})
67
68 C.1. Definiciones
D = ({1, 2, 3, 4, 5}, {(1, 2), (2, 4), (3, 5), (4, 1), (5, 2)}),
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
Ejemplo C.1.4. Si retomamos el Ejemplo C.1.1 del grafo simple podemos encon-
trar un camino hamiltoniano, por ejemplo: (41325).
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 ⌋ }
Ô⇒ f (σ) ≤ f (σ ∗ )
1 1 1 1 k k k k
◻
4(4−1)
∣Nint (σ)∣ = 6 = 2
(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}
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
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 :
Implementación
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
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)
}
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)
}
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)
}
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
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,]))
}
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)
}
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)
}
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){
library(dplyr)
library(tidyr)
library(magrittr)
#Si el numero de padres es impar, restamos 1 para que no haya conflicto en el torneo.
#Poblacion inicial.
for(i in 1:popSize){
poblacion[i,] <- sample(1:permuSize,permuSize)#sample para aleatoriedad
fitness[i] <- funcionObjetivoLOP(matriz,poblacion[i,])
}
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)
}
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)
}
#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)
#construyo hijo 1
if (pos[2]<permuSize){
k<-pos[2]+1
for (j in (pos[2]+1):permuSize){
#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)
}
#construyo hijo 1
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
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)
}
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)
}
1
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
return(list("pob"=poblacionOrdenada,"fit"=fitnessOrdenada))
1
Apéndice E. Implementación 95
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.
(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′
library(dplyr)
library(tidyr)
library(magrittr)
#Si el numero de padres es impar, restamos 1 para que no haya conflicto.
#Poblacion inicial.
}
}
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)
}
#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 =
library(dplyr)
library(tidyr)
library(magrittr)
#Si el numero de padres es impar, restamos 1 para que no haya conflicto en el torneo.
#Poblacion inicial.
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,])
}
}
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)
}
#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){
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
}
#Poblacion inicial.
for(i in 1:popSize){
poblacion[i,] <- sample(1:permuSize,permuSize)#sample para aleatoriedad
fitness[i] <- pesocamino(matrizgrafo,poblacion[i,])/2
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)
}
}
#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
#Poblacion inicial.
for(i in 1:popSize){
poblacion[i,] <- sample(1:permuSize,permuSize)#sample para aleatoriedad
fitness[i] <- funcionObjetivoLOP(matrizLOP, poblacion[i,])
}
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
}
}
}
#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 ################################
################################################################################
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 ############################################
popSize <- 75
numPadres <- 20
pm <- 0.1
numIteraciones <- 100
ejecuciones <- 50
#Bucle principal
for (i in 1:2){
for (j in 1:4){
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")
#Bucle principal
3
for (i in 1:2){
for (j in 1:4){
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")
#Bucle principal
for (i in 1:2){
for (j in 1:4){
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
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 ################################
################################################################################
5
numPadres <- 40
pm <- 0.5
numIteraciones <- 100
ejecuciones <- 50
####primera ponderacion
#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
#Bucle principal
6
for (i in 1:2){
for (j in 1:4){
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
#Bucle principal
for (i in 1:2){
for (j in 1:4){
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 ##############################
################################################################################
#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")
#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")
popSize <- 75
numPadres <- 40
numIteraciones <- 100
ejecuciones <- 50
#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
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
[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.
[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.
[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
2
1. Problemas de optimización combinatoria.
Problemas de optimización
3
1. Problemas de optimización combinatoria.
Problemas 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
5
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
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
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
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
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
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 digrafos
6
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
6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos
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
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
f ∶ A Ð→ R
A′ z→ f (A′ ) = ∑ wij
(i,j)∈A′
f (A′ ) = 2 + 1 + 6 = 9
6
2. Problema de la ordenación lineal
Definición y representación mediante digrafos
f ∶ A Ð→ R
A′ z→ f (A′ ) = ∑ wij
(i,j)∈A′
6
2.Problema de la ordenación lineal
Equivalencia entre las representaciones
7
2.Problema de la ordenación lineal
Equivalencia entre las representaciones
7
2.Problema de la ordenación lineal
Equivalencia entre las representaciones
7
2.Problema de la ordenación lineal
Equivalencia entre las representaciones
7
2.Problema de la ordenación lineal
Propiedades (I)
8
2.Problema de la ordenación lineal
Propiedades (I)
8
2.Problema de la ordenación lineal
Propiedades (I)
8
2.Problema de la ordenación lineal
Propiedades (I)
8
2.Problema de la ordenación lineal
Propiedades (II)
9
2.Problema de la ordenación lineal
Propiedades (II)
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)
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
Vecindario adyacente
10
2. Problema de la ordenación lineal
Vecindario adyacente
10
2. Problema de la ordenación lineal
Vecindario adyacente
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
Lema
El vecindario adyacente de σ ∈ Sn está formado por n − 1
permutaciones.
10
2. Problema de la ordenación lineal
Vecindario adyacente
Teorema
Dado σ ∗ = (σ1∗ σ2∗ ....σn∗ ) ∈ Sn alcanza el óptimo local ⇐⇒ los
elementos de la matriz B = [bij ]n×n del LOP satisfacen:
10
2.Problema de la ordenación lineal
Vecindario intercambio
11
2.Problema de la ordenación lineal
Vecindario intercambio
11
2.Problema de la ordenación lineal
Vecindario intercambio
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
Lema
n(n−1)
El vecindario intercambio de σ ∈ Sn está formado por 2
permutaciones.
11
2.Problema de la ordenación lineal
Vecindario intercambio
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
12
2.Problema de la ordenación lineal
Vecindario inserción
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
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
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
13
3. Métodos exactos
Búsqueda exhaustiva
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)
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
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
19
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
19
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
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.
22
4. Métodos de resolución metaheurı́sticos.
Algoritmos genéticos aplicados al LOP.
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
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
27
6.Conclusiones y trabajo futuro
Conclusiones método metaheurı́stico propuesto
27
6.Conclusiones y trabajo futuro
Conclusiones método metaheurı́stico propuesto
27
6.Conclusiones y trabajo futuro
Trabajo futuro
28
6.Conclusiones y trabajo futuro
Trabajo futuro
28
6.Conclusiones y trabajo futuro
Trabajo futuro
28
6.Conclusiones y trabajo futuro
Trabajo futuro
28
6.Conclusiones y trabajo futuro
Trabajo futuro
28
6.Conclusiones y trabajo futuro
Trabajo futuro
29
6.Conclusiones y trabajo futuro
Trabajo futuro
29
6.Conclusiones y trabajo futuro
Trabajo futuro
29
6.Conclusiones y trabajo futuro
Trabajo futuro
29
6.Conclusiones y trabajo futuro
Trabajo futuro
29
Estudio del problema de la
ordenación lineal (LOP) y propuesta
de métodos de resolución.
30