Page 1
ANÁLISIS DE LAS ESTRATEGIAS ANTIBUCLES DE MILLER-TUCKER- ZEMLIN Y
DESROCHERS-LAPORTE PARA EL PROBLEMA DE STEINER EN GRAFOS
Proyecto Fin de Carrera
Ingeniería Industrial
ANÁLISIS DE UNA FORMULACIÓN POR
NIVELES PARA MODELAR EL
PROBLEMA DE STEINER EN GRAFOS
Autor: David Rubio López
Tutor: José Manuel García Sánchez
Dto. Organización Industrial y Gestión
de empresas I
Escuela Técnica Superior de Ingeniería
Universidad de Sevilla
Sevilla, 2018
Page 2
Proyecto Fin de Carrera
Ingeniería Industrial
ANÁLISIS DE UNA FORMULACIÓN POR
NIVELES PARA MODELAR EL PROBLEMA DE
STEINER EN GRAFOS
Autor:
David Rubio López
Tutor:
José Manuel García Sánchez
Profesor asociado:
Dep de Organización Industrial y Gestión de Empresas
Escuela Técnica Superior de Ingeniería
Universidad de Sevilla
Sevilla 2018
Page 3
Proyecto Fin de Carrera: ANÁLISIS DE UNA FORMULACIÓN POR NIVELES PARA MODELAR EL PROBLEMA DE
STEINER EN GRAFOS
Autor: David Rubio López
Tutor: José Manuel García Sánchez
El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros:
Presidente:
Vocales:
Secretario:
Acuerdan otorgarle la calificación de:
Sevilla, 2018
El Secretario del Tribunal
Page 4
AGRADECIMIENTOS
Agradezco a mi familia, amigos y profesores tales como José Manuel García Sánchez a finalizar una gran
etapa de aprendizaje y superación en la Escuela Técnica Superior de Ingeniería de la Universidad de Sevilla.
Gracias a todos.
Page 5
ÍNDICE
1. OBJETO DEL PROYECTO ................................................................................................................................ 8
2. EL PROBLEMA DE STEINER .......................................................................................................................... 9
2.1 Aplicaciones del problema de Steiner ..................................................................................................... 11
2.1.1 Aplicación en rutas de distribución .................................................................................................. 12
2.1.2 Aplicación en red de plataformas logísticas ..................................................................................... 13
2.1.3 Aplicaciones en diseño de redes ....................................................................................................... 14
3. MODELOS MATEMÁTICOS UTILIZADOS .................................................................................................... 15
3.1 Modelo de optimización: el Problema de Steiner .................................................................................... 17
3.2 Estrategia por niveles .............................................................................................................................. 19
4. IMPLEMENTACIÓN DE LOS MODELOS EN LINGO ...................................................................................... 22
4.1 Formato abstracto: Uso de conjuntos ...................................................................................................... 24
4.2 Caso propio: Elaboración del modelo en Lingo ...................................................................................... 29
5. RESULTADOS EXPERIMENTALES ................................................................................................................ 40
5.1 Resultados obtenidos ............................................................................................................................... 42
5.2 Comparativa estrategia por niveles frente a estrategia de flujo ............................................................... 50
6. BIBLIOGRAFÍA ............................................................................................................................................ 53
7. ANEXOS ...................................................................................................................................................... 54
7.1 Problema en formato .txt ......................................................................................................................... 54
7.2 Tabla de óptimos de problemas tipo “b” ................................................................................................. 55
7.3 Código Visual Basic ................................................................................................................................ 56
7.3.1 Código para importar archivo .txt a Microsoft Excel ....................................................................... 56
7.3.2 Código para crear matrices de adyacencia, Xij, costes y escribir modelo en formato Lingo .lg4 .... 61
7.3.3 Modelo en formato Lingo .lg4 .......................................................................................................... 70
Page 6
ÍNDICE DE FIGURAS
Fig 1 Grafo de Steiner
Fig 2 Soluciones admisibles grafo de Steiner
Fig 3 Red de telecomunicaciones
Fig 4 Logo Amazon Flex
Fig 5 Spot Amazon Prime
Fig 6 Andenes plataforma logística
Fig 7 Plan estratégico de infraestructuras y transporte C. Torres 2005
Fig 8 Conexionado servidor rack
Fig 9 Estructura diseño red de trabajo
Fig 10 Grafo de Steiner no orientado
Fig 11 Matriz de adyacencia
Fig 12 Matriz de costes
Fig 13 Logo Software Lingo
Fig 14 Barra de herramientas Lingo
Fig 15 Ventana simulación Lingo
Fig 16 Diagrama de flujo de información
Fig 17 Logo Microsoft Visual Basic for Applications
Fig 18 Interface Programa Excel
Fig 19 Matriz de adyacencia
Fig 20 Matriz Xij
Fig 21 Matriz de costes
Fig 22 Logotipo programa Grafos
Fig 23 Grafo Steinb1
Fig 24 Batería de problemas Lingo
Fig 25 Copia de seguridad por fecha
Fig 26 Esquema periodos
Fig 27 Distribución nodos,arcos y periodos problemas Steiner
Fig 28 Distribución nodos,arcos y periodos problemas Steiner tipo b
Fig 29 Tiempo resolución por periodo
Page 7
pág. 7
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Fig 30 Tiempo estrategia por niveles nodo raíz no forzado
Fig 31 Tiempo estrategia por niveles nodo raíz forzado
Fig 32 Comparativa tiempo estrategia por niveles vs niveles raíz forzado vs flujo simple vs flujo múltiple
Fig 33 Comparativa error estrategia por niveles vs niveles raíz forzado vs flujo simple vs flujo múltiple
Page 8
pág. 8
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
1. OBJETO DEL PROYECTO
El Problema de Steiner, al que hace referencia dicho Proyecto consiste en buscar la interconexión más corta
(árbol mínimo) entre varios puntos de una red. Fue propuesto por el matemático alemán Jacob Steiner a
principios del siglo XIX.
Debido a que es un problema genérico, se puede aplicar para muchas situaciones tales como redes de
transporte, abastecimiento y sobre todo de telecomunicaciones.
En nuestro caso, dicho proyecto comparará varias estrategias de resolución basadas en formulación
matemática tales como la estrategia de resolución por niveles, una variante de la anterior y la estrategia de
flujo ya que no existe ningún estudio previo que realice esta tarea.
Esto no quiere decir que estas sean las únicas estrategias que existen, ya que también existen otras tales
como las estrategias de antibucles de Miller-Tucker-Zemlin y Desrochers-Laporte [5].
Esta comparativa se llevará a cabo gracias a una batería de problemas de nodos y grafos planteados en la
OR library [8] mantenida por J.Beasley, en la página web del departamento de investigación operativa del
Imperial College de Londres.
Existen un amplio conjunto de problemas como se puede observar en la librería anteriormente descrita que
van desde problemas Stein con menor número de nodos y nodos terminales hasta problemas con una
cantidad muy considerable de nodos y arcos.
Estos problemas varían en su tamaño (número nodos y arcos, y nodos terminales) y afectan al tiempo de
resolución del problema. En nuestro caso solo vamos a poder estudiar los del tipo b como se explicará más
adelante.
Los problemas descritos anteriormente están expresados en formato “.txt” el cual hay que tratar para
alimentar al modelo en Lingo que es la aplicación para resolver modelos matemáticos que usa la extensión
“.lg4”. Para la exportación de esta información a Lingo se ha usado programación en Visual Basic en el
entorno gráfico de Excel.
En los siguientes apartados se desarrollará más en profundidad tantos el problema de Steiner y sus
aplicaciones, como la estrategia utilizada para la resolución y los datos extraídos de su simulación.
El documento seguirá la siguiente estructura, en el primer capítulo se expondrá brevemente el problema de
Steiner de forma teórica y con grafos para una fácil comprensión. También se introducirán algunas de las
aplicaciones más usadas para este problema.
A continuación, veremos los modelos matemáticos utilizados para su resolución y los implementaremos a
través del Programa Lingo para resolución de modelos matemáticos, obteniendo con esto resultados de
nuestra experimentación por niveles con la cual podremos compararla con la estrategia de flujo simple y
múltiple.
Al final de nuestro documento podremos contrastar los resultados obtenidos y sacar conclusiones de dicho
modelo.
Page 9
pág. 9
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
2. EL PROBLEMA DE STEINER
Dicho problema fue propuesto por el matemático alemán Jacob Steiner a principios del siglo XIX y consiste
en encontrar el árbol mínimo que interconecta varios nodos de una red modelada como un grafo con costes
asociados a sus arcos.
El problema de Steiner tiene aplicaciones tanto en el diseño de circuitos eléctricos y redes de
telecomunicaciones como en redes de transporte y distribución y consiste en conseguir unir todos los nodos
terminales mediante caminos con un mínimo costo.
Este árbol es un grafo no dirigido en el cual para unir todos los nodos terminales puede ser necesario pasar
por otros nodos no terminales llamados de Steiner.
Por norma general, la solución óptima no es trivial de calcular y la mayoría de las versiones del Problema
de Steiner son NP-Completo. De hecho, uno de estos pertenece a la lista de 21 problemas NP-Completos
de Karp (problemas computacionales famosos que tratan sobre combinatoria y teoría de grafos, y que
comparten la característica de pertenecer a la clase de complejidad NP-Completos).
La resolución del Problema de Steiner es un problema de optimización combinatoria. En estos problemas
las variables de decisión son enteras, es de decir, el espacio de soluciones está formado por ordenaciones
o subconjuntos de números naturales. En este caso, se trata de hallar el mejor valor de entre un número
finito o numerable de soluciones viables. A pesar de ello la enumeración de este conjunto resulta
prácticamente imposible, aún para problemas de tamaño moderado.
La resolución de estos problemas se realiza normalmente a través de lenguajes imperativos como Basic,
C++, etc.
El Problema de Steiner se puede definir como:
Un grafo no dirigido G= (N, A) siendo N el número de nodos y A el número de aristas. Existe un N’c N
subconjunto de nodos al que llamaremos Terminales. También podemos definir los nodos Steiner S c N’-
N. Dichos N’ (nodos terminales) deben incluirse obligatoriamente en la solución mientras que los nodos
Steiner sirven de interconexión entre los nodos terminales y pueden formar o no parte de la solución óptima
si lo requiere el problema.
El objeto de dicho problema es encontrar un subgrafo conexo que cubra todos los nodos terminales y que
sea de coste mínimo.
Page 10
pág. 10
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Nodo Terminal
Nodo Steiner
Fig 1 Grafo de Steiner
En las figuras siguientes podemos ver que un grafo puede tener distintas soluciones admisibles en las que
se encuentran todos los nodos terminales conectados y los Steiner pueden estar o no conectados.
Fig 2 Soluciones admisibles grafo de Steiner
Como explicaremos más adelante, todos los nodos terminales tendrán un padre excepto si ese nodo terminal
es raíz así como también tendrán un padre los nodos Steiner que pertenezcan a la red óptima.
La solución óptima del árbol tendrá N’+S-1 arcos conexos, siendo N’ el número de nodos terminales y S el
número de nodos Steiner.
Page 11
pág. 11
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
2.1 Aplicaciones del problema de Steiner
Debido a los rasgos generales del problema, las aplicaciones son muy variadas y alberga multitud de
ámbitos tan variados como el transporte, distribución, electrónica, medición de homogeneidad molecular
en materiales, verificación de rostros en tiempo real, protocolos de internet, etc.
En la actualidad, los campos que abarca este problema y sus aplicaciones aumentan al denotarse una gran
efectividad en la resolución de los modelos.
Fig 3 Red de telecomunicaciones
Page 12
pág. 12
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
2.1.1 Aplicación en rutas de distribución
Como hemos podido ver en las noticias en el último mes, la empresa Amazon va a abrir el reparto de sus
productos a repartidores “low cost” con coche propio, carnet y que sean autónomos a través de su sección
Amazon Flex.
Fig 4 Logo Amazon Flex
Debido al poco margen con el que van a contar, sería una buena idea aplicar este algoritmo para minimizar
los costes por desplazamiento (gasolina, desgaste de vehículo y tiempo de reparto) que van a sufrir dichos
trabajadores va a ser considerable si no lo organizan correctamente pudiendo salir negativo en el peor de
los casos.
Para ello, como coste de arco habría que tomar el tiempo entre los distintos hogares a repartir gracias a
programas de tráfico como Google Maps o similares. Los nodos terminales serían los hogares a los que
tiene que repartir próximamente y los nodos Steiner los que tiene que repartir una vez finalizados los
primeros.
Una vez encontrada la solución óptima con la posibilidad de incorporar los nodos Steiner a la solución
final, habría que comprobar que ese recorrido es factible en términos de consumo de carburante, desgaste
de vehículo y amortización de este simulando esa ruta, aunque teniendo en cuenta ahora que el coste de los
arcos será el coste que acabamos de comentar.
Simulando este caso podría ocurrir que con una ruta óptima también fuera posible repartir en algunos
hogares Steiner ya que están de camino a los hogares Terminales.
Fig 5 Spot Amazon Prime
Page 13
pág. 13
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
2.1.2 Aplicación en red de plataformas logísticas
Otro caso en el que tiene y tendría gran impacto la aplicación del problema de Steiner sería en el ámbito
de las plataformas logísticas en una red de distribución por carretera.
Fig 6 Andenes plataforma logística
Si tomamos como nodos terminales de nuestro grafo los clientes potenciales de nuestro sector industrial y
elegimos como nodos de Steiner las capitales donde sería factible utilizar una plataforma logística ya
existente, al modelar y resolver el problema encontraríamos las plataformas nexos de unión que serían
útiles para nuestro negocio y tener acceso con mayor facilidad al comercio con nuestro cliente final.
Esto supondría una disminución de costes de transporte y una mayor flexibilidad y reacción de respuesta
ante aumentos de demanda no planificados.
Fig 7 Plan estratégico de infraestructuras y transporte C. Torres 2005
Page 14
pág. 14
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
2.1.3 Aplicaciones en diseño de redes
Actualmente debido a la necesidad de redes de comunicación cada vez más complejas, el diseño de redes
de comunicación confiables se ha convertido en una de las principales aplicaciones para la aplicación del
problema de Steiner.
Fig 8 Conexionado servidor rack
El objetivo de este diseño se basa en la disminución en coste debido a la multitud de conexiones siempre
y cuando se mantenga la confiabilidad de la red.
El problema de Steiner sin modificación no sería aplicable a la mayoría de casos prácticos ya que la caída
de cualquier nodo haría imposible la comunicación al resto de ellos y para solventar este problema habría
que añadir restricciones de confiabilidad que solvente este problema.
Fig 9 Estructura diseño red de trabajo
Page 15
pág. 15
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
3. MODELOS MATEMÁTICOS
UTILIZADOS
Como hemos comentado anteriormente, este proyecto va a tomar la estrategia por niveles para resolver el
problema de Steiner y los va a comparar con los resultados obtenidos de la estrategia de flujo simple y con la
estrategia de flujo múltiple.
Este problema se va a formular siguiendo modelos de optimización lineal ya que estos representan la realidad de
la forma más fiel.
La programación lineal es un modelo matemático que se desarrolló tras la segunda Guerra Mundial como
necesidad de resolver problemas de asignación de recursos.
Dicha formulación fue creada por por George B. Dantsig sobre el 1947. Este consejero matemático de la fuerza
Aérea de los Estados Unidos creó un sistema automático de planificación temporal de despliegue y
abastecimiento logístico.
El nombre de programación lineal fue acuñado por el economista y matemático T.C. Koopmans cuando
colaboraba con Dantsig.
La programación lineal estudia la optimización (minimización o maximización) de una función lineal que
satisface unas restricciones lineales de igualdad y/o desigualdad. De dichos resultados podemos sacar
conclusiones que nos ayuden en la toma de decisiones ante problemas de distribución de recursos y reducción de
costes.
Existen varios puntos necesarios para crear un modelo matemático de este tipo:
• Variables de decisión: Son elementos del sistema a modelar que son controlables por el decisor. Toman
valores números reales y son representados con letras con subíndices como x 1, x 2
También se pueden expresar como vectores.
X=( x 1, x 2, )
• Restricciones. Son las limitaciones o casos no posibles de las variables de decisión. Se expresan como
igualdades y desigualdades de las variables de decisión.
gi (x)bi; gi (x)=bi; gi (x) bi;
i=1,…m; con gi una función lineal en x
• Función objetivo. Es la ecuación a optimizar (minimizar o maximizar). Es la que nos da la información
de la calidad de optimización que vamos buscando con este modelo.
Maximizar z=f(x); Minimizar z=f(x)
Page 16
pág. 16
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Seguidamente podemos ver un ejemplo de programación lineal.
Unos grandes almacenes encargan a un fabricante pantalones y chaquetas deportivas.
El fabricante dispone para la confección de 750 m de tejido de algodón y 1000 m de tejido de poliéster.
Cada pantalón precisa 1 m de algodón y 2 m de poliéster. Para cada chaqueta se necesitan 1.5 m de
algodón y 1 m de poliéster.
El precio del pantalón se fija en 50 € y el de la chaqueta en 40 €.
¿Qué número de pantalones y chaquetas debe suministrar el fabricante a los almacenes para que estos
consigan un beneficio máximo?
Nuestras variables de decisión serán:
x = número de pantalones
y = número de chaquetas
Nuestra función objetivo la podemos escribir:
f(x,y)= 50x + 40y
Para escribir las restricciones nos ayudaremos de la siguiente tabla:
Pantalones Chaquetas Disponible
Algodón 1 1,5 750
Poliéster 2 1 1000
x+1,5y<=750
2x+y<=1000
Como el número de pantalones y chaquetas son números naturales habrá que añadir también las
siguientes restricciones:
x>=0
y>=0
De esta forma se construiría el modelo matemático del problema lineal que hemos planteado.
Page 17
pág. 17
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Nodo Terminal
Nodo Steiner
Nodo Steiner
Arco orientado
3.1 Modelo de optimización: el Problema de Steiner
Tal y como hemos comentado anteriormente, existen hasta la fecha distintas técnicas para la resolución de este
problema, aunque ninguna que lo resuelva en tiempo polinomial ya que se probó que era del tipo NP-Completo.
Debido a la dificultad de resolución del problema, ya que solo es factible para instancias de tamaño muy
limitado, es necesario en la mayoría de los casos recurrir a técnicas heurísticas para poder generar soluciones
a bajo costo con un consumo razonable de tiempo de ejecución.
En nuestro caso, sea G= (N,A) un grafo con coste definido en cada arco. Siendo T un grupo de nodos llamados
Terminales los cuales tienen que estar conectados con el resto, necesitamos encontrar un árbol de G que
contenga estos nodos terminales y cuyo total de coste de arcos sea tan pequeño como pudiera ser. En el óptimo
del problema puede contener nodos no Terminales llamados de Steiner que son necesarios para encontrar el
árbol de expansión mínimo que una los nodos Terminales y cuyo coste total sea mínimo.
Nuestra estrategia parte de un nodo terminal al que llamaremos raíz. Hay que recalcar que como nodo raíz
puede ser cualquiera que sea terminal. El resto de nodos tanto terminales como Steiner tendrán un padre o
nodo anterior a ellos.
Nuestro grafo se compone de arcos no orientados los cuales tienen un coste asociado Cij. Debido a ser no
orientados, el arco puede ser tanto Xij como Xji siendo su coste asociado el mismo de Cij como de Cji. Véanse
las siguientes imágenes.
Fig 10 Grafo de Steiner no orientado
Arco no orientado Equivalencia del arco no orientado
Page 18
pág. 18
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Matriz de adyacencia
Fig 11 Matriz de adyacencia
Matriz de costes
Fig 12 Matriz de costes
Page 19
pág. 19
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
3.2 Estrategia por niveles
Se explicarán a continuación los elementos que van a tomar parte en esta estrategia
ELEMENTOS TIPO VARIABLEAS
ASOCIADAS DATOS ASOCIADOS
Nodos i= 1…N Alfa(i), binario. Terminal(i), binario
Arcos (i,j), (j,i) X(i,j), binario. C(i,j), entero
Nodos_Periodos (i, p) Beta(i,p), binario
N es el total de Nodos del problema.
A es el total de Arcos del problema.
P es el total de periodos del problema.
T es el total de terminales del problema.
A continuación se explican las variables que conforman nuestro problema:
• Terminal(i) es una variable binaria que indica si el nodo i es terminal (Terminal(i)=1) y 0 si no lo es
(Terminal(i)=0).
• Costes(i,j) es una variable entera que representa el peso de los arcos entre los nodos i y j.
Seguidamente se apuntarán las variables de decisión del problema:
• X(i,j) es una variable binaria que nos indica si existe arco entre los nodos representados por i y j cuando
vale 1 (X(i,j)=1) y cero en el caso contrario.
• Alfa(i) es una variable binaria que indica si el nodo i es raíz (Alfa(i)=1) y 0 si no lo es (Alfa(i)=0).
• Beta(i,t) es una variable binaria que nos indica si el nodo i ha entrado en la red en el periodo t.
Los valores de estas variables de decisión serán tomadas conforme el modelo vaya requiriendo debido a las
especificaciones del problema ya que no están definidas previamente como el coste, arcos, nodos o periodos.
En este modelo, tal y como comentamos más adelante, el nodo raíz no lo fijamos y se escoge en función de las
necesidades del problema.
En la siguiente página podremos ver como se constituye nuestro modelo matemático caracterizado por su
función objetivo y restricciones asociadas a esta. Podremos observar que no es un modelo excesivamente
complejo excepto por el funcionamiento de alguna restricción que comentaremos más adelante.
Page 20
pág. 20
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Nuestro modelo quedaría como sigue:
[1]𝑀𝑖𝑛 ∑ 𝐶𝑖𝑗 ∗ 𝑋𝑖𝑗
(𝑖,𝑗)∈𝐴
s.a:
[2] ∑ 𝑋𝑖𝑗 ≥ 1 − 𝛼𝑖
(𝑖,𝑗)∈𝐴
∀𝑖: 𝑇𝑖 = 1
[3] ∑ 𝛽𝑖𝑝 = 1
𝑝∈𝑃
∀𝑖: 𝑇𝑖 = 1
[4] ∑ 𝛼𝑖
𝑖∈𝑁
≤ 1 ∀𝑖
[5] ∑ 𝑇𝑖 ∗ 𝛼𝑖 ≤ 1
𝑖∈𝑁
∀𝑖
[6] 𝑋𝑖𝑗 + 𝛽𝑖𝑝 ≤ 1 + 𝛽𝑗, 𝑝 − 1 ∀𝑝 > 1: (𝑖, 𝑗) ∈ 𝐴
[7] 𝛽𝑖1 = 𝛼𝑖 ∀𝑖
[8] ∑ 𝑋𝑖𝑗 ≥ ∑ 𝛽𝑖𝑝
𝑖∈𝑁;𝑝∈𝑃(𝑖,𝑗)∈𝐴
∀𝑖: 𝑇𝑖 = 0
[9] 𝑋𝑖𝑗, 𝛽𝑖𝑝 ∈ {0,1}
A continuación vamos a explicar tanto la función objetivo [1] como las restricciones asociadas [2]-[9].
[1] Nuestra función objetivo busca minimizar el coste (Cij) de unir todos los nodos terminales a través de los
arcos de la red (Xij)
[2] Esta restricción nos escoge al simular que nodo terminal queremos que sea el raíz del grafo y se cumple
igualdad cuando el nodo no es raíz (0=0) y la desigualdad cuando el nodo terminal es raíz (1>0).
[3] Esta restricción nos ayuda a que no se formen ciclos en el grafo marcando sólo un nodo por periodo. Para
los nodos terminales, la variable binaria 𝛽 = 1en el periodo p que se una ese nodo con su padre.
[4] Esta restricción nos convierte la variable 𝛼en binaria.
Page 21
pág. 21
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
[5] Esta restricción nos obliga a que de todos los nodos terminales, sólo uno de ellos sea raíz siendo 1=1 la
ecuación cuando seleccionamos al nodo raíz y 0 ≤ 1 cuando seleccionamos otro nodo terminal cualquiera.
[6] Esta restricción hace que para los periodos 𝑝 > 1 todos los nodos ya sean terminales o Steiner que formen
parte de la solución tengan un padre o nodo con el que está unido. La ecuación queda 1+1=1+1 si el nodo es
terminal o Steiner y 1+0<=1+1 si el nodo i no es hijo de j.
[7] Esta restricción asigna al nodo raíz el periodo 1 y hace a la variable 𝛽 = 1.
[8] Esta restricción hace que para los nodos que no son terminales, puedan entrar o no en la red si fuera
necesario. Si el nodo no terminal entra a la red óptima este será un nodo Steiner y la ecuación será 1=1 y 1>0
en el caso que el nodo no entre en la red óptima.
[9] Esta restricción convierte a la variable 𝛽en binaria.
En resumen:
1 si j es el padre de i
Xij
0 si no
1 si i se incorpora a la red en el periodo p
𝛽𝑖𝑝
0 si no
1 si i es el nodo raíz
𝛼𝑖
0 si no
Una variante del modelo anterior es en la cual el nodo raíz lo fijamos en un nodo terminal concreto.
En nuestro nuevo modelo solo se introducen 2 nuevas restricciones que son las siguientes:
[10]𝛼𝑖 = 1 𝑡𝑜𝑚𝑎𝑛𝑑𝑜 𝑐𝑜𝑚𝑜 𝑖 𝑒𝑙 𝑛𝑜𝑑𝑜 𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑙 𝑞𝑢𝑒 𝑒𝑙𝑖𝑗𝑎𝑚𝑜𝑠
Si el nodo 4 es terminal, podríamos tomar 𝛼4 = 1
[11] 𝛼𝑖 ∈ {0,1}
Con esto fijamos nuestro nodo raíz y eliminamos una variable de nuestro modelo que pasa a ser ahora
dato.
Estudiaremos con resultados el funcionamiento de esta segunda variante.
Page 22
pág. 22
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
4. IMPLEMENTACIÓN DE LOS
MODELOS EN LINGO
LINGO es una herramienta integral diseñada para construir y resolver modelos de optimización lineal, no
lineal (convexo y no convexo / global), cuadrático, de constricción cuadrática, cono de segundo orden, semi-
definido, estocástico y entero más rápido, fácil y eficiente. LINGO proporciona un paquete completamente
integrado que incluye un lenguaje potente para expresar modelos de optimización, un entorno con todas las
características para crear y editar problemas, y un conjunto de solucionadores integrados rápidos
Fig 13 Logo Software Lingo
Gracias a este programa, podremos reducir el tiempo de desarrollo y formular problemas lineales, no lineales
y enteros rápidamente de forma legible y ordenada.
El lenguaje de modelado propio de Lingo facilita expresar de manera sencilla utilizando sumas y variables con
subíndices al igual que se haría con lápiz y papel. También puede explotar múltiples núcleos de CPU para una
simulación más rápida.
También permite crear modelos a partir de hojas de cálculo o archivos de texto facilitando así la fabricación
en serie de archivos ejecutables Lingo.
Page 23
pág. 23
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
El formato básico que emplea Lingo está constituido por los siguientes puntos:
1. Encabezado
Define el inicio del modelo.
MODEL:
2. Función Objetivo
Es la función que queremos minimizar o maximizar
MAX= 20000*X+15000*Y;
3. Restricciones del problema
Son las reglas que van a hacer que las variables del problema tomen unos datos u otros y satisfagan
la función objetivo.
1*X+2*Y<=80;
3*X+2*Y<=120;
X>=0;
Y>=0;
4. Restricciones asociadas al tipo de variable
Las variables por defecto son continuas (>=0)
Ejemplo si la variable es entera: @GIN(X)
Ejemplo si la variable es binaria: @BIN(X)
Ejemplo si la variable es libre: @FREE(X)
5. Fin
Es necesario finalizar el modelo con END
Hay que tener en cuenta lo siguiente para modelar el problema:
Lingo ignora las líneas en blanco haciendo más ordenado y visible nuestro modelo.
Para escribir comentarios hay que precederlos por ! y cerrar con ; .
No distingue entre mayúsculas y minúsculas.
Longitud máxima de una línea es de 512 caracteres.
Page 24
pág. 24
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
4.1 Formato abstracto: Uso de conjuntos
Para problemas complejos y con mayor número de datos, variables y restricciones es más sencillo y
visualmente atractivo utilizar la forma simplificada (abstracta).
Para ello hacemos uso de conjuntos. Existen 2 tipos:
Conjuntos primitivos: Recogen los actores conjunto del problema y sus atributos propios o compartidos
con actores que no estén en un conjunto.
Conjuntos derivados: Recogen las características compartidas entre actores conjunto. Están formados,
por tanto, por los actores primitivos ya definidos. Las características solo se definen una vez.
Los actores que no forman conjunto no es necesario definirlos. Se definirán en la sección DATA.
Para definir los conjuntos contamos con:
• Sección SET: Definición de los nombres y números de elementos de los conjuntos
• Sección DATA: Definición de los valores de las características.
Podemos ver un ejemplo:
Una empresa elabora tres tipos de piensos usando cuatro tipos de cereales. Cada saco de pienso contiene
50 kg y se vende al precio indicado en la tabla siguiente, que contiene también la composición de cada
saco y las existencias de cereales en la fábrica.
Pienso Avena Maíz Cebada Mijo Precio
1 25 25 0 0 9
2 0 20 20 10 12
3 20 0 30 0 6,2
Existencias 50000 80000 40000 10000
Determina el número de sacos que deberá producir la empresa de cada tipo de pienso para maximizar el
ingreso (supuesto que vende toda la producción).
Page 25
pág. 25
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
El modelo matemático queda de la siguiente forma:
Max. 9x+12y+6.2z
s.a 25x+20z<=50000
25x+20y<=80000
20y+30z<=40000
10y<=10000
x,y,z >=0
En Lingo sería:
MODEL:
SETS:
Cereal: Existencias;
Pienso/1..3/:Precio, Sacos;
Pareja(Pienso, Cereal): Cantidad;
ENDSETS
DATA:
Cereal = Avena Maiz Cebada Mijo;
Cantidad = 25 25 0 0
0 20 20 10
20 0 30 0;
Existencias = 50000 80000 40000 10000;
Precio = 9, 12, 6.20;
ENDDATA
[Ingresos] Max = @Sum(Pienso(p): precio(p)*Sacos(p));
@For(Cereal(c):[Limite] @Sum(Pienso(p): Cantidad(p,c)*Sacos(p))<Existencias(c));
END
Como podemos ver en la programación del modelo y hemos explicado anteriormente, Lingo permite
programar modelos con conjuntos de índices. Como ventajas de definir conjuntos tenemos:
• Ecuaciones independientes de los datos permitiéndonos interactuar y modificar datos sin influir
en las fórmulas e importar dichos datos desde otro documento.
• Se pueden introducir todas las ecuaciones siguiendo un mismo esquema como una fórmula
general.
La palabra SETS: y ENDSETS: determinan el rango en el que vamos a definir los conjuntos.
Definimos primero el nombre del conjunto y sus elementos entre barras / / y separadas por : las variables
asociadas.
Page 26
pág. 26
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
En el ejemplo anterior podemos ver como el conjunto Cereal tiene como elementos a Avena, Maíz,
Cebada, Mijo, que hemos declarado en la sección DATA y a esas variables le hemos asociado una
variable Existencias.
Existencias(Avena), Existencias(Maiz), Existencias(Cebada) y Existencias(Mijo).
El mismo procedimiento hemos seguido con el conjunto Pienso definiendo Precio y Sacos, de modo que
tenemos seis nuevas variables, Precio(1), Precio(2), Precio(3), Sacos(1), Sacos(2), Sacos(3).
La definición Pareja(Pienso, Cereal) establece que el conjunto Pareja está formado por todos los pares
de un pienso y un cereal. Cada pareja tiene asociada una variable Cantidad, de modo que hemos definido
12 nuevas variables Cantidad(1, Avena), etc.
Tras definir la sección SETS y DATA pasamos a modelar la función objetivo y restricciones.
La línea de la función objetivo empieza siempre con un Min o Max =. En nuestro caso podemos leer:
“Suma para todo pienso p del precio p por el número de sacos producidos de p”.
En general, dentro de @Sum() ponemos el nombre de un conjunto seguido de una nueva variable (en este
caso p), que hace referencia a un elemento genérico del conjunto, luego : y la expresión (en función de p)
que queremos sumar para todo p.
La segunda línea define simultáneamente cuatro restricciones, una para cada cereal. Podemos leer: “Para
todo cereal c, definimos la restricción etiquetada [Limite] como que la suma para todo pienso p de la
cantidad de cereal c en el pienso p por el número de sacos producidos de p ha de ser ≤ que las existencias
de c”. La sintaxis de @For() es la misma que la de @Sum(). Escribimos el nombre de un conjunto con
una nueva variable entre paréntesis (en este caso c), luego : y luego lo que queremos que LINGO haga
para cada valor de c.
Las instrucciones de Lingo para recorrer los elementos de un conjunto son:
@For(Conjunto(i): ) Repite una tarea para todo i
@Sum(Conjunto(i): ) Suma una expresión para todo i
@Prod(Conjunto(i): ) Multiplica una expresión para todo i
@Max(Conjunto(i): ) Calcula el máximo para todo i
@Min(Conjunto(i): ) Calcula el mínimo para todo i
@Writefor(Conjunto(i): ) Escribe una expresión para todo i
En Lingo se dispone de los siguientes operadores lógicos:
#EQ# igual
#NE# no igual
#GE# mayor o igual
#GT# mayor
#LT# menor
#LE# menor o igual
#AND# y
Page 27
pág. 27
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
#OR# o (inclusivo)
#NOT# no
Tras modelar nuestro problema, presionamos en el botón Solve
Fig 14 Barra de herramientas Lingo
Obtendremos una ventana emergente que indica el estado de la simulación:
Fig 15 Ventana simulación Lingo
En esta imagen podemos ver un resumen del número de variables, restricciones, tiempo de resolución del
modelo, función objetivo, etc.
Page 28
pág. 28
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Al pulsar sobre el botón Solve también obtendremos el archivo .lgr que contiene los siguientes resultados
para nuestro ejemplo anterior una vez finalizada la resolución. También se puede interrumpir la
simulación y obtener los resultados hasta el momento.
Variable Value Reduced Cost
SACOS(1) 2000.000 0.000000
SACOS(2) 1000.000 0.000000
SACOS(3) 0.000000 1.000000
Row Slack or Surplus Dual Price
INGRESOS 30000.00 1.000000
LIMITE( AVENA) 0.000000 0.3600000
LIMITE( MAIZ) 10000.00 0.000000
LIMITE( CEBADA) 20000.00 0.000000
LIMITE( MIJO) 0.000000 1.200000
La columna Value contiene el óptimo de cada variable.
La columna Slack or Surplus, contiene a el óptimo de la función objetivo (fila INGRESOS). Los
restantes son variables de holgura que representan en este caso que para el óptimo del problema sobran
20000kg de cebada.
La columna Reduced Cost contiene a los multiplicadores de Kuhn y Tucker de las variables del problema.
La columna Dual Price contiene los multiplicadores de Khun y Tucker de las restricciones.
Page 29
pág. 29
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
4.2 Caso propio: Elaboración del modelo en Lingo
Tal y como expusimos al principio de este documento, partimos de una librería mantenida por J.Beasley [8]
en el que todos los enunciados de los problemas que vamos a modelar se encuentran en formato .txt .
La tarea de creación del modelo a partir de los datos del grafo en estos archivos de texto no es algo rápido y
fácil. Para ello vamos a crear a partir de Visual Basic para Microsoft Excel un procedimiento que nos ayude a
importar esos datos de cada archivo a Lingo y nos cree el modelo de cada problema.
Con esto conseguiremos automatizar la creación de modelos y reducir el tiempo de elaboración de estos a 0.
El flujo de información será el siguiente:
Fig 16 Diagrama de flujo de información
Inicio
Archivo en Excel con programación
Importación sencilla desde Excel del archivo .txt
Creación automática de matríz de adyacencia, costes y modelo
para las variables dadas
Exportación de datos para la creación del modelo Lingo .lg4
Simulación del modelo y guardado de datos y archivo
obtenido
Fin
Page 30
pág. 30
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
A continuación, podemos ver la estructura que tienen los archivos de texto donde podemos encontrar los datos
de cada problema:
13 19 Número de nodos y arcos totales
1 5 7
3 9 1
3 1 7
4 8 2
6 4 2
6 5 2
6 3 8
8 10 4
9 2 8
9 7 5 Nodo origen, nodo destino y coste del arco que los une (arcos no orientados)
10 2 6
11 1 8
11 2 14
12 6 8
12 10 9
12 11 2
12 13 7
12 7 15
13 9 11
8 Número de nodos terminales
4 5 6 7 8 10 11 13 Nodos terminales
41 Coste fijo a sumar a la función objetivo solución.
El siguiente paso es importar dicha información a Microsoft Excel a través de programación en Visual Basic.
Visual Basic para Excel es una herramienta muy eficaz para manipular, analizar y presentar datos. Cuando
vamos a realizar una tarea repetitiva es especialmente útil.
VBA funciona mediante ejecución de macros, que no dejan de ser procedimientos escritos en lenguaje Visual
Basic.
Fig 17 Logo Microsoft Visual Basic for Applications
El principal motivo de la elección de este método para importar los datos al modelo Lingo es la facilidad de
este lenguaje y la gran cantidad de tutoriales y guías que podemos encontrar en foros y páginas webs al
respecto.
Todo el código creado para la realización de este proyecto se adjuntará más adelante.
El primer paso por realizar es importar los datos desde los archivos de texto a Excel.
Tras escribir en la celda inferior a “Nombre problema” pulsamos en el botón Importar problema.
El código tras este botón lee de una celda determinada en una hoja del libro de Excel qué documento de toda
la batería de problemas (steinb1 a steinb18) .txt queremos abrir que esté dentro de la ruta de directorios
especificada en este código.
Page 31
pág. 31
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Fig 18 Interface Programa Excel
Tras esto tendremos los datos del archivo de texto en cuestión dentro de nuestra hoja de Excel y una matriz de
adyacencia, una matriz Xij y otra de costes. Estas matrices nos ayudarán a comprobar para los problemas
pequeños que hemos programado bien la importación de datos y corresponde con la realidad. Los diferentes
colores hacen referencia a que al ser arcos no orientados, las matrices son simétricas y por lo tanto existe el
mismo número de celdas de color agua marina que de color verde.
En la matriz Xij no se hace esta distinción de colores al venir reflejados los subíndices.
Fig 19 Matriz de adyacencia
Page 32
pág. 32
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Fig 20 Matriz Xij
Fig 21 Matriz de costes
Estas matrices nos sirven si queremos construir fácilmente la red a través de un programa llamado “Grafos”
de Alejandro Rodríguez Villalobos el cual nos ayuda a visualizar fácilmente la red de nodos y arcos.
Fig 22 Logotipo programa Grafos
Las matrices de adyacencia y costes las introduciríamos en las tablas de dicho programa y construiría
automáticamente nuestra red. Cada nodo está numerado y conectado mediante arcos con coste a los otros
nodos.
Page 33
pág. 33
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
La imagen siguiente corresponde con la red del problema Steinb1.
Nodo Terminal
Nodo Steiner
Fig 23 Grafo Steinb1
Page 34
pág. 34
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
El siguiente paso es escribir el número de periodos con los que queremos resolver el problema. Esta variable
la elegimos nosotros e iremos probando distintos periodos hasta que encontremos el que mejor resuelva el
problema. Cuando elijamos el nº que queramos pulsamos sobre “Exportar a Lingo” y nos escribirá el modelo
completo en Excel y lo exportará a un archivo con la extensión .lg4 .
Fig 24 Batería de problemas Lingo
Gracias a esto podremos crearnos una batería de modelos de forma casi inmediata.
También disponemos de un botón llamado “Guardar por fecha” para hacer copias de seguridad del
documento Excel. Esta copia de seguridad tendrá de nombre la hora y fecha de guardado. Es útil para realizar
pruebas en la programación de Excel y no sobrescribir ficheros.
Fig 25 Copia de seguridad por fecha
En la imagen siguiente podemos ver el modelo del problema Steinb1 con 3 periodos generado en Lingo.
!Problema Steiner steinb1 Periodos t=4;
MODEL:
SETS:
Nodos/1..13/:Alfa,Terminal;
Arcos(Nodos,Nodos)/1 5,5 1,3 9,9 3,3 1,1 3,4 8,8 4,6 4,4 6,6 5,5 6,6 3,3 6,8
10,10 8,9 2,2 9,9 7,7 9,10 2,2 10,11 1,1 11,11 2,2 11,12 6,6 12,12 10,10
12,12 11,11 12,12 13,13 12,12 7,7 12,13 9,9 13/:X,Costes;
Periodos/1..4/;
Nodos_Periodos(Nodos,Periodos):Beta;
ENDSETS
DATA:
Costes=7,7,1,1,7,7,2,2,2,2,2,2,8,8,4,4,8,8,5,5,6,6,8,8,14,14,8,8,9,9,2,2,7,7,
15,15,11,11;
Page 35
pág. 35
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Terminal=0,0,0,1,1,1,1,1,0,1,1,0,1;
ENDDATA
MIN=41+@SUM(Arcos(i,j):X*Costes);
@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Arcos(i,j):X(i,j))>=1-Alfa(i));
@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Periodos(t):Beta(i,t))=1);
@SUM(Nodos(i):Alfa(i)) <=1;
@SUM(Nodos(i):Terminal(i)*Alfa(i)) <=1;
@For(Periodos(t)|t#GT#1:@for(Arcos(i,j):x(i,j)+Beta(i,t)<=1+Beta(j,t-1)));
@FOR(Nodos(i):Beta(i,1)=Alfa(i));
@FOR(Nodos(i)|Terminal(i)#EQ#0:@SUm(Arcos(i,j):x(i,j))>=@Sum(Nodos_Periodos(i
,t):Beta(i,t)));
@FOR(Nodos_Periodos(i,t): @Bin(Beta(i,t)));
END
Ahora vamos a pasar a describir parte por parte el modelo para el problema Steinb1 de 3 periodos.
Los problemas en Lingo comienzan con MODEL: y SETS: a continuación.
En el problema Steinb1, como podemos ver en la primera línea del enunciado, contiene 13 nodos y 19 arcos.
Hemos definido los nodos como un conjunto que va desde 1 hasta 13 y luego le hemos asignado las variables
asociadas Alfa y Terminal.
Alfa representa el nodo raíz. Este nodo a través de las restricciones que explicaremos más adelante será un
nodo terminal. Es una variable binaria que valdrá 1 cuando sea raíz y 0 en el caso contrario.
Terminal representa los nodos que tienen que aparecer obligatoriamente en el resultado óptimo. Es una variable
binaria que valdrá 1 cuando el nodo sea terminal y 0 si no lo es.
Los arcos también los hemos definido como un conjunto, aunque estos necesitan de otro conjunto, en este caso
de los nodos. Necesitan un nodo origen y otro destino, aunque al ser los arcos no orientados, se forma una terna
que va en ambos sentidos. Ej: 1 5,5 1 es el arco no orientado entre el nodo 1 y 5.
Arcos(Nodos,Nodos)/1 5,5 1,3 9,9 3,3 1,1 3,4 8,8 4,6 4,4 6,6 5,5 6,6 3,3 6,8
10,10 8,9 2,2 9,9 7,7 9,10 2,2 10,11 1,1 11,11 2,2 11,12 6,6 12,12 10,10
12,12 11,11 12,12 13,13 12,12 7,7 12,13 9,9 13/:X,Costes;
Los arcos llevan asociados las siguientes variables:
X hace referencia a la variable que denota si ese arco en la solución óptima conecta los nodos indicados
(vale 1) o no los conecta (vale 0).
Coste hace referencia al peso de cada arco y es utilizado en la función objetivo para obtener el resultado
óptimo.
Los Periodos los hemos definido como un conjunto que va desde 1 hasta en este caso el periodo 4.
Page 36
pág. 36
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Fig 26 Esquema periodos
El conjunto Nodos_Periodos representa el esquema anterior y tiene como variable asociada Beta que se utiliza
para marcar los nodos en el periodo que pasen a formar parte de la red principal y define como 1 en ese caso y
0 si no forman parte de la red óptima.
Tras definir los conjuntos de SETS: ahora vamos a pasar a la sección DATA:
En esta sección tenemos:
Costes que representan el peso de cada arco. Existen tantos valores como arcos existen.
Terminales que representan los nodos que tienen que formar parte dentro de la solución óptima. Existen tantos
valores como nodos existen siendo 1 si es terminal y 0 si no lo es el nodo.
DATA:
Costes=7,7,1,1,7,7,2,2,2,2,2,2,8,8,4,4,8,8,5,5,6,6,8,8,14,14,8,8,9,9,2,2,7,7,
15,15,11,11;
Terminal=0,0,0,1,1,1,1,1,0,1,1,0,1;
ENDDATA
Con esto finalizaría la parte de definición de conjuntos y datos y pasaríamos a el modelado de la función
objetivo y las restricciones que condicionan el problema.
Nodo raíz (periodo 1)
Nodo en periodo 1
Nodo en periodo 2
Nodo en periodo 2
Nodo en periodo 3
Nodo en periodo 4
Nodo en periodo 1
Nodo en periodo 2
Page 37
pág. 37
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Nuestra próxima línea es la función objetivo del problema. Usa la estructura básica de un problema de grafo
de expansión mínima.
MIN=41+@SUM(Arcos(i,j):X*Costes);
Nuestra función objetivo comienza con MIN ya que queremos minimizar en nuestro caso.
El operador @SUM realiza el sumatorio del producto de X*Coste de todos los arcos.
También se le suma una constante al sumatorio que viene definida en la última línea de los enunciados de cada
problema.
Esta línea es equivalente a:
[1]𝑀𝑖𝑛 ∑ 𝐶𝑖𝑗 ∗ 𝑋𝑖𝑗
(𝑖,𝑗)∈𝐴
Tras definir la función objetivo, vamos a pasar a explicar las restricciones que comandan nuestro modelo Lingo.
Nuestra primera restricción nos elige al simular que nodo terminal es mejor para que sea raíz del problema.
@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Arcos(i,j):X(i,j))>=1-Alfa(i));
Con la función @FOR recorremos todos los nodos que son terminales (=1) y realizamos un sumatorio de X >=
1-Alfa que vale 1=1 la igualdad cuando el arco une nodos terminales en el que ninguno de ello es el nodo raíz
y 1=0 cuando uno de ellos es el nodo raíz.
Es equivalente a esta expresión:
[2] ∑ 𝑋𝑖𝑗 ≥ 1 − 𝛼𝑖
(𝑖,𝑗)∈𝐴
∀𝑖: 𝑇𝑖 = 1
La siguiente restricción nos etiqueta en el periodo que entran a formar parte de la solución del problema los
nodos terminales. Esta etiqueta nos ayuda a que un mismo nodo no entre en la solución en distintos periodos
impidiendo la formación de ciclos.
@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Periodos(t):Beta(i,t))=1);
Es equivalente a esta expresión matemática:
[3] ∑ 𝛽𝑖𝑝 = 1
𝑝∈𝑃
∀𝑖: 𝑇𝑖 = 1
La próxima restricción nos obliga a que solo exista un nodo raíz ya que la suma de todas las Alfa para todos
los nodos del problema es <=1.
@SUM(Nodos(i):Alfa(i)) <=1;
Es equivalente a:
[4] ∑ 𝛼𝑖
𝑖∈𝑁
≤ 1 ∀𝑖
La siguiente restricción nos obliga a que el nodo raíz sea un nodo terminal siendo 1=1 la ecuación cuando
seleccionamos al nodo raíz y 0 ≤ 1 cuando seleccionamos otro nodo terminal cualquiera.
Page 38
pág. 38
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
@SUM(Nodos(i):Terminal(i)*Alfa(i)) <=1;
Es equivalente a:
[5] ∑ 𝑇𝑖 ∗ 𝛼𝑖 ≤ 1
𝑖∈𝑁
∀𝑖
La próxima restricción hace que para los periodos 𝑝 > 1 todos los nodos ya sean terminales o Steiner que
formen parte de la solución tengan un padre o nodo con el que está unido. La ecuación queda 1+1=1+1 si el
nodo es terminal o Steiner y 1+0<=1+1 si el nodo i no es hijo de j.
@For(Periodos(t)|t#GT#1:@for(Arcos(i,j):x(i,j)+Beta(i,t)<=1+Beta(j,t-1)));
Es equivalente a:
[6] 𝑋𝑖𝑗 + 𝛽𝑖𝑝 ≤ 1 + 𝛽𝑗, 𝑝 − 1 ∀𝑝 > 1: (𝑖, 𝑗) ∈ 𝐴
La siguiente restricción asigna el periodo 1 al nodo raíz y etiqueta a la variable Beta de ese nodo como 1.
@FOR(Nodos(i):Beta(i,1)=Alfa(i));
Equivalente a:
[7] 𝛽𝑖1 = 𝛼𝑖 ∀𝑖
La próxima restricción hace que para los nodos que no son terminales, puedan entrar o no en la red si fuera
necesario. Si el nodo no terminal entra a la red óptima la ecuación será 1=1 y 1>0 en el caso que el nodo no
entre en la red óptima.
@FOR(Nodos(i)|Terminal(i)#EQ#0:@SUm(Arcos(i,j):x(i,j))>=@Sum(Nodos_Periodos(i
,t):Beta(i,t)));
Equivalente a:
[8] ∑ 𝑋𝑖𝑗 ≥ ∑ 𝛽𝑖𝑝
𝑖∈𝑁;𝑝∈𝑃(𝑖,𝑗)∈𝐴
∀𝑖: 𝑇𝑖 = 0
Nuestra última restricción nos define como binaria la variable Beta.
@FOR(Nodos_Periodos(i,t): @Bin(Beta(i,t)));
Equivalente a:
[9] 𝑋𝑖𝑗, 𝛽𝑖𝑝 ∈ {0,1}
La longitud del código de Lingo se verá afectado a medida que queremos realizar problemas con mayor
número de nodos y arcos. El problema que hemos representado anteriormente es el más pequeño de todos
ellos que cuenta con 13 nodos y 19 arcos (Steinb1).
Page 39
pág. 39
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
La variante de dicho modelo que comentamos en puntos anteriores consta de las siguientes
restricciones que deberemos introducir a nuestro modelo en Lingo:
Alfa(4)=1;
Equivalente a:
[10] 𝛼4 = 1
Y también la restricción que nos especifica que Alfa es una variable binaria:
@FOR(Nodos(i):@BIN(Alfa(i)));
Equivalente a:
[11] 𝛼𝑖 ∈ {0,1}
En nuestro caso, hemos escogido como nodo raíz el número 4 ya que este es terminal y esta era
característica obligatoria para que pudiera ser raíz. Se ha elegido el 4 aunque también se podría haber
escogido cualquier otro nodo terminal como el 5,6,7, etc, de la lista de nodos terminales.
Terminal=0,0,0,1,1,1,1,1,0,1,1,0,1;
Page 40
pág. 40
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
5. RESULTADOS EXPERIMENTALES
Nuestros problemas que van a ser investigados los hemos obtenido como dijimos en capítulos anteriores de la
OR library [8] mantenida por J.Beasley, en la página web del departamento de investigación operativa del
Imperial College de Londres.
Hay distintas clases de problemas que van desde el grupo “b” al “e”. A medida que la letra aumenta, también
su complejidad al tener un mayor número de nodos y arcos.
Dentro de cada grupo existe una numeración de 1 al 20 aproximadamente en la que aumenta también su
complejidad.
A continuación, se recoge una tabla donde aparecen tanto el número de nodos, arcos y terminales de cada uno
de los problemas de esta librería de clase “b”.
Problemas Nº Nodos Nº Arcos Nº
Terminales
Steinb1 13 19 8
Steinb2 15 21 11
Steinb3 20 25 15
Steinb4 40 80 9
Steinb5 39 80 12
Steinb6 45 87 25
Steinb7 22 33 11
Steinb8 26 38 15
Steinb9 27 35 23
Steinb10 55 121 13
Steinb11 63 129 19
Steinb12 63 125 36
Steinb13 36 56 14
Steinb14 42 65 21
Steinb15 48 69 38
Steinb16 77 166 17
Steinb17 74 153 23
Steinb18 82 166 45
Page 41
pág. 41
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
En las siguientes gráficas podemos observar cómo se distribuyen el número de nodos, arcos y nodos
terminales a medida que aumentamos el número del problema y su clase.
Fig 27 Distribución nodos,arcos y periodos problemas Steiner
La grafica anterior presenta picos bastante importantes tanto en los últimos problemas de clase “c” como
“d” y “e” en la línea de tendencia que refleja el número de arcos de los problemas llegando a más de 20000
arcos para los últimos problemas de clase “e”.
El número de nodos y terminales no presenta un incremento tan notable como el número de arcos.
En nuestro caso particular, nos vamos a centrar solamente en los problemas de clase “b”.
Fig 28 Distribución nodos,arcos y periodos problemas Steiner tipo b
En la gráfica de la clase “b” podemos observar 3 zonas distintivas donde se produce un repunte del número
de arcos de los problemas. Esto ocurre entre los problemas Steinb4 y Steinb6, Steinb10 y Steinb12, Steinb16
y Steinb18.
El número de nodos y nodos terminales aumenta de forma más progresiva sin zonas de picos y valles como
en los arcos.
Más adelante se comparará estas zonas conflictivas con el resultado de las simulaciones para sacar
conclusiones sobre cómo afectan estos picos a la hora de resolver el problema.
0
5000
10000
15000
20000
25000
Stei
nb
1
Stei
nb
4
Stei
nb
7
Stei
nb
10
Stei
nb
13
Stei
nb
16
Stei
nc1
Stei
nc4
Stei
nc7
Stei
nc1
0
Stei
nc1
3
Stei
nc1
6
Stei
nc1
9
Stei
nd
2
Stei
nd
5
Stei
nd
8
Stei
nd
11
Stei
nd
14
Stei
nd
17
Stei
nd
20
Stei
ne3
Stei
ne6
Stei
ne9
Stei
ne1
2
Stei
ne1
5
Stei
ne1
8
Distribución problemas Steiner
Nº Nodos Nº Arcos Nº Terminales
0
20
40
60
80
100
120
140
160
180
Distribución problemas clase b
Nº Nodos Nº Arcos Nº Terminales
Page 42
pág. 42
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
5.1 Resultados obtenidos
Los resultados de nuestra experimentación los obtendremos una vez simulados todos los modelos para una
batería de periodos o niveles que vamos a ir definiendo nosotros según se comporte el problema.
Una vez tenemos cada uno de los archivos .lg4 con el nombre del problema y periodo, abrimos el archivos
y ponemos a correr el solucionador pulsando la tecla Solve tal y como explicamos en capítulos anteriores.
Al encontrar problemas cuyo tiempo de resolución excedían con creces las 6 y 7 horas hemos decidido
ponerle como tiempo límite de simulación 30 minutos. Con esto obtendremos soluciones subóptimas. Para
evaluar estas soluciones con la óptima utilizaremos un indicador del error entre estos 2 valores y sacaremos
conclusiones de cuanto nos alejamos de la solución óptima. Hay que recalcar que la solución óptima ha
sido obtenida mediante experimentación ajena a este trabajo.
Los datos recogidos en las tablas siguientes vienen definidos por el software empleado (Lingo) y los
medios técnicos básicos para este software (procesador Intel Core Inside i5) lo cual hace que procesadores
de mayor potencia podrían conseguir tiempos de resolución mejores que los que vamos a exponer.
En la siguiente tabla vamos a recoger la siguiente información obtenida en la simulación de cada problema
para el caso de la estrategia de niveles con nodo raíz no forzado:
• Nombre del problema
• Número de nodos
• Número de nodos terminales
• Número de arcos
• Número máximo de periodos
• Función objetivo obtenida
• Función objetivo real
• Error porcentual de la función objetivo
• Tiempo de resolución del problema (máximo 30 minutos)
• Número de iteraciones
El error lo obtendremos siguiendo la siguiente fórmula:
𝐸𝑟𝑟𝑜𝑟 = |𝑆𝑜𝑙𝑢𝑐𝑖ó𝑛 𝑜𝑏𝑡𝑒𝑛𝑖𝑑𝑎 − Ó𝑝𝑡𝑖𝑚𝑜 𝑟𝑒𝑎𝑙|
Ó𝑝𝑡𝑖𝑚𝑜 𝑟𝑒𝑎𝑙𝑥100
Problema Nodos Nodos
Terminales Arcos Niveles F.Objetivo
F.Objetivo
Real Error
Tiempo de
simulación
(s)
Extended
solver
steps
Total
solver
iterations
steinb1 13 8 19 3 88 82 7% 0 3 1189
steinb1 13 8 19 4 82 82 0% 0 59 1957
steinb1 13 8 19 5 82 82 0% 1 88 17454
steinb1 13 8 19 6 82 82 0% 2 654 28973
steinb1 13 8 19 7 82 82 0% 7 1868 106681
steinb1 13 8 19 8 82 82 0% 8 3231 125061
steinb1 13 8 19 9 82 82 0% 16 7373 210309
steinb2 15 11 21 4 90 83 8% 2 291 22950
steinb2 15 11 21 5 83 83 0% 2 71 19842
steinb2 15 11 21 6 83 83 0% 3 1091 43743
Page 43
pág. 43
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
steinb2 15 11 21 7 83 83 0% 4 891 59194
steinb2 15 11 21 8 83 83 0% 4 437 57713
steinb2 15 11 21 9 83 83 0% 9 3634 126172
steinb3 20 15 25 4 145 138 5% 2 639 15991
steinb3 20 15 25 5 145 138 5% 6 1925 80065
steinb3 20 15 25 6 142 138 3% 16 9392 223400
steinb3 20 15 25 7 142 138 3% 33 16675 401983
steinb3 20 15 25 8 138 138 0% 21 6843 233933
steinb3 20 15 25 9 138 138 0% 33 14046 358199
steinb3 20 15 25 10 138 138 0% 62 23388 795738
steinb3 20 15 25 11 138 138 0% 46 17223 505003
steinb3 20 15 25 12 138 138 0% 105 29671 1229312
steinb4 40 9 80 5 66 59 12% 48 19804 488244
steinb4 40 9 80 6 60 59 2% 302 98442 1744619
steinb4 40 9 80 7 60 59 2% 321 80463 1702504
steinb4 40 9 80 8 59 59 0% 991 288040 5807116
steinb4 40 9 80 9 59 59 0% 1747 601363 13524551
steinb4 40 9 80 10 59 59 0% 1800 532120 12175047
steinb5 39 12 80 4 67 61 10% 16 5334 169703
steinb5 39 12 80 5 62 61 2% 30 8389 273077
steinb5 39 12 80 6 61 61 0% 43 7880 380907
steinb5 39 12 80 7 61 61 0% 208 70355 1798931
steinb5 39 12 80 8 61 61 0% 837 240111 6991812
steinb5 39 12 80 9 61 61 0% 1170 325876 8053645
steinb6 45 25 87 5 139 122 14% 590 164918 4840462
steinb6 45 25 87 6 139 122 14% 1800 399508 14331885
steinb6 45 25 87 7 129 122 6% 1800 377244 12196984
steinb6 45 25 87 8 125 122 2% 1800 289071 10181263
steinb6 45 25 87 9 126 122 3% 1800 546701 14490360
steinb7 22 11 33 4 113 111 2% 0 142 10195
steinb7 22 11 33 5 111 111 0% 3 2044 38839
steinb7 22 11 33 6 111 111 0% 6 1472 67484
steinb7 22 11 33 7 111 111 0% 29 19957 301841
steinb7 22 11 33 8 111 111 0% 17 4516 214871
steinb7 22 11 33 9 111 111 0% 41 15623 458078
steinb8 26 15 38 5 108 104 4% 11 2500 123487
steinb8 26 15 38 6 105 104 1% 48 22209 521419
steinb8 26 15 38 7 104 104 0% 26 9143 263104
steinb8 26 15 38 8 104 104 0% 68 24466 678783
steinb8 26 15 38 9 104 104 0% 160 45319 1529557
steinb9 27 23 35 6 222 220 1% 46 17170 517275
steinb9 27 23 35 7 221 220 0,5% 174 62526 1541350
steinb9 27 23 35 8 220 220 0% 344 107829 3319281
steinb9 27 23 35 9 220 220 0% 561 189660 5967302
steinb9 27 23 35 10 220 220 0% 1182 321276 11915727
steinb10 55 13 121 4 100 86 16% 102 38094 852956
Page 44
pág. 44
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
steinb10 55 13 121 5 92 86 7% 329 108876 2199299
steinb10 55 13 121 6 87 86 1% 555 132745 3042252
steinb10 55 13 121 7 90 86 5% 1800 466122 10637871
steinb10 55 13 121 8 90 86 5% 1800 413913 9634727
steinb11 63 19 129 4 126 88 43% 246 72740 2260799
steinb11 63 19 129 5 95 88 8% 538 131295 3323802
steinb11 63 19 129 6 89 88 1% 1095 222243 6455520
steinb11 63 19 129 7 90 88 2% 1800 429131 10506300
steinb11 63 19 129 8 89 88 1% 1800 997367 26469677
steinb12 63 36 125 5 220 174 26% 1800 333150 15187789
steinb12 63 36 125 6 223 174 28% 1800 367884 12055969
steinb12 63 36 125 7 182 174 5% 1800 323467 9896714
steinb12 63 36 125 8 197 174 13% 1800 364622 10065362
steinb12 63 36 125 9 206 174 18% 1800 263901 7790857
steinb13 63 36 56 5 169 165 2% 52 12803 444445
steinb13 63 36 56 6 168 165 2% 285 116198 2599971
steinb13 63 36 56 7 165 165 0% 633 231938 5463807
steinb13 63 36 56 8 165 165 0% 1800 604714 17160238
steinb14 42 21 65 6 239 235 2% 1800 691121 24272503
steinb14 42 21 65 7 237 235 1% 1800 450388 16235063
steinb14 42 21 65 8 235 235 0% 1800 283091 9329656
steinb14 42 21 65 9 235 235 0% 1800 392403 14927137
steinb15 42 21 69 7 327 318 3% 1800 394514 16870626
steinb15 42 21 69 8 324 318 2% 1800 476863 15629062
steinb15 42 21 69 9 319 318 0,3% 1800 1286830 53553900
steinb15 42 21 69 10 319 318 0,3% 1800 239188 14030326
steinb16 77 17 166 5 146 127 15% 1800 559515 12981212
steinb16 77 17 166 6 151 127 19% 1800 482801 9398524
steinb16 77 17 166 7 146 127 15% 1800 272494 5442193
steinb16 77 17 166 8 138 127 9% 1800 299243 5746711
steinb16 77 17 166 9 164 127 29% 1800 221378 5618552
steinb16 77 17 166 10 141 127 11% 1800 355977 6555017
steinb17 74 23 153 6 155 131 18% 1800 518935 15025559
steinb17 74 23 153 7 175 131 34% 1800 437852 14620033
steinb17 74 23 153 8 147 131 12% 1800 615217 12818093
steinb17 74 23 153 9 151 131 15% 1800 334777 6764197
steinb17 74 23 153 10 151 131 15% 1800 270949 9843468
steinb18 82 45 166 6 291 218 33% 1800 368795 27419773
steinb18 82 45 166 7 294 218 35% 1800 211246 7373937
steinb18 82 45 166 8 325 218 49% 1800 387374 18495778
steinb18 82 45 166 9 273 218 25% 1800 232129 7670838
steinb18 82 45 166 10 280 218 28% 1800 198838 5425520
Como podemos ver en la tabla anterior, hemos recogido todos los problemas de clase b para distintos niveles
o periodos (suelen ir desde 3 hasta 10 periodos aproximadamente).
Page 45
pág. 45
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
También hemos elegido una paleta de colores para identificar con facilidad los problemas de los que no
hemos obtenido la solución óptima ya sea por tener un número muy pequeño de periodos o tiempo
excesivamente elevado.
Hemos simulado los problemas como máximo un tiempo de 30 min (1800s) y obtenido la mejor solución
óptima hasta ese momento.
Los problemas que no han podido resolverse en ese tiempo se ha marcado su fuente en rojo de la columna
Tiempo de simulación.
En la columna de Error también hemos elegido una paleta de colores similar. Hemos tomado como verde
cuando la solución obtenida coincide con la solución óptima real (0% error). Cuando obtenemos un error
inferior al 10% lo consideramos como una solución factible y utilizamos un rojo claro. Para valores de error
mayor del 10% consideramos que esa solución se aleja mucho de la real y la marcamos con un rojo oscuro.
Como podemos observar, para los primeros problemas con un número pequeño de nodos y arcos, este
modelo no tiene problema en solucionarlos en un tiempo bajo. Esto ocurre también probando con niveles
más grandes como 7,8 o 9.
Hay que recalcar que, para periodos pequeños, el modelo no encuentra la solución óptima real, aunque se
aproxima bastante ya que los errores son moderados.
Uno de los puntos que hemos observado es que una vez encontrada la mejor solución para el problema
Steinb y nivel t, si simulamos los siguientes periodos, el tiempo de resolución crece abruptamente.
Cuando se alcanza el óptimo en cierto nivel, si seguimos aumentando niveles también vamos a aumentar el
tiempo de resolución ya que estamos obligando al problema a utilizar un mayor número de niveles para el
mismo óptimo, es decir, una ruta más larga.
En el problema Steinb4 podemos observar lo siguiente:
Problemas Nº Nodos Nº Arcos Nº Terminales
Steinb4 40 80 9
Fig 29 Tiempo de resolución por periodo
54
56
58
60
62
64
66
68
0
200
400
600
800
1000
1200
1400
1600
1800
2000
steinb4t5 steinb4t6 steinb4t7 steinb4t8 steinb4t9 steinb4t10
Tiempo de resolución por periodo Steinb4
Elapsed run time (s) Solución obtenida
Page 46
pág. 46
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
En la siguiente gráfica recogeremos los tiempos de resolución de todos los problemas del tipo “b” para la
estrategia de niveles con el nodo raíz no forzado:
Fig 30 Tiempo estrategia por niveles nodo raíz no forzado
Para el problema steinb6, observando los datos recogidos encontramos que no es posible encontrar una
solución óptima que coincida con la real para ningún periodo en el tiempo de simulación de 30 minutos.
Lo más que nos acercamos es a un error del 2% para el periodo 8 y 30 minutos. Hay que recalcar que este
problema contiene 45 nodos de los cuales 25 son terminales.
Problemas Nº Nodos Nº Arcos Nº Terminales
Steinb6 45 87 25
Según seguimos avanzando en las simulaciones de los problemas, comprobamos que el problema steinb12
no se puede resolver completamente para el rango de tiempo dado y su solución se aleja un 5% de la real
para el periodo 7. Este problema consta de 125 arcos y 36 terminales dificultando la obtención de la solución
óptima en un tiempo menor de 30 minutos.
Problemas Nº Nodos Nº Arcos Nº Terminales
Steinb12 63 125 36
A partir del problema steinb14, ninguno de ellos puede resolverse en el intervalo de 30 minutos y su
resolución se acerca a las 24 horas o más en la mayoría de los casos gracias a simulaciones realizadas en
las que se comprueba esto.
Para 30 minutos, los errores de los problemas steinb16 ronda entre el 10% y el 35% aproximadamente no
obteniéndose así una buena solución.
0
200
400
600
800
1000
1200
1400
1600
1800
2000
Tiempo E.Niveles raíz no forzado
Tiempo E.Niveles
Page 47
pág. 47
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
A continuación, se mostrarán los resultados obtenidos de la segunda variante de nuestro problema por
niveles donde el nodo raíz es escogido por nosotros eligiendo un nodo terminal al azar.
Problema Nodos Nodos
Terminales Arcos Niveles F.Objetivo
F.Objetivo Real
Error Tiempo de
simulación
(s)
Extended solver steps
Total solver
iterations
steinb1 13 8 19 4 83 82 1% 0 0 0
steinb1 13 8 19 5 82 82 0% 0 0 103
steinb2 15 11 21 5 84 83 1% 0 0 59
steinb2 15 11 21 6 84 83 1% 0 0 161
steinb2 15 11 21 7 84 83 1% 0 0 992
steinb2 15 11 21 8 83 83 0% 1 0 3631
steinb3 20 15 25 4 158 138 14% 0 0 11
steinb3 20 15 25 5 142 138 3% 1 0 169
steinb3 20 15 25 6 138 138 0% 1 0 1092
steinb4 40 9 80 5 71 59 20% 0 0 275
steinb4 40 9 80 6 68 59 15% 2 177 14358
steinb4 40 9 80 7 68 59 15% 24 4604 187046
steinb4 40 9 80 8 61 59 3% 22 3564 221222
steinb4 40 9 80 9 61 59 3% 50 6834 525741
steinb4 40 9 80 10 60 59 2% 126 39328 1039369
steinb4 40 9 80 11 59 59 0% 343 78506 2623356
steinb5 39 12 80 5 71 61 16% 0 2 1642
steinb5 39 12 80 6 62 61 2% 5 56 19380
steinb5 39 12 80 7 61 61 0% 24 631 62860
steinb5 39 12 80 8 61 61 0% 15 3494 110026
steinb5 39 12 80 9 61 61 0% 60 17058 566765
steinb6 45 25 87 6 144 122 18% 9 186 37131
steinb6 45 25 87 7 138 122 13% 65 13103 498169
steinb6 45 25 87 8 129 122 6% 1110 310488 8622886
steinb6 45 25 87 9 127 122 4% 1800 354947 13395207
steinb7 22 11 33 6 127 111 14% 0 15 1006
steinb7 22 11 33 7 111 111 0% 0 5 3711
steinb8 26 15 38 6 116 104 12% 0 0 169
steinb8 26 15 38 7 113 104 9% 3 12 6389
steinb8 26 15 38 8 108 104 4% 5 32 21773
steinb8 26 15 38 9 107 104 3% 10 242 39208
steinb8 26 15 38 10 107 104 3% 22 1409 134805
steinb8 26 15 38 11 105 104 1% 28 1510 252882
steinb8 26 15 38 12 104 104 0% 39 4929 293881
steinb9 27 23 35 7 232 220 5,5% 0 0 705
steinb9 27 23 35 8 228 220 4% 4 161 24248
steinb9 27 23 35 9 221 220 0,5% 5 138 35683
steinb9 27 23 35 10 221 220 0,5% 19 885 129299
steinb9 27 23 35 11 221 220 0,5% 44 4029 270720
Page 48
pág. 48
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
steinb9 27 23 35 12 221 220 0,5% 82 15939 732542
steinb9 27 23 35 13 221 220 0,5% 219 39398 1893407
steinb9 27 23 35 14 220 220 0% 374 60258 3742925
steinb10 55 13 121 5 105 86 22% 1 7 7328
steinb10 55 13 121 6 96 86 12% 27 1152 108260
steinb10 55 13 121 7 95 86 10% 51 14254 381142
steinb10 55 13 121 8 90 86 5% 286 81949 1833719
steinb10 55 13 121 9 89 86 3% 1652 315653 10178986
steinb10 55 13 121 10 88 86 2% 1800 367125 11286668
steinb11 63 19 129 5 128 88 45% 0 4 1414
steinb11 63 19 129 6 107 88 22% 19 119 78351
steinb11 63 19 129 7 101 88 15% 36 4029 233102
steinb11 63 19 129 8 97 88 10% 246 58896 1901701
steinb11 63 19 129 9 92 88 5% 1623 30978 1140597
steinb11 63 19 129 10 89 88 1% 1800 328021 12202026
steinb12 63 36 125 6 192 174 10% 6 30 19275
steinb12 63 36 125 7 185 174 6% 62 6018 348108
steinb12 63 36 125 8 178 174 2% 1800 101037 4162048
steinb13 63 36 56 6 207 165 25% 0 4 605
steinb13 63 36 56 7 176 165 7% 6 3 13311
steinb13 63 36 56 8 169 165 2% 29 399 124013
steinb13 63 36 56 9 169 165 2% 31 3312 244996
steinb13 63 36 56 10 165 165 0% 121 26270 1098862
steinb14 42 21 65 7 272 235 16% 1 2 241
steinb14 42 21 65 8 239 235 2% 25 695 106846
steinb14 42 21 65 9 235 235 0% 69 12383 581679
steinb15 42 21 69 7 325 318 2% 3 4 12664
steinb15 42 21 69 8 319 318 0,3% 17 850 86460
steinb15 42 21 69 9 319 318 0,3% 58 10913 421494
steinb15 42 21 69 10 319 318 0,3% 738 136343 6143852
steinb15 42 21 69 11 319 318 0,3% 1425 194235 10135897
steinb15 42 21 69 12 319 318 0,3% 1800 261257 15603689
steinb16 77 17 166 6 151 127 19% 8 8 22080
steinb16 77 17 166 7 135 127 6% 21 2333 136746
steinb16 77 17 166 8 134 127 6% 760 153328 4200773
steinb16 77 17 166 9 147 127 16% 925 91813 2577024
steinb16 77 17 166 10 145 127 14% 1090 130944 3958038
steinb16 77 17 166 11 143 127 13% 1256 256897 8975896
steinb16 77 17 166 12 140 127 10% 1800 365094 10213797
steinb17 74 23 153 6 177 131 35% 5 22 14407
steinb17 74 23 153 7 150 131 15% 59 7753 348279
steinb17 74 23 153 8 142 131 8% 660 97291 3951422
steinb17 74 23 153 9 144 131 10% 860 119669 5086304
steinb17 74 23 153 10 138 131 5% 1274 165867 6677974
steinb17 74 23 153 11 140 131 7% 1645 198523 8457466
steinb17 74 23 153 12 144 131 10% 1800 260032 9225384
Page 49
pág. 49
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
steinb18 82 45 166 7 235 218 8% 133 14430 765065
steinb18 82 45 166 8 232 218 6% 1260 148355 5567649
steinb18 82 45 166 9 245 218 12% 1800 226323 7721629
steinb18 82 45 166 10 246 218 13% 1800 148623 7412694
La tabla donde está recogidos los datos sigue la misma estructura y paleta de colores que la tabla anterior.
Como podemos ver, los tiempos de resolución son bastante menores que en la primera versión de nuestra
simulación, aunque esto no quiere decir que se obtengan mejores resultados ya que la función objetivo que
obtenemos no se acerca tanto a la real como en la versión primera con lo que obtenemos errores más
considerables que antes.
Fig 31 Tiempo estrategia por niveles nodo raíz forzado
Hay que recalcar que los datos recogidos en las tablas anteriores y las gráficas son en base al software
empleado (Lingo) y los medios técnicos básicos para este software (procesador Intel Core Inside i5)
En el siguiente punto podremos comparar las diferentes estrategias y observar las gráficas de tiempos y
errores cometidos.
0
200
400
600
800
1000
1200
1400
1600
1800
2000
Tiempo E.Niveles raíz forzada
Tiempo E.Niveles raíz forzada
Page 50
pág. 50
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
5.2 Comparativa estrategia por niveles frente a estrategia de
flujo
Para evaluar nuestro modelo y su operatividad es necesario compararlo con otros modelos y para ello
tomaremos el proyecto de Antonio García Elías sobre el Estudio Experimental de Formulaciones de Flujo
para Resolver el Problema de Steiner en Grafos.
La determinación del tope de tiempo en 30 minutos y el uso del criterio de errores menores del 10% para
soluciones buenas lo hemos tomado siguiendo este trabajo nombrado anteriormente para poder realizar una
comparativa siguiendo la misma norma.
En dicho proyecto se analizan dos estrategias, una de flujo de simple y otra de flujo múltiple. En ambas
estrategias se toma como premisa que por los nodos Steiner entran y salen el mismo número de unidades
de flujo. Los nodos Terminales son sumideros y a cada uno de ellos le tiene que llegar una unidad de flujo.
La diferencia entre ambas estrategias es que en la simple sólo puede circular una unidad de flujo por cada
arco (cota superior =1) y en la estrategia de flujo múltiple no (cota superior >=1).
Hasta la fecha no se ha comparado resultados computacionales entre la estrategia de resolución por niveles
(la expuesta en este trabajo) y la estrategia de flujo para problemas de Steiner y por ello vamos a llevar a
cabo este estudio.
En la tabla anterior donde aparecía la estrategia por niveles con una batería de niveles distintos, hemos
buscado entre todos los periodos de cada problema cual era el que menos error cometía y lo hemos añadido
a esta tabla junto con su tiempo de resolución. También hemos creado columnas asociadas a los tiempos de
resolución y error del problema de Steiner mediante estrategia de flujo simple y la de flujo múltiple extraído
del trabajo [6] de la bibliografía.
Problema
Tiempo E.Niveles
raiz no forzada
Tiempo E.Niveles
raíz forzada
Tiempo E.Flujo Simple
Tiempo E.Flujo
Múltiple
Error E.Niveles
raiz no forzada
Error E.Niveles
raíz forzada
Error E.Flujo Simple
Error E.Flujo
Múltiple
Steinb1 0 0 1 0 0% 0% 0% 0%
Steinb2 2 1 2 0 0% 0% 0% 0%
Steinb3 21 1 7 0 0% 0% 0% 0%
Steinb4 991 343 31 22 0% 0% 0% 0%
Steinb5 43 24 88 118 0% 0% 0% 0%
Steinb6 1800 1800 1800 1800 2% 4% 11% 0%
Steinb7 3 0 8 4 0% 0% 0% 0%
Steinb8 26 39 25 13 0% 0% 0% 0%
Steinb9 344 374 43 18 0% 0,0% 0% 0%
Steinb10 555 1800 303 1800 1% 2% 0% 3%
Steinb11 1095 1800 1800 1800 1% 1% 0% 0%
Steinb12 1800 1800 1800 1800 5% 2% 15% 3%
Steinb13 633 121 243 124 0% 0% 0% 0%
Steinb14 1800 69 1800 1800 0% 0% 2% 0%
Steinb15 1800 1800 1800 1800 0,3% 0,3% 4% 0%
Steinb16 1800 1800 1800 1800 9% 10% 12% 0%
Steinb17 1800 1274 1800 1800 12% 5% 4% 2%
Steinb18 1800 1260 1800 1800 25% 6% 26% 7%
Page 51
pág. 51
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Para poder comparar la tabla anterior, hemos creado gráficas que enfrenten los datos para poder sacar así
mejores conclusiones.
La gráfica siguiente compara los tiempos de resolución de las cuatro estrategias para cada uno de los
problemas de la batería “b”.
Fig 32 Comparativa tiempo estrategia por niveles vs niveles raíz forzada vs flujo simple vs flujo múltiple
Podemos comprobar que en términos de tiempo, todas las estrategias excepto la de niveles con raíz forzada
se comportan de forma similar, exceptuando problemas como el steinb4 en el que la estrategia por niveles
despunta demasiado o en los problemas entre el steinb9 y steinb12 donde hay una mayor diferencia en
tiempos.
A partir del problema steinb14, tenemos que cortar las simulaciones, explicando esto la coincidencia en
tiempo de la estrategia por niveles, y las de flujo simple y múltiple. La estrategia por niveles con el nodo
raíz forzado se comporta mucho mejor en cuanto a tiempos en problemas de gran número de nodos y arcos
como podemos ver en los steinb del 14 al 18.
En cuanto a errores, vemos en la siguiente gráfica como para los primeros problemas todas las estrategias
devuelven errores muy parecidos excepto la estrategia por niveles con raíz forzada que comete errores
mayores que el resto. Conforme aumenta la dificultad de los problemas, la estrategia de flujo múltiple se
descuelga como la mejor estrategia, seguida por la de niveles con nodo raíz forzado. La estrategia de flujo
simple y la de niveles con el nodo raíz no forzado se comportan bastante pero que nuestras otras dos
estrategias.
0
200
400
600
800
1000
1200
1400
1600
1800
2000
Tiempo de resolución
Tiempo E.Niveles raiz no forzada Tiempo E.Niveles raíz forzada
Tiempo E.Flujo Simple Tiempo E.Flujo Múltiple
Page 52
pág. 52
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Fig 33 Comparativa error solución estrategia por niveles vs niveles raíz forzada vs flujo simple vs flujo múltiple
La diferencia en tiempos y errores entre las dos estrategias por niveles es debido a que para problemas
pequeños con fácil conmutación, no elegir el nodo raíz y que este lo elija el problema es mejor opción pero
conforme el número de nodos, nodos terminales y arcos se hace más grande, elegir un nodo raíz de forma
forzada hace que se realicen menos simulaciones para encontrar el óptimo. Esto puede degenerar en que no
escojamos el nodo raíz adecuado al azar y cometamos mayor error en el óptimo del problema.
Tras estudiar la tabla de resultados y ambas gráficas, es concluyente extraer que la mejor estrategia en
cuanto a tiempos y errores que comete es la estrategia de flujo múltiple. Su solución encuentra el óptimo
en la mayoría de los casos en tiempos pequeños menores o igual a 30 minutos y cuando no, no se aleja
demasiado de la solución óptima.
Esto no quiere decir que sea la mejor estrategia de todas las que pueden resolver el problema de Steiner, ya
que como podemos ver en el trabajo de Análisis de las estrategias antibucles de Miller-Tucker-Zemlin y
Desrochers-Laporte para el problema de Steiner en grafos [5], sus tiempos de resolución son mucho
mejores que los que podemos ver en nuestro estudio.
La siguiente estrategia que mejor se comportaría sería la de niveles con el nodo raíz forzado. Para problemas
complejos el tiempo de resolución es menor que las dos estrategias restantes e incluso el error que comete
es menor.
Las otras dos estrategias, la de niveles con el nodo raíz no forzado y la estrategia de flujo simple son bastante
similares en términos de tiempo, aunque en la gráfica de errores podemos ver como las soluciones de la
estrategia por niveles se aproxima más a la solución óptima que la de flujo simple en la mayoría de los
casos.
Al contrario de lo que se pensaba a priori, fijar el nodo raíz en un nodo terminal al azar ayuda
significativamente a la resolución del problema tanto en términos de tiempo tal y como nos demuestran los
datos, aunque esto no consigue posicionar a esta estrategia como la mejor de las estudiadas en este proyecto.
0%
5%
10%
15%
20%
25%
30%
Error de la solución obtenida
Error E.Niveles raiz no forzada Error E.Niveles raíz forzada
Error E.Flujo Simple Error E.Flujo Múltiple
Page 53
pág. 53
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
6. BIBLIOGRAFÍA
1. Análisis de estrategias de modelado para la resolución del problema de Steiner en grafos
Trabajo Fin de Grado. Universidad de Sevilla
Autor: Daniel Guzmán Moreno
Tutor: José Manuel García Sánchez
Año: 2015
2. Resolución de Problemas. Librería de optimización. Métodos Cuantitativos de Gestión
Apuntes Asignatura Métodos de Optimización
Autor: José Manuel García Sánchez
Año: 2016
3. Optimal Trees
Chapter for the Handbooks in Operations Research and Managament Science
Autor: Thomas L.Magnanti y Laurence A. Wolsey
Año: 1994
4. Investigación operativa 2002. Software para programación lineal -LINGO/LINDO-
Autor: Erica Canizo y Paola Lucero
Año: 2002
5. Análisis de las estrategias antibucles de Miller-Tucker-Zemlin y Desrochers-Laporte para el
problema de Steiner en grafos
Proyecto Fin de Grado. Universidad de Sevilla.
Autor: Ignacio Castellano Jiménez
Tutor: José Manuel García Sánchez
Año: 2017
6. Estudio Experimental de Formulación de Flujo para Resolver el Problema de Steiner en Grafos
Trabajo Fin de Grado. Universidad de Sevilla
Autor: Antonio García Elías
Tutor: José Manuel García Sánchez
Año: 2017
7. Ficheros de texto en C
Apuntes de apoyo para la realización del programa en C
URL: http://www.chuidiang.org/clinux/ficheros/fichero-texto.php
8. Archivos de texto de los Enunciados de los Problemas de Steiner
URL: http://www.brunel.ac.uk/~mastjjb/jeb/info.html (OR-Library J E Beasley)
9. Tutoriales y códigos para programación en Visual Basic para Microsoft Excel
URL: https://exceltotal.com/
URL: https://www.todoexpertos.com/
Page 54
pág. 54
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
7. ANEXOS
7.1 Problema en formato .txt
Problema Steinb1.txt
13 19
1 5 7
3 9 1
3 1 7
4 8 2
6 4 2
6 5 2
6 3 8
8 10 4
9 2 8
9 7 5
10 2 6
11 1 8
11 2 14
12 6 8
12 10 9
12 11 2
12 13 7
12 7 15
13 9 11
8
4 5 6 7 8 10 11 13
41
Page 55
pág. 55
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
7.2 Tabla de óptimos de problemas tipo “b”
Problema Óptimo
steinb1 82
steinb2 83
steinb3 138
steinb4 59
steinb5 61
steinb6 122
steinb7 111
steinb8 104
steinb9 220
steinb10 86
steinb11 88
steinb12 174
steinb13 165
steinb14 235
steinb15 318
steinb16 127
steinb17 131
steinb18 218
Listado de óptimos para los problemas de clase “b”.
Page 56
pág. 56
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
7.3 Código Visual Basic
En este apartado se tratará la programación usada tanto para importar los datos de cada uno de los problemas
que se encuentran en formato .txt y llevarlos a Excel para poder gestionar esa información y trabajar con ellas.
Tras analizar todos los datos del problema, es necesario crear el modelo de forma sencilla. Al tratarse de
muchos problemas es necesario crear un método para crear estos modelos en Lingo de forma lo más
automatizada posible.
7.3.1 Código para importar archivo .txt a Microsoft Excel
Public Sub ImportarArchivoTextoDelimitado( _
ByVal rango As Excel.Range, _
ByVal nombreArchivo As String, _
Optional ByVal caracterDelimitadorCampos As String = " ")
' Verificamos los parámetros pasados al procedimiento
'
If (rango Is Nothing) Then _
Err.Raise 91, _
"Importar archivo de texto", _
"El rango no es válido."
If (nombreArchivo = "") Then _
Err.Raise 1, _
"Importar archivo de texto", _
"No se ha especificado un nombre de archivo."
On Error GoTo ErrorImportarArchivoTextoDelimitado
' Referenciamos la hoja de cálculo a la
' que pertenece el rango especificado.
'
Page 57
pág. 57
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Dim ws As Excel.Worksheet
Set ws = rango.Worksheet
Dim table As Excel.QueryTable
Set table = ws.QueryTables.Add( _
"TEXT;" & nombreArchivo, ws.Cells(1, 1))
With table
.TextFileOtherDelimiter = caracterDelimitadorCampos
.Refresh False
End With
Set table = Nothing
Set ws = Nothing
Exit Sub
ErrorImportarArchivoTextoDelimitado:
' Devolvemos el error al procedimiento llamador
Err.Raise Err.Number
End Sub
'Suponiendo que tienes un archivo de texto delimitado por comas, ejecutarías tu macro para que llame al
procedimiento 'ImportarArchivoTextDelimitado' de la siguiente manera:
Sub Macro1()
Dim i As Integer
Dim j As Integer
Dim cadena As String
Dim a As String
Dim b As String
Page 58
pág. 58
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Dim c As String
' Importa un archivo de texto delimitado
' a la celda A1 de la hoja de cálculo
' llamada Hoja1.
'
On Error GoTo ErrorMacro1
Dim r As Excel.Range
Set r = Sheets("Auxiliartxt").Range("A1") 'hay que poner en SHEETS el nombre de la pestaña de la
hoja(Auxiliartxt), no la hoja5.
Dim fileName As String
cadena = "C:\Users\David Rubio\Desktop\Proyecto\ProblemasReducidos\"
a = cadena
b = Hoja1.Cells(15, 10)
c = ".txt"
cadena = a & b & c
fileName = cadena
'fileName = "C:\Users\David Rubio\Desktop\Proyecto\ProblemasReducidos\steinb5.txt"
ImportarArchivoTextoDelimitado r, fileName
Hoja1.Cells.Clear
Page 59
pág. 59
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
cadena = "Escribir nombre problema"
Hoja1.Cells(14, 10) = cadena
cadena = "Escribir número de periodos T"
Hoja1.Cells(16, 10) = cadena
Hoja1.Cells(15, 10).Interior.Color = RGB(255, 192, 0)
Hoja1.Cells(17, 10).Interior.Color = RGB(127, 127, 127)
For i = 1 To 500
For j = 1 To 100
'bucle copiar a primeras columnas
Hoja1.Cells(i, j) = Hoja5.Cells(i, j)
Next j
Next i
cadena = "Escribir nombre problema"
Hoja1.Cells(14, 10) = cadena
Hoja1.Cells(15, 10).Interior.Color = RGB(255, 192, 10)
cadena = "Escribir número de periodos T"
Hoja1.Cells(16, 10) = cadena
Hoja1.Cells(17, 10).Interior.Color = RGB(127, 127, 127)
Hoja1.Cells(15, 10) = b
Hoja5.Cells.Clear
Page 60
pág. 60
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Exit Sub
ErrorMacro1:
MsgBox Err.Description, vbExclamation, "Importar Archivo"
End Sub
Page 61
pág. 61
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
7.3.2 Código para crear matrices de adyacencia, Xij, costes y escribir
modelo en formato Lingo .lg4
Sub Programa()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim cont As Integer
Dim var As Integer
Dim a As String
Dim b As String
Dim c As String
Dim d As String
Dim e As String
Dim f As String
Dim longitudcadena As String
Dim nodos As Integer
Dim arcos As Integer
nodos = Hoja1.Cells(1, 1)
arcos = Hoja1.Cells(1, 2)
Hoja2.Cells.Clear
Hoja3.Cells.Clear
Hoja4.Cells.Clear
'BUCLE DE 1 Y 0 y costes en Hoja4
Dim cadena As String
j = 1
Do While j <= nodos
i = 2
Page 62
pág. 62
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Do While i < arcos + 2
If Hoja1.Cells(i, 1) = j Then
var = Hoja1.Cells(i, 2)
Hoja2.Cells(j, var) = 1
Hoja2.Cells(var, j) = 1 'No orientado
Hoja2.Cells(var, j).Interior.Color = RGB(0, 255, 255) 'No orientado
Hoja2.Cells(j, var).Interior.Color = RGB(0, 255, 0)
Hoja4.Cells(j, var) = Hoja1.Cells(i, 3).Value
Hoja4.Cells(var, j) = Hoja1.Cells(i, 3).Value 'No orientado
Hoja4.Cells(var, j).Interior.Color = RGB(0, 255, 255) 'No orientado
Hoja4.Cells(j, var).Interior.Color = RGB(0, 255, 0)
'Hoja1.Cells(j, 10 + j) = 1 'NO ORIENTADO
'Else
'Hoja1.Cells(j, 10 + var) = 0 'AÑADIDO CEROS
End If
i = i + 1
Loop
j = j + 1
Loop
For i = 1 To nodos
For j = 1 To nodos
If Hoja2.Cells(i, j) <> 1 Then
Hoja2.Cells(i, j) = 0
Hoja2.Cells(i, j).Interior.Color = RGB(0, 0, 255)
Hoja4.Cells(i, j) = 0
Hoja4.Cells(i, j).Interior.Color = RGB(0, 0, 255)
Page 63
pág. 63
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
End If
Next j
Next i
'NO ORIENTADO
'j = 1
'Do While j <= 5
'Hoja1.Cells(j, 10 + j) = 1
'j = j + 1
'Loop
'INTRODUCIR X
i = 1
Do While i <= nodos
j = 1
Do While j <= nodos
If Hoja2.Cells(i, j) = 1 Then 'LO QUITO PARA QUE ESTÉN LOS 0X11
a = i
b = j
c = "X"
'd = Hoja1.Cells(i, 10 + j) 'AÑADIDO PARA 0X12
Hoja3.Cells(i, j) = d & c & a & b
Hoja3.Cells(i, j).Interior.Color = RGB(0, 255, 0)
Else
Hoja3.Cells(i, j).Interior.Color = RGB(0, 0, 255)
End If
j = j + 1
Loop
i = i + 1
Loop
' concatenar X12 Y METER SUMAS
Page 64
pág. 64
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
For i = 1 To nodos
cadena = ""
For j = 1 To nodos
If Hoja3.Cells(i, j) <> "" Then
cadena = cadena & "+" & Hoja3.Cells(i, j).Value
End If
Next j
Hoja1.Cells(i, 5) = cadena
Next i
'quitar + y poner punto y coma final
j = 6
cadena = ""
For i = 1 To nodos
cadena = Hoja1.Cells(i, 5)
cadena = cadena & ">=1;"
longitudcadena = Len(cadena) 'eliminar + del principio
cadena = Right(cadena, longitudcadena - 1) 'eliminar + del principio
If cadena = "=1;" Then
cadena = ">=1;"
End If
Hoja1.Cells(i, j) = cadena
If Hoja1.Cells(i, j) = ">=1;" Then
Hoja1.Cells(i, j) = ""
End If
Next i
'escribir modelo antes de lingo
Page 65
pág. 65
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
cadena = ""
a = "Nodos/1.."
b = nodos
c = "/:Alfa,Terminal;"
cadena = a & b & c
Hoja1.Cells(1, 20) = cadena
cadena = ""
a = "Arcos(Nodos,Nodos)/"
For i = 2 To arcos + 1
b = Hoja1.Cells(i, 1)
c = Hoja1.Cells(i, 2)
d = " "
e = ","
cadena = cadena & b & d & c & e & c & d & b & e
Next i
longitudcadena = Len(cadena) 'eliminar + del principio
cadena = Left(cadena, longitudcadena - 1)
f = "/:X,Costes;"
cadena = a & cadena & f
Hoja1.Cells(2, 20) = cadena
cadena = "Periodos/1.."
a = Hoja1.Cells(17, 10)
b = "/;"
cadena = cadena & a & b
Hoja1.Cells(3, 20) = cadena
cadena = "Nodos_Periodos(Nodos,Periodos):Beta;"
Page 66
pág. 66
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Hoja1.Cells(4, 20) = cadena
cadena = "Costes="
a = ""
'k = 10 'prueba para ver que pasa con la longitud de la cadena
For i = 2 To arcos + 1
'For j = 1 To nodos 'lo quito para ver que pasa en lingo con el número de costes
a = Hoja1.Cells(i, 3) 'Originalmente a = Hoja4.Cells(i, j)
a = a & ","
cadena = cadena & a & a 'originalmente solo es "cadena = cadena & a"
'Hoja1.Cells(k, 20) = cadena
'Next j ''lo quito para ver que pasa en lingo con el número de costes
'k = k + 1
Next i
longitudcadena = Len(cadena)
cadena = Left(cadena, longitudcadena - 1)
cadena = cadena & ";"
Hoja1.Cells(5, 20) = cadena
cadena = "Terminal="
var = Hoja1.Cells(arcos + 2, 1)
For i = 1 To nodos
k = 0
For j = 1 To var
If Hoja1.Cells(arcos + 3, j) = i Then
Page 67
pág. 67
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
cadena = cadena & "1,"
k = 1
Else
End If
Next j
If k = 0 Then
cadena = cadena & "0,"
End If
Next i
longitudcadena = Len(cadena)
cadena = Left(cadena, longitudcadena - 1)
cadena = cadena & ";"
Hoja1.Cells(6, 20) = cadena
Dim numarchivo As Integer
Dim nombreArchivo As String
Dim linea As String
Dim t As Integer
Dim g As String
nodos = Hoja1.Cells(1, 1)
arcos = Hoja1.Cells(1, 2)
a = Hoja1.Cells(arcos + 4, 2)
b = "MIN=" & a & "+@SUM(Arcos(i,j):X*Costes);"
a = Hoja1.Cells(15, 10)
'c = "!Problema Steiner " & a & ";"
e = Hoja1.Cells(15, 10)
f = Hoja1.Cells(17, 10)
c = "!Problema Steiner " & a & " Periodos t=" & f & ";"
Page 68
pág. 68
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
d = "C:\Users\David Rubio\Desktop\Proyecto\Problemas-Periodos\"
d = d + e
d = d + "t"
d = d + f
d = d + ".lg4"
numarchivo = FreeFile
nombreArchivo = d
'nombreArchivo = "C:\Users\David Rubio\Desktop\Proyecto\V1.lg4"
Open nombreArchivo For Output As numarchivo
Print #numarchivo, c
Print #numarchivo, ""
Print #numarchivo, "MODEL:"
Print #numarchivo, ""
Print #numarchivo, "SETS:"
For i = 1 To 4
Print #numarchivo, Hoja1.Cells(i, 20)
Next i
Print #numarchivo, "ENDSETS"
Print #numarchivo, "DATA:"
For i = 5 To 6
Print #numarchivo, Hoja1.Cells(i, 20)
Next i
Print #numarchivo, "ENDDATA"
Print #numarchivo, b
Page 69
pág. 69
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
Print #numarchivo, "!Alfa(1)=1;!para la versión por niveles v2 donde el nodo raíz es forzado;"
Print #numarchivo, "@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Arcos(i,j):X(i,j))>=1-Alfa(i));"
Print #numarchivo, "@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Periodos(t):Beta(i,t))=1);"
Print #numarchivo, "@SUM(Nodos(i):Alfa(i)) <=1;"
Print #numarchivo, "@SUM(Nodos(i):Terminal(i)*Alfa(i)) <=1;"
Print #numarchivo, "@For(Periodos(t)|t#GT#1:@for(Arcos(i,j):x(i,j)+Beta(i,t)<=1+Beta(j,t-1)));"
Print #numarchivo, "@FOR(Nodos(i):Beta(i,1)=Alfa(i));"
Print #numarchivo, "@FOR(Nodos(i)|Terminal(i)#EQ#0:
@SUm(Arcos(i,j):x(i,j))>=@Sum(Nodos_Periodos(i,t):Beta(i,t)));"
Print #numarchivo, "@FOR(Nodos_Periodos(i,t): @Bin(Beta(i,t)));"
Print #numarchivo, "!@FOR(Nodos(i):@BIN(Alfa(i)));! para la versión por niveles v2 donde el nodo raíz es
forzado ;"
'Print #numarchivo, "@FOR(Nodos(i)|Terminal(i)#EQ#1:"
'Print #numarchivo, "@SUM(Arcos(i,j):X(i,j))>=1-Alfa(i));"
'Print #numarchivo, "@FOR(Nodos(i):@BIN(Alfa(i)));"
'Print #numarchivo, "@FOR(Nodos(i)|Terminal(i)#EQ#1:"
'Print #numarchivo, "@SUM(Periodos(t)|t#GT#1:Beta(i,t))=1);"
'j = 6
'For i = 1 To nodos
'Print #numarchivo, Hoja1.Cells(i, j)
'Print #numarchivo, ""
'Next i
Print #numarchivo, "END"
Close numarchivo
End Sub
Sub guardado()
nbre = Format(Now, "dd-mm-yy hh mm ss")
ruta = "C:\Users\David Rubio\Desktop\Proyecto\Autoguardado por fechas"
ActiveWorkbook.SaveCopyAs ruta & "\" & nbre & ".xls"
End Sub
Page 70
pág. 70
ANÁLISIS DE UNA FORMULACION POR NIVELES PARA MODELAR EL PROBLEMA DE STEINER EN GRAFOS
7.3.3 Modelo en formato Lingo .lg4
Modelo Steinb1 para 3 periodos
MODEL:
SETS:
Nodos/1..13/:Alfa,Terminal;
Arcos(Nodos,Nodos)/1 5,5 1,3 9,9 3,3 1,1 3,4 8,8 4,6 4,4 6,6 5,5 6,6 3,3 6,8
10,10 8,9 2,2 9,9 7,7 9,10 2,2 10,11 1,1 11,11 2,2 11,12 6,6 12,12 10,10 12,12
11,11 12,12 13,13 12,12 7,7 12,13 9,9 13/:X,Costes;
Periodos/1..3/;
Nodos_Periodos(Nodos,Periodos):Beta;
ENDSETS
DATA:
Costes=7,7,1,1,7,7,2,2,2,2,2,2,8,8,4,4,8,8,5,5,6,6,8,8,14,14,8,8,9,9,2,2,7,7,1
5,15,11,11;
Terminal=0,0,0,1,1,1,1,1,0,1,1,0,1;
ENDDATA
MIN=41+@SUM(Arcos(i,j):X*Costes);
!Alfa(1)=1;!para la versión por niveles v2 donde el nodo raíz es forzado;
@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Arcos(i,j):X(i,j))>=1-Alfa(i));
@FOR(Nodos(i)|Terminal(i)#EQ#1: @SUM(Periodos(t):Beta(i,t))=1);
@SUM(Nodos(i):Alfa(i)) <=1;
@SUM(Nodos(i):Terminal(i)*Alfa(i)) <=1;
@For(Periodos(t)|t#GT#1:@for(Arcos(i,j):x(i,j)+Beta(i,t)<=1+Beta(j,t-1)));
@FOR(Nodos(i):Beta(i,1)=Alfa(i));
@FOR(Nodos(i)|Terminal(i)#EQ#0:
@SUm(Arcos(i,j):x(i,j))>=@Sum(Nodos_Periodos(i,t):Beta(i,t)));
@FOR(Nodos_Periodos(i,t): @Bin(Beta(i,t)));
!@FOR(Nodos(i):@BIN(Alfa(i)))! para la versión por niveles v2 donde el nodo
raíz es forzado;
END