Trabajo de Fin de Grado
Equation Chapter 1 Section 1
Trabajo Fin de Grado
Ingeniería de Organización Industrial
Resolución Exacta y Heurística del
Problema de Cortes de Barras
Autor: Carlos Morales Fernández
Tutor: José Manuel García Sánchez
Dep. Organización Industrial y Gestión de Empresas I
Escuela Técnica Superior de Ingeniería
Universidad de Sevilla
Sevilla, 2017
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
II
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
III
Trabajo Fin de Grado
Ingeniería de Organización Industrial
Resolución Exacta y Heurística del Problema de
Cortes de Barras
Autor:
Carlos Morales Fernández
Tutor:
José Manuel García Sánchez
Profesor titular
Dep. Organización Industrial y Gestión de Empresas I
Escuela Técnica Superior de Ingeniería
Universidad de Sevilla
Sevilla, 2017
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
IV
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
V
Trabajo Fin de Grado: Resolución Exacta y Heurística del Problema de Cortes de Barras
Autor: Carlos Morales Fernández
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, 2017
El Secretario del Tribunal
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
VI
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
VII
Agradecimientos
El presente trabajo va dedicado a mi familia, en especial a mis padres que siempre me han apoyado en todo
momento, a mis amigos que me han acompañado codo con codo durante el transcurso del grado y a los
diversos profesores que han sabido transmitirme sus conocimientos, así como también la pasión por el campo
de la Organización Industrial.
Carlos Morales Fernández
Sevilla, 2017
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
VIII
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
IX
Resumen
El Problema de Cortes de Barras trata sobre la asignación de cortes a barras con el fin de satisfacer
determinadas demandas, actualmente y también en épocas pasadas, muy presente en la industria. Dicho TFG
presenta la resolución óptima del problema con el objetivo de evaluar dos metodologías empleadas para la
resolución del mismo y poder así determinar cuál es la mejor forma de abordarlo.
Desde un punto de vista matemático con el que poder obtener un valor óptimo a pesar del tiempo empleado
para su resolución, siendo éste programado en el software LINGO.
La segunda parte consta de la elaboración de una heurística basada en vecindad con la que poder resolver el
Problema de Cortes de Barras de una forma más eficiente que la resolución matemática.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
X
Abstract
The Solution to Bar Cutting Problem consists in make cuts in bars to supply the request of customers with
the best eficient cutting solution in our stock. Along this text, two methodologies to deal with the problem
are presented.
First of all, the problem is analyzed from a mathematical point of view, obtaining an optimal value
without caring on the time employed for its resolution, using LINGO software.
Secondly, a metaheuristic based on the neighborhood is carried out to solve the Bar Cutting Problem in a
more efficient way.
Finally, both methodologies are evaluated in order to determine which is the best to solve the problem.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
XI
Índice
INTRODUCCIÓN Y OBJETIVOS DEL PROYECTO 1
EL PROBLEMA DE CORTES DE BARRAS 4
MODELO MATEMÁTICO EMPLEADO 7 3.1. Elementos 8 3.2. Variables 8
3.3. Restricciones 9
3.4. Función Objetivo 12 3.5. Modelo Matemático 12
3.6. Ejemplo 13
RESOLUCIÓN DEL MODELO MATEMÁTICO 15 4.1. Introducción 16
4.2. Librería LINGO 16
4.3. Implementación del Modelo en LINGO 20
HEURÍSTICA 23 5.1. Introducción 24 5.2. Heurística Local Search 24
5.3. Aplicación del Local Search al Problema de Cortes de Barras 25
EXPERIMENTACIÓN 29 6.1. Introducción 30
6.2. Generación de Problemas 30
6.3. Resultados Obtenidos 33 6.4. Conclusiones 34
CONCLUSIONES GENERALES 37
BIBLIOGRAFÍA 39
ANEXOS 42 9.1. ANEXO A: Programación de la Generación de Problemas 43
9.2. ANEXO B: Programación de la Heurística 47
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
XII
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
1
INTRODUCCIÓN Y OBJETIVOS DEL PROYECTO
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
2
La industria, los servicios y el comercio del Metal en España superan las 150.000 empresas y emplean a
más de 1.500.00 personas.
La industria del metal constituye una de las industrias básicas más importantes en los países
industrializados y su grado de madurez es un exponente claro del desarrollo industrial del país. La
industrial del metal en España supone cerca del 40% de la producción industrial española, de cada 100
empleados en la industria española, 37 son del Metal. Anualmente la industria exporta en torno al 50%
del total de las exportaciones españolas. De éstas, el 75% tienen como destino la UE. En España las
empresas del Metal representan el 5% del total y de ellas 78.000 son establecimientos industriales. En el
Metal las PYMES son mayoría: un 86% son empresas de menos de 10 asalariados y un 98% con menos
de 100.
Es por ello que el sector de la metalurgia es uno sector bastante explotado y dónde el problema de Cortes
de Barras está muy presente en el día a día.
Al margen de la industria del metal, la cual nos podría resultar más familiar en relación con el problema
abordado en este Trabajo de Fin de Grado, muchos otros negocios se ven también enfrentados a este
problema. Entre otros, podríamos encontrar:
Industria maderera: desde antaño la industria de la madera ha sido de las primeras en enfrentarse
a esta problemática, puesto que era uno de los primeros recursos que se encontraban perennes y
de fácil adquisición en la naturaleza.
Industria textil: con el fin de la confección de las distintas prendas que hoy en día se visten, las
industrias textiles se ven obligadas a la fabricación y venta de innumerables tipos de telas al por
mayor.
Industria alimentaria: muchas de las empresas relacionadas con la alimentación, con el objetivo
de generar economías de escala, producen en masa gran cantidad de productos alimenticios de
forma lineal. Entre otros podemos encontrar empresas fabricantes de tabletas de chocolate o de
sándwiches.
Industria del plástico: nos encontramos el problema de Cortes de Barras en empresas destinadas a
fabricar productos como tuberías de PVC de diversos tamaños o sticks de fregonas o recogedores,
entre muchos otros existentes.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
3
Imprentas: aunque pueda parecer ridículo, hoy en día el consumo de papel es algo que cada vez
más tenemos presente en la sociedad. Es por ello que el control de los diversos cortes de rollos de
papel debe de realizarse con minucioso estudio.
Por ello el Problema de Cortes de Barras va ser objeto de estudio en el presente Trabajo de Fin de Grado.
Dicho problema será resuelto de forma exacta y con varias instancias mediante el software LINGO,
analizando los tiempos de resolución y los valores de Función Objetivo hallados.
Por otro lado, se resolverán las mismas instancias con una heurística basada en vecindad denominada
Local Search, con la finalidad de comparar los resultados entre ambas metodologías de resolución.
El proyecto consta de 9 capítulos, incluido éste, en el que se estructura el contenido del siguiente modo:
Capítulo 2: descripción del problema a tratar en el presente trabajo.
Capítulo 3: explicación del modelado del problema Cortes de Barras de forma matemática.
Capítulo 4: aborda la implementación del modelo matemático explicado en el capítulo 3 en el software
de resolución lineal LINGO.
Capítulo 5: capítulo en el que se explica la heurística Local Search que se ha utilizado como método
alternativo para la resolución del problema.
Capítulo 6: se explica detalladamente la batería de problemas que vamos a utilizar para el estudio
computacional, los resultados obtenidos fruto de la experimentación con dicha batería y las conclusiones
obtenidas del estudio.
Capítulo 7: se redactan las conclusiones personales obtenidas del proyecto.
Capítulos 8 y 9: contienen información relevante usada para la ejecución del trabajo.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
4
EL PROBLEMA DE CORTES DE BARRAS
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
5
Un problema de optimización se presenta en entornos industriales o de servicios en los que hay que gestionar
una serie de recursos para realizar una determinada actividad, utilizando por lo general un criterio de tipo
económico. Los criterios van referidos a la minimización de los costes de la actividad, o a la maximización de
beneficios. En el contexto científico, la optimización es el proceso de tratar de encontrar la mejor solución
posible para un determinado problema.
En este apartado abordaremos la definición del propio problema denominado como Cortes de Barras con el fin
de optimizarlo.
El problema consiste en realizar cortes unidimensionales a un conjunto finito de barras longitudinales ya
existentes en el almacén, las cuales tendrán como características una determinada longitud que no tendrá por
qué ser similar entre ellas. Dichas barras podrán provenir tanto de haberlas fabricado, como del resultado del
sobrante de algún corte realizado con anterioridad, es por ello que las barras situadas en el almacén tendrán
tamaños distintos. Tanto el número de barras de almacén como las longitudes de las mismas serán
considerados como datos.
Los cortes realizados a las barras de almacén se realizarán con el objetivo de satisfacer la demanda de unos
supuestos clientes. Estas demandas o lotes se caracterizan por tener una cantidad finita y entera de barras
demandadas y un determinado tamaño de longitud de barra por lote. Este mencionado tamaño lo supondremos
de 6, 8, 10 y 12 unidades de longitud, debido a que en el Mercado industrial no se demandan gran cantidad de
longitudes diferentes, a excepción de las demandas personalizadas.
El objetivo de dicha problemática, el cual queremos optimizar, será el de asignar cortes a barras de almacén
para satisfacer las diversas demandas de los clientes pero siempre intentando minimizar que el sobrante de
realizar esta actividad de cortado no sea inferior a 2 unidades de longitud (longitud estipulada a modo de
ejemplo para el estudio del problema) con el fin de simular que las barras con longitudes inferiores a 2 no se
demandan en el mercado y serían un completo desperdicio para la empresa.
A modo de ejemplo, a continuación se muestra un dibujo de cómo sería el problema que acabamos de
comentar, con el fin de verlo de forma gráfica y simple.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
6
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
7
MODELO MATEMÁTICO EMPLEADO
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
8
3.1. Elementos
El modelo matemático que vamos a explicar en el presente apartado consta de unos elementos fijos, los cuales
se encuentran en esta subsección y se verán reflejados en el modelo matemático final. Estos elementos serán
los datos referentes a nuestro modelado matemático del problema Cortes de Barras.
En la siguiente tabla podemos encontrar la explicación de cada uno de ellos:
Elemento Descripción
𝑗 Conjunto de barras que se encuentran en el almacén, con un rango de 1,2, … , 𝑀
𝑖 Conjunto de lotes demandados, con un rango de 1,2, … , 𝑁
𝐿𝑗 Dato que establece el valor de la longitud en u.d.l. (unidades de longitud) de cada
barra “𝑗” que se encuentra en el almacén.
𝑙𝑑𝑖 Dato que establece el valor de la longitud en u.d.l. (unidades de longitud) de las
barras de cada lote “𝑖” demandado. Tomará valores 6, 8, 10 y 12.
𝐷𝑖 Dato que hace referencia a la cantidad de barras demandadas por lote “𝑖”.
𝜀 Constante de valor ínfimo.
3.2. Variables
A continuación, se muestran las diversas variables que tomarán diferentes valores en nuestra resolución exacta
del problema. De ellas dependerá de forma directa el tiempo de resolución del modelo, pero este es un aspecto
que se comentará más adelante.
En la siguiente tabla se pueden observar las variables incluidas en el problema, así como también la
descripción de las mismas:
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
9
Variable Descripción
𝑥𝑗𝑖 Variable entera que representa el número de cortes realizados a la barra “𝑗” para
satisfacer la demanda del lote “𝑖”.
𝑆𝑗 Variable continua que representa la cantidad sobrante de la barra de almacén “𝑗”
tras ser cortada.
𝑦1𝑗 Variable continua que tomará el valor del sobrante de las barras de almacén “𝑗” en
el caso de que éste sea menor que 2 u.d.l.
𝑦2𝑗 Variable continua que tomará el valor del sobrante de las barras de almacén “𝑗” en
el caso de que éste sea mayor o igual que 2 u.d.l.
𝛼1𝑗 Variable binaria que tomará valor 1 si el sobrante de las barras de almacén “𝑗” es
menor que 2 u.d.l. y 0 en caso contrario.
𝛼2𝑗 Variable binaria que tomará valor 1 si el sobrante de las barras de almacén “𝑗” es
mayor o igual que 2 u.d.l. y 0 en caso contrario.
3.3. Restricciones
La primera restricción que nos encontramos es la siguiente ∑ 𝑙𝑑𝑖 ∙ 𝑥𝑗𝑖 + 𝑆𝑗 = 𝐿𝑗𝑁𝑖=1 . En ella lo que
se refleja es el hecho de que la longitud de la barra que se encuentra en el almacén 𝐿𝑗 deberá ser
estrictamente la suma del sobrante de la misma tras ser cortada 𝑆𝑗 y la cantidad de barra que ha sido
destinada a satisfacer las diferentes demandas existentes ∑ 𝑙𝑑𝑖 ∙ 𝑥𝑗𝑖𝑁𝑖=1 . Dicha restricción deberá ser
cumplida por todas las barras que se encuentren en el almacén, ∀ 𝑗 = 1, 2, … , 𝑀.
La segunda restricción que aparece en nuestro modelo es ∑ 𝑥𝑗𝑖 =𝑀𝑗=1 𝐷𝑖, la cual representa de forma
estricta que la demanda de cada lote debe ser satisfacida, por lo que esta restricción llevará a su vez
∀ 𝑖 = 1,2, … , 𝑁. Cabría la posibilidad de poner como signo ≥ pero puesto que es un problema
demasiado caprichoso hemos decidido dejar el =.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
10
Respecto a esta restricción de satisfacción de demanda, una posible variante de nuestro problema sería
el incluir el ≥ puesto que podría relajar la demanda y dar tiempos de resolución más pequeños. Pese a
que podrían salirnos soluciones donde la demanda a entregar al cliente fuera superior a la que
realmente el cliente requiere, las barras sobrantes pueden ser perfectamente utilizadas para otro periodo
de tiempo donde realicemos el cortado de barras, puesto que al ser demandados únicamente tamaños de
6, 8, 10 y 12 u.d.l. no sería un obstáculo para la empresa.
El siguiente grupo de restricciones identifica a la variable 𝑦1𝑗 como el sobrante menor que 2 u.d.l.
(constante impuesta para el problema) obtenido de cortar la barra de almacén con el fin de satisfacer la
demanda, esta variable denotará la Función Objetivo que se comentará más adelante, puesto que no
querremos tener barras sobrantes de este tamaño. Del mismo modo se impone que la variable 𝑦2𝑗 es
igual al sobrante mayor o igual a 2 u.d.l. Esta será la forma de calcular el sobrante de las barras de
almacén. Para una mayor comprensión de este grupo de restricciones se muestra un simple dibujo de
los posibles sobrantes que podemos obtener:
2 u.d.l
Sobrante (Sj):
y1 (Penalizado)
y2 (Permitido)
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
11
Este tipo de restricciones serán modeladas matemáticamente con la siguiente metodología:
Y obtendremos lo siguiente:
𝑆𝑗 = 𝑦1𝑗 + 𝑦2𝑗
𝛼1𝑗 + 𝛼2𝑗 ≤ 1
0 ≤ 𝑦1𝑗 ≤ (2 − 𝜀) ∙ 𝛼1𝑗
2 ∙ 𝛼2𝑗 ≤ 𝑦2𝑗 ≤ 𝐿𝑗 ∙ 𝛼2𝑗
Todas estas restricciones serán evaluadas para cada una de las barras que se encuentren en el almacén
∀ 𝑗 = 1,2, … , 𝑀.
x
0U1U n xU CS
1 1 2 1
2U 1iU iU
1i
1 2
1 2
1 1 1
1 2 2 2 2
2 3 3
, , :
0
1
0
( )
( )
n
i
i
i
i n
x x x
x
x
x x x x x
x U
U x U
U x
i-1 i 0
Valor de x en cada intervalo
1 si se encuentra en el intervalo (U ,U ], con U=
0 si esta fuera del intervalo mencionado
3 3U
1x 2x ix
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
12
3.4. Función Objetivo
Por último pero no menos importante, la función objetivo para este problema es la de Minimizar
∑ 𝑦1𝑗𝑀𝑗=1 debido a que lo que se busca es tener el menor número de metros de barras de almacén
sobrantes con longitudes inferiores a 2 u.d.l. ya que como se comentó en el capítulo 2 donde se
describía el problema, suponemos que las barras de tamaños inferiores a 2 u.d.l. no eran demandadas
en el mercado industrial actual.
3.5. Modelo Matemático
𝑀𝐼𝑁: ∑ 𝑦1𝑗
𝑀
𝑗=1
𝑠𝑎:
∑ 𝑙𝑑𝑖 ∙ 𝑥𝑗𝑖 + 𝑆𝑗 = 𝐿𝑗
𝑁
𝑖=1
∀ 𝑗 = 1, 2, … , 𝑀
∑ 𝑥𝑗𝑖 =
𝑀
𝑗=1
𝐷𝑖 ∀ 𝑖 = 1,2, … , 𝑁
𝑆𝑗 = 𝑦1𝑗 + 𝑦2𝑗 ∀ 𝑗 = 1,2, … , 𝑀
𝛼1𝑗 + 𝛼2𝑗 ≤ 1 ∀ 𝑗 = 1,2, … , 𝑀
0 ≤ 𝑦1𝑗 ≤ (2 − 𝜀) ∙ 𝛼1𝑗 ∀ 𝑗 = 1,2, … , 𝑀
2 ∙ 𝛼2𝑗 ≤ 𝑦2𝑗 ≤ 𝐿𝑗 ∙ 𝛼2𝑗 ∀ 𝑗 = 1,2, … , 𝑀
𝐶𝑜𝑛𝑡𝑖𝑛𝑢𝑎𝑠 𝑆𝑗 , 𝑦1𝑗 , 𝑦2𝑗 ≥ 0
𝐸𝑛𝑡𝑒𝑟𝑎𝑠 𝑥𝑗𝑖 ≥ 0
𝐵𝑖𝑛𝑎𝑟𝑖𝑎𝑠 𝛼1𝑗 , 𝛼2𝑗 = {0 , 1}
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
13
3.6. Ejemplo
Para mostrar el comportamiento del modelo realizaremos un pequeño problema a modo de ejemplo.
Supongamos que tenemos un almacén en el que se encuentra un stock de dos barras j= y j=2, con longitudes
(𝐿𝑗 ) iguales a 25 y 11 respectivamente. Dichas barras habrán sido compradas al por mayor, fabricadas por la
propia empresa cortadora de barras o resultados del sobrante de haber realizado una operación de cortado
previa a la actual.
Estas barras situadas en el almacén deberán ser utilizadas para satisfacer la demanda de 3 clientes, i=1, i=2 e
i=3. Los cuales tendrán una demanda (𝐷𝑖) de 2, 1 y 1 y su determinada longitud de barra (𝑙𝑑𝑖) para cada una
de las demandas igual a 6, 9 y 12 .u.d.l. respectivamente. Siendo estas longitudes las demandadas por el
mercado.
A modo de resumen se muestran los diversos datos comentados en las siguientes tablas:
ALMACÉN
Número (j): Longitud Inicial (L)
1 25
2 11
DEMANDA
Número (i): Cantidad del Lote (D) Longitud Solicitada del Lote (ld)
1 2 6
2 1 9
3 1 12
Visualmente podremos comprobar que una posible solución óptima al problema presentado sería la de cortar 2
barras de 6 u.d.l. de la barra de almacén j=1 que disponía de una longitud inicial de 25 u.d.l., para satisfacer la
demanda de 2 unidades del cliente i=1 que demanda barras de 6 u.d.l., esta msima barra de almacén también
será cortada para el aprovisionamiento del cliente 3 cuyas características son una demanda de 1 unidad con
longitud de 12 u.d.l.. Para satisfacer al cliente 2 se ha cortado una barra de 9 u.d.l. de la barra de almacén j=2
cuya dimensión inicial era de 11 u.d.l.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
14
A continuación se muestra una tabla con los valores de las 𝑥𝑗𝑖 comentados:
X(j,i) j
1 2
i
1 2 0
2 0 1
3 1 0
Respecto al sobrante (𝑆𝑗), obtendremos que el valor para la barra de almacén j=1 será de 1 u.d.l. y para la barra
de almacén j=2, será de 2 u.d.l.. Esto hace que el valor de las “y” sea 𝑦11 = 1 y 𝑦21 = 0 para la barra de
almacén j=1, y 𝑦12 = 0 𝑦22 = 2. Para una mayor claridad de los resultados del sobrante se muestra el
siguiente gráfico:
Por lo tanto, una vez realizados los cortes y satisfecha la demanda veremos que la Función Objetivo obtenida
para los datos introducidos será de FO = 1. Debido a que sólo tenemos una barra en el almacén con longitud
inferior a 2 u.d.l.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
15
RESOLUCIÓN DEL MODELO MATEMÁTICO
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
16
4.1. Introducción
La programación lineal es el campo de la optimización matemática dedicado a maximizar o minimizar
(optimizar) una función lineal, denominada función objetivo, de tal forma que las variables de dicha función
estén sujetas a una serie de restricciones expresadas mediante un sistema de ecuaciones
o inecuaciones también lineales. El método tradicionalmente usado para resolver problemas de programación
lineal es el Método Simplex.
Por ello para resolver de forma exacta nuestro modelo matemático de programación lineal utilizaremos un
software dedicado a este propósito. El software que utilizaremos es denominado LINGO, y será explicado en
dicho capítulo.
4.2. Librería LINGO
LINGO: (LINear Generalize Optimizer) es una herramienta simple para formular problemas lineales y no
lineales, resolverlos y analizar su solución. El resultado que LINGO nos proporciona es la optimización
que nos ayuda a encontrar el mejor resultado: la ganancia más alta, o el costo más bajo. A menudo estos
problemas involucran el uso más eficiente de los recursos. Los problemas de optimización son
clasificados a menudo como lineales o no lineales, dependiendo si las relaciones en el problema son
lineales con respecto a las variables. Uno de los rasgos más poderosos de LINGO es su aplicación en el
lenguaje de modelo matemático. El cual permite expresar un problema de una manera muy similar a la
anotación matemática normal pudiendo también, expresar una serie entera de restricciones en una
declaración compacta. Esto lleva a modelos que son mucho más fáciles de mantener. Otro aspecto es la
sección de los datos, que le permite aislar los datos de la formulación del modelo. De hecho LINGO
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
17
puede leer datos incluso de una hoja de cálculo separada, base de datos, o archivo de texto. Con datos
independientes del modelo, es mucho más fácil de hacer cambios, y hay menos oportunidad de error
cuando se realiza el modelo.
Sintaxis de LINGO
La sintaxis que se utiliza en este programa es muy sencilla. Para el nombre de las variables se establece
que deben tener 32 caracteres como máximo, Deben comenzar con una letra seguido de letras, dígitos o _.
El compilador de LINGO no distingue entre mayúsculas y minúsculas. Con respecto a las sentencias:
Todas las sentencias deben terminar en un punto y coma. Para darle un nombre a la función objetivo o a
las restricciones, estos se deben colocar entre corchetes. Para declarar la función objetivo debemos
colocar las palabras reservadas MAX o MIN, resaltadas en azul, seguidas del signo =. Los comentarios
deben comenzar con un signo !, los cuales son resaltados en verde
El formato que sigue un modelo en LINGO es el siguiente:
Título: descripción del modelo.
Función objetivo: Maximizar o minimizar con los valores de los costes de todas las variables.
Restricciones del problema.
Restricciones asociadas al tipo de variable.
A continuación se detallan las características más importantesa cerca de la sintaxis de los modelos de
LINGO:
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
18
Título
Es optativo y debe tener como máximo 128 caracteres.
FORMATO: {TITLE NOMBRE DEL MODELO ;}
Función Objetivo
Para escribir la función objetivo se colocan las palabras reservadas MAX o MIN, qué se resaltarán en
azul, seguidas de signo =.
FORMATO: {[NOMBRE]} (MAX/MIN) = FUNCIÓN OBJETIVO;
Restricciones del problema
LINGO tiene la habilidad de nombrar las restricciones en su modelo. Ésta es una buena práctica, por dos
razones; primero, los nombres de restricciones se usan en el reporte de las soluciones, cosa que los hacen
más fácil de interpretar. Segundo, muchos de los mensajes de error de LINGO se refieren a una
restricción dada por nombre. Dar nombre a las restricciones es bastante simple, se inserta el nombre entre
corchetes delante de una línea de código, dicho nombre cumplirá los requisitos normales para un
nombreLINGO. Mostramos a continuación un ejemplo de cómo quedannuestros problemas modelados el
LINGO.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
19
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
20
La siguiente imagen muestra un ejemplo del formato que tendría los modelos LINGO de nuestros
problemas.
4.3. Implementación del Modelo en LINGO
A continuación se muestra la programación junto a su explicación en comentarios en el software de
optimización “LINGO” del modelo matemático anteriormente descrito.
Esta programación ha sido estructurada de forma que al principio se encuentra la declaración de los elementos
y variables que componen el problema, así como también el rango de valores de las mismas (dicho rango
variará en función del tamaño del problema que estemos evaluando, esta variación será comentada en el
capítulo 6).
Posteriormente podemos encontrar la introducción de los datos del problema (variarán también en función del
problema y de la semilla de aleatoriedad utilizada, será comentado en el capítulo 6).
Seguido de la introducción de datos se encuentran las diversas restricciones que incumben al problema, cabe
destacar que las restricciones 0 ≤ 𝑦1𝑗 ≤ (2 − 𝜀) ∙ 𝛼1𝑗 y 2 ∙ 𝛼2𝑗 ≤ 𝑦2𝑗 ≤ 𝐿𝑗 ∙ 𝛼2𝑗
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
21
han sido modeladas en 4 restricciones, puesto que LINGO no permite el modelado simultáneo de restricciones.
Y por último se encuentran la Función Objetivo del problema y los tipos de variables del mismo.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
22
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
23
HEURÍ STÍCA
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
24
5.1. Introducción
Desde los años sesenta han ido apareciendo diferentes métodos de resolución de problemas conocidos por el
nombre de técnicas metaheurísticas. Estas técnicas son de especial interés en el caso de variables enteras
aunque también se aplican a problemas con variables reales.
Un heurístico es un “procedimiento simple, a menudo basado en el sentido común, que se supone que ofrecerá
una buena solución (aunque no necesariamente la óptima) a problemas difíciles, de un modo fácil y rápido”.
(Zanakins y Evans, 1981)
Los heurísticos se utilizan, por ejemplo, cuando no existe un método exacto de resolución, cuando existe un
método exacto que consume mucho tiempo para ofrecer la solución óptima, cuando existen limitaciones de
tiempo o como paso intermedio para obtener una solución inicial para la aplicación de otra técnica.
Las técnicas metaheurísticas son procedimientos de búsqueda que tampoco garantizan la obtención del óptimo
del problema considerado y que también se basan en la aplicación de reglas relativamente sencillas. A
diferencia de los heurísticos, las técnicas metaheurísticas tratan de huir de óptimos locales orientando la
búsqueda en cada momento dependiendo de la evolución del proceso de búsqueda.
La aplicación de las técnicas metaheurísticas es especialmente interesante en caso de problemas de
optimización combinatoria: problemas en las que las variables de decisión son enteras (o discretas, al menos)
en las que, generalmente, el espacio de soluciones está formado por ordenaciones de valores de dichas
variables. Sin embargo, las técnicas metaheurísticas se pueden aplicar también a problemas de otro tipo, como
con variables continuas, por ejemplo.
5.2. Heurística Local Search
La heurística basada en vecindad denominada como Local Search, es un método heurístico para
resolver problemas de optimización computacionalmente duros. La búsqueda local se puede utilizar en
problemas que se pueden formular como encontrar una solución que maximice un criterio entre un
número de soluciones candidatas . Los algoritmos de búsqueda local pasan de solución a solución en el
espacio de soluciones candidatas (el espacio de búsqueda) aplicando cambios locales, hasta que se
encuentra una solución considerada óptima o se ha transcurrido un tiempo límite.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
25
Los algoritmos de búsqueda local se aplican ampliamente a numerosos problemas computacionales.
A la hora de moverse a las vecinas existen dos métodos:
First Improvement: escoge la solución vecina major anexa a la solución que estemos evaluando
Best Improvement: explora todas las soluciones vecinas próximas y escoge la major de ellas.
5.3. Aplicación del Local Search al Problema de Cortes de Barras
Para la realización de nuestra heurística escogeremos la metodología First Improvement. A continuación, se
explica el Local Search aplicado a nuestro problema de Cortes de Barras.
El Local Search empleado se basa en una solución inicial generada de forma que a la primera barra del
almacén (j=1) se le asigna el satisfacer la primera demanda (i=1), así se irá completando la demanda pasando
por cada una de las barras de almacén. Debiendo cumplir siempre que la demanda sea satisfecha, es por ello
que si no ha sido así se volverá a comenzar la asignación, pero esta vez empezando por la segunda barra del
almacén (j=2). Si no cumple con la restricción se volverá a repetir el proceso, pero con la tercera barra del
almacén (j=3) y así sucesivamente hasta que la restricción de cumplir la demanda se respete.
Una vez obtenida dicha solución inicial pasaremos al concepto de vecindad, éste consta en cambiar la
asignación de una barra del almacén que tenga un sobrante menor que 2 con un lote de forma que la barra por
la que debe ser sustituida debe tener un sobrante actual suficiente para acometer la demanda y que el sobrante
una vez realizado el corte no perjudique la FO, es decir, no sea inferior a 2. Con respecto a las restricciones del
problema, puesto que la solución inicial las tiene en cuenta, ésta también. Dicha heurística empleada se
muestra de forma esquemática con el siguiente pseudocódigo:
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
26
Entrada: 𝐿𝑗 , 𝐷𝑖 , 𝑙𝑑𝑖
Salida: 𝑋𝑗𝑖 , 𝑆𝑗
Bucle: Desde i=1 hasta i=N
Bucle: Desde j=1 hasta j=M
Si: 𝑋𝑗𝑖 > 0 & 𝐿𝑗 < 2
Bucle: Desde k=1 hasta k=M
Si: 𝐿𝑘 ≥ 𝑙𝑑𝑖 & 𝐿𝑘 − 𝑙𝑑𝑖 ≥ 2 & 𝑘 ≠ 𝑗
𝑋𝑗𝑖 = 𝑋𝑗𝑖 − 1
𝑋𝑘𝑖 = 𝑋𝑘𝑖 + 1
𝑆𝑗 = 𝑆𝑗 + 𝑙𝑑𝑖
𝑆𝑘 = 𝑆𝑘 + 𝑙𝑑𝑖
k=M (salgo del bucle)
*k: variable que toma valores del mismo rango que j
La programación de dicha heurística basada en vecindad ha sido desarrollada en lenguaje C y la podemos
encontrar en el Anexo B.
Para que quede más claro mostraremos un ejemplo sencillo:
Disponemos en el almacén de 4 barras (j=1…4) con longitudes 13, 8, 7, y 10 u.d.l. respectivamente. Y de 3
clientes o lotes (i=1…2) con demandas igual a 3 y 2 barras y longitudes de cada demanda de 6 y 8 u.d.l.
respectivamente.
Si seguimos la metodología anteriormente explicada para generar la solución inicial de la heurística, ocurriría
lo siguiente. La barra de almacén con longitud igual a 15 u.d.l. será cortada para satisfacer el primer lote o
cliente, por lo que se cortará la barra con una distancia de 6 u.d.l. y el sobrante (9 u.d.l.) será destinado a
satisfacer la siguiente necesidad del mismo lote o cliente de 6 u.d.l., por lo que se cortará nuevamente. Una vez
hechos estos dos cortes, el sobrante de la barra de almacén j=1 es de 1 u.d.l. por lo que no es suficiente para
satisfacer la última necesidad del primer lote o cliente. Deberemos pasar a la siguiente barra de almacén, la
j=2. Este procedimiento se continuará hasta satisfacer todas las demandas del problema.
En el caso de no cubrir todas las demandas, se repetiría este mismo proceso. Pero esta vez en lugar de asignar
como primera opción la barra de almacén j=1, lo haríamos con la barra j=2 y dejaríamos la barra j=1 para la
última asignación.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
27
Una vez creada la solución inicial, la vecindad empleada será la de sustituir barras asignadas a demandas cuyo
sobrante sea inferior a 2 u.d.l.. En nuestro caso sería el de reemplazar el corte hecho a la barra de almacén j=1
para satisfacer la segunda necesidad del cliente por el de otro cliente cuyo sobrante no sea inferior a 2 u.d.l.,
debido a que el sobrante de la barra j=1 que obteníamos en la solución inicial era de 1 u.d.l. (perjudica a
nuestra FO). Este proceso de vecindad se iría repitiendo por todos los sobrantes inferiores a 2 u.d.l. hasta que
no se puedan hacer más intercambios.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
28
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
29
EXPERÍMENTACÍÓ N
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
30
6.1. Introducción
En este capítulo vamos a explicar el programa usao para obtener resultados que nos sirvan para sacar
conclusiones en relación a nuestras metodologías. En resumen, el proceso seguido para hallar datos
experimentales, una vez que se han diseñado el método exacto y la heurística, consta de los siguientes puntos:
1) Generación de una serie de problemas prototipo lo suficientemente amplia y variada para poder sacar
conclusiones, en formato txt.
2) Generación de los modelos matemáticos que definen los distintos problemas, en formato lg4. Hallar el
óptimo de estos modelos (veremos las dificultades con las que nos encontramos durante el proceso y
la solución adoptada) mediante Lingo.
3) Hallar el resultado que aportan nuestra heurística a nuestro problema.
4) Comparación de método exacto y heurística.
6.2. Generación de Problemas
Con el fin de poder generar los datos de los cuales podamos estudiar y resolver con distintos procedimientos se
ha creado un programa en lenguaje C (Anexo A) con el que se generarán los vectores longitud de barras de
almacén (𝐿𝑗), longitud de las barras de cada lote (𝑙𝑑𝑖) y cantidad de barras demandadas (𝐷𝑖).
Una de las características de las que dispone el programa es la de poder cambiar los diversos tamaños de los
que dispone cada vector, M y N. Para poder así generar varias instancias y hacer varias resoluciones con el fin
de poder comparar unas con otras.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
31
Antes de entrar en el programa debemos mencionar que para la creación de dichos vectores de datos fue
necesario introducir un parámetro al que hemos llamado “R” que hace referencia a la diferencia entre la suma
de longitudes demandadas y las que hay en el almacén expresada en forma de porcentaje. La expresión es la
siguiente:
𝑅 = 100 − (∑ 𝑙𝑑𝑖 ∙ 𝐷𝑖
𝑁𝑖=1
∑ 𝐿𝑗𝑀𝑗=1
∙ 100)
Este parámetro ha sido introducido con el fin de controlar la dificultad de resolución del problema, puesto que
a menor porcentaje de “R” más complicada será la resolución del problema debido a que el sobrante de las
barras del almacén será cada vez menor.
Dicho esto, en el Anexo A podremos observar el programa, teniendo en cuenta que los únicos datos a
modificar son los directorios creados (#define) M, N, H, R, y E, que hacen referencia al tamaño del conjunto 𝑗,
el tamaño del conjunto 𝑖, la semilla de aleatoriedad (cambiada para cada generación), porcentaje de relación y
el error permitido en el porcentaje de relación respectivamente. Éste último ha sido creado puesto que debido a
la magnitud de datos a veces es imposible conseguir un porcentaje de relación exacto.
El programa comienza con la generación de estos vectores mediante unos bluces, asignando a cada
componente de estos un valor aleatorio, los cuales serán entre 10 y 30 para el vector longitud de barras de
almacén (𝐿𝑗), entre 5 y 20 para el vector cantidad de barras demandadas (𝐷𝑖) que será modificado por el
programa hasta conseguir la R deseada (50%, 30% o 15%) y 6, 8, 10 y 12 para el vector longitud de las barras
de cada lote (𝑙𝑑𝑖).
Una vez asignados estos valores se modificará el contenido del vector cantidad de barras demandadas (𝐷𝑖)
hasta un valor deseado, para poder así controlar cual es la cifra de relación u.d.l. de almacén – u.d.l.
demandadas (R) que queremos generar.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
32
En definitiva, las diferentes instancias a resolver son las que se muestran en la siguiente tabla:
j i R
10 3 50%
10 3 30%
10 3 15%
10 8 50%
10 8 30%
10 8 15%
30 10 50%
30 10 30%
30 10 15%
30 21 50%
30 21 30%
30 21 15%
50 15 50%
50 15 30%
50 15 15%
50 35 50%
50 35 30%
50 35 15%
100 35 50%
100 35 30%
100 35 15%
100 80 50%
100 80 30%
100 80 15%
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
33
6.3. Resultados Obtenidos
j i R Resol. Exacta Resol. Heurística
∆ FO ∆ Tiempo Valor FO Tiempo (min) Valor FO Tiempo (min)
10
3
50% 0 0.00 0 0 0 0.00
30% 0 0.00 0 0 0 0.00
15% 0 0.00 0 0 0 0.00
8
50% 0 0.00 0 0 0 0.00
30% 0 0.02 0 0 0 0.02
15% 0 0.00 2 0 -2 0.00
30
10
50% 0 0.10 0 0 0 0.10
30% 0 0.48 0 0 0 0.48
15% 0 0.53 4 0 -4 0.53
21
50% 0 0.25 0 0 0 0.25
30% 0 0.67 0 0 0 0.67
15% 0 8.00 1 0 -1 8.00
50
15
50% 0 0.53 0 0 0 0.53
30% 0 50.53 1 0 -1 50.53
15% 0 36.40 5 0 -5 36.40
35
50% 0 7.57 0 0 0 7.57
30% 0 8.98 0 0 0 8.98
15% 1 240.00 11 0 -10 240.00
100
35
50% 0 192.00 0 0 0 192.00
30% 1 240.00 0 0 1 240.00
15% 5 240.00 13 0 -8 240.00
80
50% 0 18.00 0 0 0 18.00
30% 2 240.00 0 0 2 240.00
15% 10 240.00 20 0 -10 240.00
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
34
Los datos anteriormente mostrados reflejan tanto el valor de la función objetivo como el tiempo empleado en
la resolución del problema, para las dos metodologías empleadas, exacta y heurística. Puesto que para tamaños
de problema grandes la resolución exacta demoraba mucho tiempo se decidió pararla a los 240 min de
funcionamiento.
6.4. Conclusiones
Representando los datos obtenidos para distintas R en el problema en gráficas se ha llegado a las siguientes
conclusiones:
R = 50%
0
1
3 8 10 21 15 35 35 80
10 30 50 100
Valor de la Función Objetivo R=50%
Resol. Exacta
Resol. Heurística
0.00
40.00
80.00
120.00
160.00
200.00
240.00
3 8 10 21 15 35 35 80
10 30 50 100
Tiempo (min) de resolución R=50%
Resol. Exacta
Resol. Heurística
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
35
Según se aprecia en la gráfica, se obtienen los mismos valores de FO usando ambos métodos. Pero la
resolución exacta invierte más tiempo a grandes tamaños de número de barras y demandas.
R = 30%
En este caso podemos observer cómo con una R intermedia el hecho de usar una metodología de resolución
heurística como lo es el Local Search sigue siendo una buena opción, puesto que no solo llega al óptimo en la
gran mayoría de los casos, sino que invierte infinitamente menos tiempo a la hora de la resolución.
0
1
2
3 8 10 21 15 35 35 80
10 30 50 100
Valor de la Función Objetivo R=30%
Resol. Exacta
Resol. Heurística
0.00
40.00
80.00
120.00
160.00
200.00
240.00
3 8 10 21 15 35 35 80
10 30 50 100
Tiempo (min) de resolución R=30%
Resol. Exacta
Resol. Heurística
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
36
R = 15%
Para la resolución más compleja para el modelo, dónde nos encontramos con una R bastante baja, observamos
que se obtienen menores valores de FO con la resolución exacta aunque no distan mucho de la resolución
heurística. El inconveniente es que al aumentar el tamaño de las barras de almacén y de las demadas el tiempo
de resolución aumenta considerablemente, hecho que no se dá en la resolución heurística.
02468
10121416182022
3 8 10 21 15 35 35 80
10 30 50 100
Valor de la Función Objetivo R=15%
Resol. Exacta
Resol. Heurística
0.00
40.00
80.00
120.00
160.00
200.00
240.00
3 8 10 21 15 35 35 80
10 30 50 100
Tiempo (min) de resolución R=15%
Resol. Exacta
Resol. Heurística
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
37
CÓNCLUSÍÓNES GENERALES
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
38
Para concluir, mostraremos aquí las principales conclusiones obtenidas del análisis de resultados.
El Trabajo de Fin de Grado de resolución exacta y heurística del problema de cortes de barras ha querido
afrontar la dualidad de acometer dicho problema con estas dos metodologías, con el objetivo de determiner
cual de las dos es más apropiada.
Una vez resueltos todos los escenarios de las baterías de datos creadas en lenguaje C, los cuales poseen
diferentes características como son número de barras en almacén, demandas, longitudes, … etc. Se ha llegado
a la conclusion de que en la interfaz LINGO se hace complejo el cálculo del óptimo para grandes tamaños de
datos, debido a que el tiempo empleado por éste puede demorar un periodo muy amplio de tiempo. Por lo
contrario para la resolución heurística del problema, pese a no llegar al óptimo, es capaz de lograr una solución
casi tan buena como la aportada por la resolución exacta en infinitamente menos tiempo.
Respecto a baterías de datos más pequeñas y simples del problema, la metodología heurística consumiendo
poco tiempo suele llegar al óptimo en la mayoría de los casos al igual que la metodología exacta, aunque esta
última invirtiendo más tiempo en la resolución, pero dentro de la normalidad.
La realización de este proyecto personalmente me ha servido para aumentar mis conocimientos en la
asignatura de Métodos Cuantitativos de Gestión de 3er curso del Grado en Ingeniería de Organización
Industrial, también me ha ayudado para mejorar a la hora de programar en Visual Basic y a saber implementar
modelos matemáticos basados en problemas reales con el programa LINGO.
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
39
BÍBLÍÓGRAFÍ A
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
40
LINGO user´s guide
Editorial: LINDO SYSTEM INC.
Tesis Doctoral: Métodos y Algoritmos para resolver problemas de Corte unidimensional en entornos
realistas. Aplicación a una empresa del Sector Siderúrgico.
Autor: Carlos P Gracia Calandín
Universidad Politécnica de Valencia, 2013
C/C++ Curso de Programación 2015
Autor: Miguel Angel Acera García
Editorial: Anaya Multimedia, 2014
Heurísticas: Ciencias Experimentales y Tecnología
Autores: Abraham Duarte Muñoz, Juan José Pantrigo Fernández, Micael Gallego Carrillo
Editorial: Dykinson, 2008
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
41
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
42
ANEXÓS
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
43
9.1. ANEXO A: Programación de la Generación de Problemas
#include <stdio.h>
#include <stdlib.h> #define M 100 //tamaño maximo del vector longitud de barras de almacen (j)
#define N 35 //tamaño maximo del vector longitud demandada por lote (i) y cantidad de barras demandadas por
lote (i)
#define H 107 //semilla de aleatoriedad. Cambiada para cada generación de datos #define R 30 //porcentaje deseado de relacion suma longitud barras almacen - suma longitud barras demandadas
#define E 1 //error permitido en el porcentaje de relacion R
float relacion(float v[], float g[], int d[]); //funcion usada para calcular el valor de R
int main()
{
int j,i,a;
float c=0; //valor del porcentaje de relacion conseguido
float L[M]; //declaracion del vector longitud de barras de almacen
float ld[N]; //declaracion del vector longitud de barras demandadas por lote int D[N]; //declaracion del vector cantidad de barras demandadas por lote
/////////////////////////////// GENERACION VECTOR LONGITUD DE BARRAS DE ALMACEN ///////////////////////////////////
srand(H);
for(j=0;j<M;j++)
{ L[j]=rand()%20+10; //otorga un valor aleatorio entre 10 y 30 a cada componente del VECTOR
LONGITUD BARRAS DE ALMACEN
}
/// GENERACION VECTORES CANTIDAD DE DEMANDA DE CADA LOTE Y LONGITUD DE BARRAS DEMANDADAS ///
for(i=0;i<N;i++)
{ a=rand()%100+1; //otorga a la variable "a" un valor entre 1 y 100
if(a<=25)
{
ld[i]=6; //otorga el valor 6 a una componente (i) del vector longitudes de demanda en el caso de que a<=25
}
if(a>25 && a<=50)
{ ld[i]=8; //otorga el valor 9 a una componente (i) del vector longitudes de demanda en el
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
44
caso de que 25<a<=50
}
if(a>50 && a<=75)
{
ld[i]=10; //otorga el valor 12 a una componente (i) del vector longitudes de demanda en el caso de que 50<a<=75
}
if(a>75 && a<=100)
{
ld[i]=12; //otorga el valor 15 a una componente (i) del vector longitudes de demanda en el
caso de que 75<a<=100
}
}
for(i=0;i<N;i++)
{ D[i]=rand()%15+5; //otorga un valor aleatorio entero, entre 5 y 20 a cada componente del
VECTOR CANTIDAD DE BARRAS DEMANDADAS POR LOTE
}
/////////////////////////////////////////// COMPARACION DE SUMA DE LONGITUDES //////////////////////////////////////////////// // modifico los valores del vector cantidad de barras demandadas, hasta conseguir la R deseada //
for(i=0;i<N;i++)
{
if(R>c+E) //en el caso de que el valor de R conseguido sea menor al deseado restaremos 1 a una
componente del vector cantidad de barras demandadas
{
D[i]=D[i]-1;
if(D[i]<1) //garantizamos que ninguna demanda sea menor que 1
{
D[i]=1;
}
c=relacion(L, ld, D); //actualizo el valor de la relacion
}
if(R<c-E) //en el caso de que el valor de R conseguido sea mayor al deseado sumaremos 1 a una
componente del vector cantidad de barras de almacen
{
D[i]=D[i]+1;
if(D[i]<1) //garantizamos que ninguna demanda sea menor que 1
{
D[i]=1;
}
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
45
c=relacion(L, ld, D); //actualizo el valor de la relacion
}
if(R>c+E && i==N-1) //seguire iterando hasta conseguir el valor de R deseado +-1
{ i=-1;
}
if(R<c+E && i==N-1) //seguire iterando hasta conseguir el valor de R deseado +-1
{
i=-1;
}
if(R>c-E && R<c+E)
{
i=N;
}
}
c=relacion(L, ld, D);//vuelvo a calcular el valor de R para ver cual es el definitivo
///////////////////////////////////////////////////////////// SACO POR PANTALLA /////////////////////////////////////////////////////////
printf("MODEL: \n\n\n\nSets:\n\nBalmacen/1..%d",M);
printf("/: L, S, y1, y2, alpha1, alpha2; \n\nBdemanda/1..%d", N);
printf("/: ld, D; \n\nBalmacen_Bdemanda(Balmacen, Bdemanda): x;\n\nEndSets\n\n\n\n");
printf("Data:\n\n");
//DATOS GENERADOS
printf("L= "); //saco por pantalla el valor del vector longitud de barras de almacen
for(j=0;j<M;j++)
{
printf(" %f", L[j]);
}
printf(";");
printf("\n \n");
printf("ld= "); //saco por pantalla el valor del vector longitudes de barras de lotes
for(i=0;i<N;i++)
{
printf(" %f", ld[i]);
} printf(";");
printf("\n \n");
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
46
printf("D= "); //saco por pantalla el valor del vector cantidad de barras por lote
for(i=0;i<N;i++)
{ printf(" %d", D[i]);
}
printf(";");
printf("\n\nEndData\n\n\n\n");
//RESTRICCIONES
printf("@for(Balmacen(j): @sum(Bdemanda(i):(ld(i)*x(j,i)))+S(j) = L(j));\n\n");
printf("@for(Bdemanda(i): @sum(Balmacen(j): x(j,i)) = D(i));\n\n");
printf("@for(Balmacen(j): S(j) = (y1(j)) + y2(j));\n");
printf("@for(Balmacen(j): alpha1(j) + alpha2(j) <=1);\n\n");
printf("@for(Balmacen(j): 0 <= y1(j));\n");
printf("@for(Balmacen(j): y1(j) <= ((2-0.01)*alpha1(j)));\n");
printf("@for(Balmacen(j): (2*alpha2(j)) <= y2(j));\n");
printf("@for(Balmacen(j): y2(j) <= (L(j)*alpha2(j)));\n\n\n\n");
//FUNCION OBJETIVO
printf("Min = @sum(Balmacen(j): y1(j));\n\n\n\n");
//DECLARACION DE VARIABLES
printf("@for(Balmacen(j): @BIN(alpha1(j)));\n");
printf("@for(Balmacen(j): @BIN(alpha2(j)));\n\n");
printf("@for(Balmacen(j): @for(Bdemanda(i): @GIN(x(j,i))));\n\n");
//VALOR DE R
printf("!La relacion almacen-demanda es del: %f",c);
printf(" porciento;");
printf("\n\n\n\nEND");
return 0;
}
float relacion(float v[], float g[], int d[]) //funcion usada para calcular el valor de R
{
int j, i; float a=0, b, c;
for(j=0;j<M;j++)
{ a=a+v[j]; //bucle que suma todas las componentes del vector longitud de barras de almacen
}
b=0;
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
47
for(i=0;i<N;i++)
{
b=b+(d[i]*g[i]); //bucle que multiplica la cantidad demandada por la longitud solicitada de cada lote y las suma
}
c=100-((b/a)*100); //calculo el valor de R actual
return c;
}
9.2. ANEXO B: Programación de la Heurística
#include <stdio.h> #include <stdlib.h>
#define M 100 //tamaño maximo del vector longitud de cada barra de almacen (j)
#define N 80 //tamaño maximo del vector longitud demandada por lote (i) y cantidad de barras demandadas por
lote (i) #define H 48 //semilla de aletoriedad. Cambiada para cada generación de datos
#define R 50 //porcentaje deseado de relacion suma longitud barras almacen - suma longitud barras demandadas
#define E 1 //error permitido en el porcentaje de relacion R
void GeneracionDatos (float L[], float ld[], int D[], float c); //funcion usada para generar los datos
float relacion(float v[], float g[], int d[]); //funcion usada para calcular el valor de R cada vez que el vector
demanda es modificado float FuncionObjetivo(float P[]); //calcula el valor de la funcion onjetivo de nuestro problema
int main()
{
int i, j, k;
float L[M];
float ld[N];
int D[N];
int X[M][N]; //Variable entera que representa el número de cortes realizados a la barra (j) para
satisfacer la demanda del lote (i)
float FO=0;
int p=0;
float c; //valor del porcentaje de relacion conseguido
GeneracionDatos(L, ld, D, c); //Genero los datos usados en dicha Heuristica
for(i=0; i<N; i++) //Damos valor 0 a todas las componentes de la matriz, puesto que como minimo el
valor de dicha variable debe ser 0
{
for(j=0; j<M; j++)
{
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
48
X[j][i]=0;
}
}
///////////////////////////////////// GENERACION DE UNA SOLUCION INICIAL ///////////////////////////////////////////////
//Regla de despacho FIFO, primero en ser candidato es el primero en ser asignado
for(i=0; i<N; i++)
{
for(j=p; j<M; j++)
{ if(L[j]>=ld[i] && D[i]>0) //Miramos si la barra que tenemos en el almacen tiene una
longitud igual o superior a la demandada por dicho lote
{ //y si para ese lote tenemos cubierta la demanda. En ese caso, daremos
paso a las siguientes operaciones: X[j][i]=X[j][i]+1; //aumentaremos en una unidad nuestra variable del problema,
es decir, haremos un corte a la barra j para satisfacer la demanda i
L[j]=L[j]-ld[i]; //el valor de la longitud de nuestra barra de almacen se actualizará, de forma que quedará el restante de haber realizado el corte
D[i]=D[i]-1; //la demanda para dicho lote se vera satisfecha en una unidad, por
lo que le restaremos 1
}
if(D[i]==0)
{ j=M; //en el caso de que la demanda del lote i ya haya sido satisfecha, pararemos
el bucle y pasaremos al siguiente lote i
}
if(L[j]>=ld[i])
{ j=j-1; //si el sobrante de la barra de almacen evaluada sigue teniendo una
longitud con la que poder satisfacer la demanda del lote la volveremos a cortar
}
}
if(p>0) //en el caso de la reasignacion, al comenzar a asignar a una barra que no es la primera
debemos contemPlar la opcion de asignacion a las barras anteriores a la que se ha comenzado a asignar
{
for(j=0; j<p; j++)
{ if(L[j]>=ld[i] && D[i]>0)
{ X[j][i]=X[j][i]+1;
L[j]=L[j]-ld[i];
D[i]=D[i]-1;
}
}
}
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
49
if(D[i]>0) //garantizo la satisfaccion de la demanda, de forma que si no ha sido ya satisfecha
reasignariamos los cortes por la siguiente barra de almacen y no por la j=0
{ i=i-1;
p=p+1;
} }
FO=FuncionObjetivo(L);
printf("\nFO solucion inicial= %f", FO);
/////////////////////////////////////////////////////// LOCAL SEARCH //////////////////////////////////////////////////////////
for(i=0; i<N; i++) // haremos el seguimiento de los valores segun los lotes (i)
{
for(j=0; j<M; j++)
{ if(X[j][i]>0 && L[j]<2) //para cada barra de almacen que haya sido cortada con el fin de
satisfacer la demanda del lote i y cuyo sobrante sea <2 haremos:
{
for(k=0; k<M; k++)
{
if(L[k]>=ld[i] && L[k]-ld[i]>=2 && k!=j) //buscar una barra de almacen
con sobrante suficiente para reemplazar la demanda cubierta por la otra barra y que el resultado de cortarla no perjudique la FO (el sobrante final no sea <2)
{
X[j][i]=X[j][i]-1; //suprimiriamos el cortar la barra inicial, que nos supone una penalizacion para la FO
X[k][i]=X[k][i]+1; //cortariamos la nueva barra, la cual no
perjudica nuestra FO
L[j]=L[j]+ld[i]; //actualizo el valor del sobrante de la barra inicial (incrementa)
L[k]=L[k]-ld[i]; //actualizo el valor del sobrante de la nueva
barra (disminuyo) k=M; //una vez encontrada una nueva barra que me mejore la FO
paso a otra barra que me esté perjudicando la FO
}
}
}
}
}
FO=FuncionObjetivo(L);
printf("\nFO LS= %f", FO);
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
50
return 0;
}
void GeneracionDatos(float L[], float ld[], int D[], float c)
{ int j,i,a;
///////////////////////////////// GENERACION VECTOR LONGITUD DE BARRAS DE ALMACEN ////////////////////////////////
srand(H);
for(j=0;j<M;j++)
{ L[j]=rand()%20+10;
}
/////////// GENERACION VECTORES CANTIDAD DE DEMANDA DE CADA LOTE Y LONGITUD DE BARRAS DEMANDADAS ////////// for(i=0;i<N;i++)
{
a=rand()%100+1; if(a<=25)
{
ld[i]=6;
}
if(a>25 && a<=50)
{ ld[i]=8;
}
if(a>50 && a<=75)
{
ld[i]=10;
}
if(a>75 && a<=100)
{ ld[i]=12;
}
}
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
51
for(i=0;i<N;i++)
{
D[i]=rand()%15+5;
}
///////////////////////////////////// COMPARACION DE SUMA DE LONGITUDES //////////////////////////////////////////////
// modifico los valores del vector cantidad de barras demandadas, hasta conseguir la R deseada //
for(i=0;i<N;i++)
{ if(R>c+E)
{
D[i]=D[i]-1;
if(D[i]<1)
{ D[i]=1;
}
c=relacion(L, ld, D);
}
if(R<c-E)
{
D[i]=D[i]+1;
if(D[i]<1)
{
D[i]=1;
}
c=relacion(L, ld, D);
}
if(R>c+E && i==N-1)
{ i=-1;
}
if(R<c+E && i==N-1)
{
i=-1;
}
if(R>c-E && R<c+E)
{
Trabajo de Fin de Grado:
RESOLUCIÓN EXACTA Y HEURÍSTICA DEL PROBLEMA DE CORTES DE BARRAS
52
i=N;
}
}
}
float relacion(float v[], float g[], int d[])
{
int j, i;
float a, b, c;
a=0;
for(j=0;j<M;j++)
{
a=a+v[j];
}
b=0;
for(i=0;i<N;i++)
{
b=b+(d[i]*g[i]);
}
c=100-((b/a)*100);
return c;
}
float FuncionObjetivo(float P[])
{
float FO=0; //declaracion de la variable Funcion Objetivo del problema, la cual siempre será >=0
int j;
for(j=0; j<M; j++)
{
if(P[j]<2)
{
FO=FO+P[j];
}
}
return FO;
}
Top Related