Está en la página 1de 8

LABORATORIO: SOLUCIONES SESIÓN L8

Se presenta a continuación la modelización y la solución mediante solver del problema


correspondiente a la sesión L8 (enunciados 4 y 9).

Se añaden comentarios en azul para guiar la modelización.

Enunciado 4

Los taxis de una ciudad se distribuyen en 4 turnos (de 10 horas de trabajo sin interrupciones) que
empiezan a las 6, a las 9, 13 y a las 20 horas. La demanda instantánea es la que se indica en la tabla;
esto es, se necesita la cantidad de taxis indicados en la columna para satisfacer la demanda de
dichas horas. Se trata de plantear un programa lineal para determinar cuántas licencias de taxi
deberían ofrecerse para poder cumplir con la demanda.

No. de taxis Horas


1000 6-9
500 9-13
800 13-16
250 16-18
700 18-19
750 19-20
300 20-22
800 22-23
100 23-24
400 0-1
50 1-6

Este es un problema sencillo que, por cómo se distribuyen la necesidad de taxis en cada franja
horaria, se puede resolver manualmente. De hecho, si observamos la tabla con detenimiento,
podemos ya deducir que el número de taxis que debe componer el primer turno (el que empieza a
las 6 horas) debe ser 1000, ya que este turno es el único que opera en la franja horaria de 6 a 9 y
esa franja es la que demanda un mayor número de taxis. Razonamientos similares se pueden
realizar para encontrar manualmente el número de taxis que se asignan a cada turno de forma que
se cumpla la necesidad de taxis en cada una de las franjas.
Sin embargo, modelizar de forma generalizada este problema es valioso, ya que utilizaremos una
herramienta de representación de datos que nos puede resultar muy útil en otros problemas de
modelización lineal: la matriz binaria. Esta matriz indicará con un 1 si un turno está disponible en
una franja concreta, y con un 0 si no lo está. Esta representación facilitará la modelización posterior
del problema.
Modelización

Datos
Como hemos avanzado, representamos con una matriz binaria (Cij) si un turno i está trabajando
durante una franja j. Veamos un ejemplo: el primer turno empieza a trabajar a las 6h, y lo hace
hasta las 16h (ya que los turnos son de 10 horas). Por lo tanto, este turno está operativo durante las
primeras tres franjas, con lo que la primera fila de la matriz es (1,1,1,0,0,0,0,0,0,0,0). Y así con los
otros cuatro turnos.
Además, la tabla del enunciado nos indica la demanda de taxis en cada franja, que se debe cumplir
mediante la distribución de los taxis por los turnos.
i Turnos (i = 1, 2, 3, 4)
j Franjas (j = 1, …, 11)
Dj Demanda de taxis en la franja j(∀j)
Cij Matriz binaria que indica si el turno i cubre la franja j(∀i; ∀j)

Variables
Debemos saber el número de taxis que se asignan a cada turno i
xi Variable entera. Número de taxis asignados al turno i(∀i)

Función objetivo
Aunque no se explicita en el enunciado, desde un punto de vista de sostenibilidad económica se
desea minimizar la cantidad de taxis en cada turno, ya que así se ajustan la cantidad de licencias
que se dan a la necesidad real de taxis.
[𝑀𝑀𝑀𝑀𝑀𝑀]𝑧𝑧 = � 𝑥𝑥𝑖𝑖
∀𝑖𝑖

Restricciones
Esta única restricción permite cumplir con la demanda de taxis en cada una de las franjas. Así, para
cada una de las franjas (∀𝑗𝑗), se suma la cantidad de taxis en todos los turnos, multiplicando por el
valor correspondiente de la matriz binaria, que indica si efectivamente el turno está operando en
esa franja. Entonces, esta matriz actúa como filtro, ya que solamente permite sumar los taxis
asignados a un turno si este turno está circulando en la franja que se considere. Evidentemente esta
suma de taxis operativos en cada franja debe ser mayor o igual a la demanda de la franja.

� 𝐶𝐶𝑖𝑖𝑖𝑖 ∙ 𝑥𝑥𝑖𝑖 ≥ 𝐷𝐷𝑗𝑗 ∀𝑗𝑗


∀𝑖𝑖

Finalmente, se impone la no negatividad de las variables.


𝑥𝑥𝑖𝑖 ≥ 0 ∀𝑖𝑖
Solución

Valor de la función objetivo: número total de taxis = 2150.

Valores de las variables: número de taxis en cada turno.

X1 X2 X3 X4
1000 0 750 400

Enunciado 9

Una línea de montaje está formada por una cinta transportadora para el producto y operarios,
situados a uno lado y otro a lo largo de la cinta, que van realizando las operaciones asignadas en el
ensamblaje del producto final.En este ejercicio estudiaremos el problema de equilibrado de líneas
de montaje, consistente en realizar un reparto del trabajo de montaje del producto final entre los
operarios de la línea, intentando que cada uno de ellos realice la misma cantidad de trabajo. Para
poder realizar dicho reparto de forma correcta, es necesario descomponer el trabajo total de montaje
en operaciones simples que, posteriormente, se asignen a cada trabajador de forma específica
cumpliendo con algunas limitaciones.

Veamos un ejemplo. El montaje del producto se ha dividido en ocho operaciones que llamaremos
A, B, C, D, E, F, G y H. El tiempo de proceso de cada una de ellas es 3, 4, 5, 3, 5, 5, 2, 8 segundos,
respectivamente. Adicionalmente hay una relación de precedencia entre las tareas A y B; C y D; B
y E; D y E; E y F; F y G; F y H.La figura 1 muestra una representación de los datos mediante un
grafo dirigido. Los vértices representan las tareas, con su duración expresada con un número al
lado del vértice, y las relaciones de precedencia están representadas por los arcos.

Si el tiempo de ciclo fuera igual a 10 segundos, una posible solución sería la siguiente la siguiente
figura, compuesta por 4 estaciones:
Esta solución cumple las restricciones marcadas:
• Cada agrupación de tareas en una estación tiene carga inferior o igual a 10
• Las relaciones de precedencia se realizan en la misma estación o en una posterior
• Se han asignado todas las tareas a alguna estación

Para simplificar el problema, se desea únicamenteminimizar el tiempo de ciclo considerando que


se dispone de 6 operaciones (A-B-C-D-E-F) y 2 estaciones de trabajo.El modelo debe buscar una
asignación de operaciones a las diferentes estaciones, factible con las relaciones de precedencia y
que minimice el tiempo de ciclo necesario.

En este problema, nos proponen asignar un total de 6 operaciones (A-B-C-D-E-F) a dos estaciones
de trabajo, de manera que se minimice el tiempo de ciclo y se cumplan las precedencias entre
operaciones. Entonces, parece claro que debemos definir una variable binaria que nos diga si una
operación concreta se asigna a una estación determinada. A partir de aquí se acaban las deducciones
fáciles y aparecen las complicaciones, que son mayormente dos.
Por una parte, debemos minimizar el tiempo de ciclo. Como hay dos estaciones que se sitúan en
serie (debe ser así porque en paralelo no se podría cumplir con las precedencias), el tiempo de ciclo
viene determinado por la estación que tenga asignadas operaciones que duren más tiempo. Esta
estación marcará, entonces, el cuello de botella, y definirá consecuentemente el tiempo de ciclo del
proceso. Sin embargo, a raíz de esta explicación se puede deducir que la función objetivo no será
una función como las que vemos habitualmente; si no que se deberían calcular dos valores (el
tiempo de operaciones en cada estación) y escoger el que sea mayor. Veremos cómo lo hacemos
en la modelización.
Por otra parte, debemos cumplir con las precedencias. Aquí es importante no ir más allá: el
enunciado no nos pide que definamos un orden de realización de operaciones, solamente que
asignemos las operaciones a las estaciones, es decir, que digamos si una operación se debe realizar
en la estación primera o, en su defecto, en la segunda. Por lo tanto, basta con imponer que, si una
operación viene precedida por otra, o bien se asigna en la misma estación que su precursora o en
la siguiente. En cambio, si una operación no tiene precedentes, tenemos libertad para asignarla a la
primera o a la segunda estación (no hay restricción asociadas, y se asignará de forma que se
minimice el tiempo de ciclo). Entendida esta explicación, vamos a ver como lo conseguimos en la
modelización.
Modelización

Datos
Sabemos la duración de una tarea i (Di) y sus precedencias. De manera similar al problema anterior,
este dato se representa mediante una matriz binaria. Esta matriz indica con un 1 si la operación i’
viene precedida por la operación i, y con un 0 en caso contrario. Por ejemplo, Pi i’ = 1 cuando i =
1(A) y i’ = 2(B), ya que existe una relación de precedencias entre A y B. Fijémonos que utilizamos
el subíndice i’ (y no otro como j o k) para referirnos al mismo concepto (una operación, que tiene
asignado el subíndice i) pero considerando distintos valores. Es decir, si definiéramos la matriz
binaria como (Pi i∀i), solamente podríamos definir las precedencias entre A y A, entre B y B, entre
C y C, y así sucesivamente, lo que no resultaría útil.

i Operaciones (i = 1(A), 2(B), 3(C), 4(D), 5(E), 6(F))


j Estaciones (j = 1, 2)
Di Duración de la tarea i (∀i)
Pi i’ Relación de precedencia entre cada par de tareas i y i’ (∀i)

Variables
Debemos definir una variable binaria que nos indique si la operación i se asigna a la estación j.
Además, para determinar el tiempo de ciclo, definimos una variable auxiliar (t) que será calculada
en las restricciones. Esta variable nos permitirá modelizar el problema de forma lineal, como vamos
a ver a continuación.

aij Variable binaria. 1 si la operacióni se realiza en la estación j; 0 en caso contrario (∀ij)


t Variable entera. Tiempo que dura el ciclo

Función objetivo
Siguiendo con el razonamiento que hemos realizado para entender el enunciado, podemos pensar
en representar la función objetivo de la siguiente forma (en azul). Repasamos: el tiempo de ciclo
viene fijado por la máxima duración de una estación; es decir, si la suma de duraciones de las
operaciones asignadas a la estación 1 fuera 13 segundos, por ejemplo, y a la estación 2 fuera 11
segundos, el tiempo de ciclo vendría marcado por la estación 1 y sería 13. Sin embargo, este es un
problema que se denomina min-max (porque queremos minimizar un valor máximo) y no es lineal.

[𝑀𝑀𝑀𝑀𝑀𝑀] 𝑧𝑧 = 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐 = max(𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑ó𝑛𝑛 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒ó𝑛𝑛 1, 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑ó𝑛𝑛 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒ó𝑛𝑛 2)

Muchos problemas que nos podemos encontrar adoptan la forma de min-max, ya que persiguen el
equilibrio. Por ejemplo, no tiene sentido que una estación tarde en completar sus operaciones 3
segundos, por ejemplo, si la otra tarda 19 y se debe esperar. Por tanto, es más adecuado que las dos
estaciones estén equilibradas. Otro ejemplo puede ser la carga de trabajo que se impone un
estudiante poco ambicioso. Delante de dos exámenes, este estudiante tiene dos opciones extremas:
puede decidir no ir a clase ni estudiar para el primero, y sacar un 0, y trabajar día y noche para
sacar un 10 en el segundo; o equilibrar su esfuerzo en los dos exámenes y sacar dos 5. Si opta por
la segunda opción, sus esfuerzos de trabajo se pueden modelizar mediante un problema min-max.

Estos problemas siempre se linealizan de la misma manera: se crea una variable auxiliar que
indique lo que queremos minimizar (t en nuestro caso, para el tiempo de ciclo), y se calcula el valor
de esta variable auxiliar en las restricciones. Dicho esto, la función objetivo es entonces trivial.

[𝑀𝑀𝑀𝑀𝑀𝑀]𝑧𝑧 = 𝑡𝑡

Restricciones

Vamos a ver primero cómo calculamos el valor de la variable auxiliar t para completar la
modelización min-max. Como hemos dicho, el tiempo de ciclo t debe ser el máximo de la suma de
duraciones de las operaciones (carga de trabajo) asignadas en cada una de las estaciones. Por lo
tanto, para cada estación (∀𝑗𝑗), se suman las duraciones de todas las operaciones, multiplicando por
si realmente esa operación se ha asignado a esa estación, y se coge el mayor valor (este objetivo de
escoger el máximo se consigue mediante esta ecuación de signo ≥. Recordar que toda solución
factible requiere del cumplimiento simultáneo de todas las condiciones, en el caso que nos ocupa,
las condiciones de carga de trabajo, tiempo de ciclo >= carga de trabajo de la estación. Si debemos
asegurar el cumplimiento de dicha condición para cada una de las estaciones será requisito
indispensable que t adopte el valor máximo, en caso contrario el modelo no tendría solución
factible, o lo que es lo mismo, se estaría incumpliendo con alguna de las condiciones).

Veamos un ejemplo para entender bien como funciona. Imaginemos por un instante que se asignan
a la estación 1 las operaciones A, B, C y D, mientras que las operaciones E y F se asignan a la
segunda estación (esto sería el resultado del problema, lo que indicaría la variable de decisión 𝑎𝑎𝑖𝑖𝑖𝑖 ).
Entonces, se calcularía el tiempo de duración de cada estación: para la primera, se sumaría la
duración de las cuatro primeras estaciones, que es de 15 segundos; para la segunda, se sumaría la
duración de las dos últimas, que es de 10 segundos. En este caso, tendríamos 𝑡𝑡 ≥ 15 por j = 1, y
𝑡𝑡 ≥ 10 por j = 2. Evidentemente, el valor de t quedaría marcado por la condición más restrictiva
(𝑡𝑡 ≥ 15), y como este tiempo de ciclo se quiere minimizar en la función objetivo, el valor resultante
del tiempo de ciclo sería 15. Por tanto, la función objetivo y la restricción planteada, conjuntamente,
calculan y fijan el tiempo de ciclo.

No obstante, debemos tener en cuenta que, al resolver el problema, no solamente se calculará y


fijará un tiempo de ciclo para una combinación de asignación de operaciones a estaciones, sino que
se probarán todas las asignaciones posiblescambiando los valores de la variable de decisión del
problema (𝑎𝑎𝑖𝑖𝑖𝑖 ). Por tanto, también se probará de asignar, por ejemplo, A, B y C a la estación 1, y
D, E, y F a la estación 2, entre otras combinaciones. Cada una de estas asignacionesdará lugar a un
nuevo cálculo y a una nueva fijación del tiempo de ciclo. En consecuencia, el problema analiza
todas las combinaciones de asignación de forma conjunta, y se quedará con la que obtenga un
menor tiempo de ciclo.

𝑡𝑡 ≥ � 𝑎𝑎𝑖𝑖𝑖𝑖 ∙ 𝐷𝐷𝑖𝑖 ∀𝑗𝑗


∀𝑖𝑖

Nos queda imponer las restricciones necesarias para que la asignación de operaciones a estaciones
sea factible. La primera es la de precedencias. Como hemos dicho, basta con imponer que, si una
restricción viene precedida por otra, se asigne a la misma estación que su precursora, o en la
siguiente. Este razonamiento se consigue mediante la siguiente ecuación, que se aplica solamente
a las parejas de operaciones que están ligadas por una relación de precedencia (∀𝑖𝑖 ∀𝑖𝑖′ | 𝑃𝑃𝑖𝑖𝑖𝑖′ = 1).

Analicemos el ejemplo de las operaciones i = 1(A) y i’ = 2(B), entre las cuales hay una relación de
precedencias. Existen dos casos posibles:
- Caso 1, A se asigna a la estación 1 (𝑎𝑎11 =1). Entonces, la parte izquierda de la inecuación
vale 1, ya que se multiplica j=1 por una variable binaria que también vale 1. Por lo tanto, la
parte derecha de la igualdad puede valer ser igual o mayor a 1. Sería igual (valdría 1), si B
también se asigna a la primera estación; y sería mayor (valdría 2), si se asigna a la segunda.
- Caso 2, A se asigna a la estación 2 (𝑎𝑎12 =1). En este caso, la parte izquierda de la inecuación
vale 2, ya que se multiplica j=2 por una variable binaria que vale 1. Por lo tanto, la parte
derecha de la inecuación no puede ser 1, y en consecuencia B no se puede asignar a la
estación 1. La parte derecha de la inecuación debe valer 2, obligando a asignar B a la
segunda estación, y cumpliendo con la relación de precedencias.

Os animamos a reproducir este mismo ejemplo para las otras relaciones de precedencias si aún no
ha quedado bien claro. Esta es una restricción complicada, pero permite también mostraros la gran
diversidad de condiciones que se pueden imponer con las herramientas de qué disponemos.

� 𝑗𝑗 ∙ 𝑎𝑎𝑖𝑖𝑖𝑖 ≤ � 𝑗𝑗 ∙ 𝑎𝑎𝑖𝑖 ′ 𝑗𝑗 ∀𝑖𝑖 ∀𝑖𝑖′ | 𝑃𝑃𝑖𝑖𝑖𝑖′ = 1


∀𝑗𝑗 ∀𝑗𝑗

Por último, se debe imponer que una operación se asigna a una sola estación. Por lo tanto, para
cada operación (∀𝑖𝑖), la suma de variables binarias que indican su asignación a las distintas
estaciones debe ser igual a 1.
� 𝑎𝑎𝑖𝑖𝑖𝑖 = 1 ∀𝑖𝑖
∀𝑗𝑗

Finalmente, se impone la no negatividad de las variables no binarias.


𝑡𝑡 ≥ 0

Solución

Valor de la función objetivo: tiempo de ciclo = 13

Valores de las variables: t = 13, y se asignan a la estación 1 las operaciones A, B y C, mientras que
se asignan a la segunda las operaciones E, F y G. Veamos que el tiempo de ciclo viene entonces
marcado por la segunda estación.

a11 a12 a21 a22 a31 a32 a41 a42 a51 a52 a61 a62
1 0 1 0 1 0 0 1 0 1 0 1

También podría gustarte