Está en la página 1de 10

SCHEDULING E

INVENTARIOS
 

 
 
Modelos para Job Shops I  
 
 
 
 

 
 
 

 
 
 
 

 
 
 

 
 
 
 

 
 
 
   
 

• MODELOS  PARA  JOB  SHOPS  I  


 

En  las  semanas  anteriores,  estudiamos  problemas  de  programación  de  tareas  para  sistemas  
tipo  flow  shop.  Desde  este  módulo,  estudiaremos  los  problemas  de  programación  de  tareas  
en  ambientes  tipo  job  shop.    Así,  mientras  que  en  un  sistema  flow  shop,  los  trabajos  debían  
recibir  una  operación  en  todas  las  máquinas  y  el  orden  de  las  operaciones  era  el  mismo,  en  
un   ambiente   job   shop,   los   distintos   tipos   de   trabajos   deben   recibir   una   operación   en   cada  
estación,  pero  no  necesariamente  en  el  mismo  orden.  

En   algunos   ambientes   de   manufactura   (especialmente   en   la   industria   de   producción   de  


semiconductores),   los   trabajos   deben   visitar   una   estación   más   de   una   vez   para   recibir  
operaciones   diferentes,   en   estos   casos   se   dice   que   existe   re-­‐visita   o   re-­‐circulación.   Sin  
embargo,  estos  tipos  de  problema  no  están  dentro  del  alcance  de  nuestro  curso.  

En  lo  que  resta  del  curso,  examinaremos  lo  siguiente:  

• Representación  de  problemas  tipo  job  shop.  


• Formulación  de  problemas  tipo  job  shop.  
• Descripción  dl  procedimiento  Branch  &  Bound  para  encontrar  la  solución  óptima.  
• Heuristica  Shiffting  Bottleneck  para  la  solución  de  problemas  tipo  job  shop.  
• Aplicación   de   programación   por   restricciones   (CP:   Constraint   Programming)   para   la  
minimización  del  makespan.    

Programación  disyuntiva  y  Branch  &  Bound  


Consideremos   un   problema  !2||!!"#  con   dos   máquinas   y   n   trabajos.   Algunos   trabajos   tienen  
que  ser  procesados,  primero,  en  la  maquina  1  y  luego,  en  la  máquina  2,  mientras  que  otros  
trabajos   tendrán   que   ser   procesados   primero   en   la   máquina   2   y   luego   en   la   máquina   1.   El  
tiempo   de   procesamiento   del   trabajo   j   en   la   máquina   i   está   dado   por    !!,! ,   es   decir,   el   tiempo  
de   proceso   del   trabajo   j   en   la   máquina   1   es  !!,! ,   mientras   que   el   tiempo   de   proceso   del  
trabajo  j  en  la  máquina  2  es  !!,! .  

El  problema  descrito  anteriormente  se  puede  reducir  !2||!!"#  de  la  siguiente  forma:  sea  !!,!  
el  conjunto  de  trabajos  que  tienen  que  ser  procesados  primero  en  la  máquina  uno  y  sea  !!,!  el  
conjunto  de  trabajos  que  tienen  que  ser  procesados  primero  en  la  máquina  dos.  Cuando  un  
trabajo   del   conjunto   !!,!  termina   su   procesamiento   en   la   máquina   1,   al   aplazar   su  
procesamiento   en   la   máquina   2   no   afecta   el   makespan   siempre   y   cuando,   la   máquina   2   se  
mantenga  ocupada.    

 
2   [ POLITÉCNICO GRANCOLOMBIANO]
 

De  manera  similar,  se  puede  establecer    el  análogo  para  el  conjunto  !!,! :  cuando  un  trabajo  
del  conjunto  !!,!  termina  su  procesamiento  en  la  máquina  2,  el  aplazar  su  procesamiento  en  
la  máquina  1  no  afecta  el  makespan  siempre  y  cuando,  la  máquina  1  se  mantenga  ocupada.  
Por   lo   tanto,   un   trabajo   del   conjunto  !!,!  tiene   mayor   prioridad   en   la   máquina   1   que   cualquier  
trabajo   del   conjunto  !!,! .   Una   vez   establecido   lo   anterior,   solo   queda   determinar   en   qué  
secuencia  los  trabajos  del  conjunto  !!,!  van  a  ser  atendidos  en  la  máquina  1y  en  qué  secuencia  
los  trabajos  del  conjunto  !!,!  van  a  ser  atendidos  en  la  máquina  2.  

La   primera   de   estas   dos   secuencias   puede   ser   determinada   si   se   considera   el   conjunto   de  


trabajos  !!,!  como   un   problema  !2||!!"# ,  con   la   máquina   1   en   la   primera   estación   y   la  
segunda   máquina   en   la   segunda   estación.   La   segunda   secuencias   se   puede   determinar  
considerando  el  conjunto  de  trabajos  !!,!  como  un  problema  !2||!!"#  con  la  máquina  1  en  la  
segunda  estación  y  la  máquina  2  en  la  primera  estación.  Lo  cual  nos  lleva  a  unas  secuencias  
tipo  SPT(1)-­‐LPT(2)  para  cada  uno  de  los  dos  conjuntos  con  prioridades  entre  clases  como  se  
mencionó  anteriormente.  

Este  problema  de  dos  máquinas  es  uno  de  los  pocos  de  tipo  job  shop  que  tienen  un  algoritmo  
de   solución   con   complejidad   polinomial.   Existe   otro   pequeño   grupo   que   tienen   un   algoritmo  
con  dicha  complejidad,  pero  exige  que  los  tiempos  de  procesamiento  sean  1  o  0.  

La  minimización  del  makespan  en  un  problema  tipo  !"||!!"#  puede  ser  representada  en  un  
grafo   disyuntivo.   Tomemos   un   grafo   dirigido   G   con   un   conjunto   de   Nodos   N   y   dos   conjuntos  
de  arcos  A  y  B.  Los  nodos  N  corresponden  a  las  operaciones  (i,  j)  que  deben  ser  realizadas  
sobre  los  n  trabajos.  Los  arcos  conjuntivos  A  representan  las  rutas  de  los  trabajos.  Si  el  arco  (i,  
j)  (k,  j)  hace  parte  de  A,  entonces  el  trabajo  j  tiene  que  ser  procesado  en  la  máquina  i  antes  
de   ser   procesado   en   la   máquina   k,   i.e.,   la   operación   (i,   j)   precede   a   la   operación   (k,   j).   Dos  
operaciones   que   pertenecen   a   dos   trabajos   diferentes   y   tienen   que   ser   procesadas   en   la  
misma  máquina  están  conectados  entre  sí  por  dos  arcos  disyuntivos  que  van  en  direcciones  
opuestas.  Los  arcos  disyuntivos  B  forman  m  ciclos  de  dobles  arcos.  Adicionalmente,  existe  un  
nodo  origen  U  y  un  nodo  destino  V  los  cuales  son  dummy.  El  nodo  de  origen  U  tiene  n  arcos  
conjuntivos   que   salen   de   él   hacia   los   nodos   que   representan   las   primeras   operaciones   de   los  
n  trabajos.  Mientras  que  el  nodo  de  destino  V  tiene  n  arcos  conjuntivos  que  llegan  a  él  desde  
los   nodos   que   representan   las   últimas   operaciones   de   los   n   trabajos.   La   siguiente   figura  
muestra  un  ejemplo  de  tres  trabajos  que  deben  pasar  por  tres  estaciones  en  diferente  orden.  
Por  simplicidad  del  gráfico,  los  arcos  disyuntivos  dobles  han  sido  reemplazados  por  un  arco  
bidireccional  de  color  Rojo.  

 
[ SCHEDULING E INVENTARIOS] 3
 

1,1 2,1 3,1

U 3,2 2,2 1,1 V

2,3 3,3 1,3


 
Una  solución  factible  consiste  en  seleccionar  un  arco  disyuntivo  de  cada  pareja  disponibles  
(para   cada   par   de   nodos),   de   modo   tal,   que   el   grafo   dirigido   resultante   sea   acíclico.   Lo  
anterior  selección  determina  el  orden  en  el  cual  las  operaciones  tienen  que  ser  ejecutadas  en  
esa  máquina.  Dicha  solución  nunca  podrá  contener  ciclos  dirigidos.  

El  makespan  de  cualquier  solución  factible  está  determinado  por  la  ruta  más  larga  en  G(D),  
donde  G(D)  es  el  conjunto  de  arcos  conjuntivos  desde  el  nodo  origen  U  hasta  el  nodo  destino  
V.  Esta  ruta  posee  un  conjunto  de  operaciones  que  comienza  en  el  instante  0  y  finaliza  en  el  
instante   tfinal,   donde   tfinal   es   igual   al   makespan.   Cada   operación   de   esta   ruta   es  
inmediatamente  seguida  por  la  siguiente  en  la  misma  máquina  de  otro  trabajo  o  la  siguiente  
operación   del   mismo   trabajo   en   otra   máquina.   El   problema   de   minimizar   el   makespan   se  
convierte  en  el  problema  de  reducir  la  longitud  de  la  ruta  más  larga,  esto  es  la  ruta  crítica.  

Existen  muchas  formulaciones  matemáticas  para  el  problema  tipo  job  shop  sin  recirculación  
que   incluyen   formulaciones   MIP.   Sin   embargo,   la   formulación   más   utilizada   es   conocida  
como   “Disjunctive   Programming   Formulation”.   Dicha   formulación   está   relacionada   con   la  
representación  por  medio  del  grafo  disyuntivo.  

Para  presentar  la  formulación  de  programación  disyuntiva  (Disjunctive  Programming  


Formulation),  definiremos:  

• !!,! :  denota  el  tiempo  en  que  inicia  la  operación  (i,  j).  
• !:  conjunto  de  restricciones  de  precedencia,  (i,  j)    (k,  j)  indica  que  el  trabajo  j  debe  
ser  procesado  en  la  máquina  i  antes  de  ser  procesado  en  la  máquina  k.  
• !:  el  conjunto  de  nodos  donde  cada  nodo  representa  una  operación.  
!"#"$"%&'  !!"#  
Sujeto  a  

!!,! − !!,! ≥ !!,! ;        ∀ !, ! → !, ! ∈ !  

 
4   [ POLITÉCNICO GRANCOLOMBIANO]
 

!!"# − !!,! ≥ !!,! ;      ∀ !, ! ∈ !  

!!,! − !!,! ≥ !!,!          !      !!,! − !!,! ≥ !!,! ;              ∀ !, !   ⋏ !, !  ! = 1, … , !  

!!,! ≥ 0;              ∀ !, ! ∈ !  

En   esta   formulación,   el   primer   conjunto   de   restricciones   asegura   que   la   operación   (k,   j)   no  


puede   iniciar   antes   que   la   operación   (i,   j)   termine.   El   tercer   conjunto   de   restricciones   son  
llamadas   restricciones   disyuntivas;   ellas   aseguran   que   exista   algún   orden   entre   las  
operaciones  de  diferentes  trabajos  que  tienen  que  ser  procesadas  en  la  misma  máquina.  

Ejemplo  
Observemos   el   siguiente   ejemplo   con   cuatro   (4)   máquinas   y   tres   (3)   trabajos.   La   ruta,   es  
decir,  la  secuencia  de  máquinas  y  tiempos  de  procesamiento  se  dan  en  la  siguiente  tabla:  

Secuencia  de   Tiempos  de  


Trabajos  
máquinas   procesamiento  
1   1,2,3   p11=10,  p21=8,  p31=4  
2   2,1,4,3   p22=8,  p12=3,  p42=5,  p32=6  
3   1,2,4   p13=4,  p23=7,  p43=3  
 

La   función   objetivo   es   la   variable  !!"# .   EL   primer   conjunto   de   restricciones   consiste   de   7  


restricciones:  dos  para  el  trabajo  1,  tres  para  el  trabajo  2  y  dos  para  el  trabajo  3.  Un  ejemplo  
de  este  conjunto  de  restricciones  es:  

!!,! − !!,! ≥ 10  

El  segundo  conjunto  de  restricciones  consiste  de  10  restricciones,  una  para  cada  operación.  
Un  ejemplo  de  este  conjunto  de  restricciones  es:  

!!"# − !!,! ≥ 10  

El  conjunto  de  restricciones  disyuntivas  contiene  ocho  restricciones:  tres  para  las  máquinas  1  
y  2,    una  para  la  máquina  3  y  una  para  la  máquina  4.  Un  ejemplo  de  este  conjunto  de  
restricciones  es:  

!!,! − !!,! ≥ 3    !    !!,! − !!,! ≥ 10  

El  último  conjunto  de  restricciones  incluye  diez  restricciones  no  negativas,  una  para  cada  
tiempo  de  inicio  de  operación.  

El  grafo  disyunto  correspondiente  sería  el  siguiente:  

 
[ SCHEDULING E INVENTARIOS] 5
 

1,1 2,1 3,1

U 2,2 1,2 4,2 3,2 V

1,3 2,3 4,3


 
□  

A  continuación,  se  muestra  una  implementación  en  GAMS©  para  resolver  un  problema  tipo  
job   shop   a   través   de   la   formulación   de   programación   disyuntiva.   Dentro   de   la   formulación   se  
encuentra  la  explicación  del  mismo.  

 
□  

 
6   [ POLITÉCNICO GRANCOLOMBIANO]
 

Ramificación  y  acotamiento  (Branch  &  Bound)  


Antes  de  explicar  el  procedimiento  Branch  &  Bound,  recordaremos  que  el  schedule  es  activo  
(active   shcedule)   si   no   es   alterado   de   ninguna   manera   y   logra   que   alguna   operación   sea  
completada  “más  temprano”  y  sin  que  las  otras  operaciones  terminen  “más  tarde”.  

Que   un   schedule   sea   activo   implica   que   cuando   un   trabajo   llega   a   una   máquina   es   procesado  
lo   antes   posible   en   el   orden   prescrito.   Un   schedule   activo   no   puede   tener   ningún   periodo  
ocioso,   donde   la   operación   de   un   trabajo   en   espera   pueda   caber.   Lo   anterior   implica,   que   en  
este  caso,  no  se  puede  minimizar  el  makespan  sin  incrementar  el  tiempo  de  inicio  de  alguna  
tarea.  

Un   procedimiento   de   ramificación   (Branching),   que   es   usado   comúnmente.   se   basa   en   la  


generación   de   todos   los   schedules   activos.   Todos   estos   schedules   activos   pueden   ser  
generados   por   un   algoritmo   simple,   en   el   cual   !  representa   el   conjunto   de   todas   las  
operaciones   cuyos   predecesores   ya   han   sido   programados   (conocido   como   el   conjunto   de  
las  operaciones  programables)  y  !!,!  el  instante  de  tiempo  más  temprano  en  el  que  se  inicia  el  
procesamiento   de   la   operación   (i,   j)   en  !.     A   continuación,   se   presenta   de   forma   resumida   el  
funcionamiento  de  dicho  algoritmo:  

Algoritmo  para  la  generación  de  todos  los  schedules  activos  

Paso  1.  Condiciones  iniciales  

Sea  !,  el  conjunto  que  contenga  todas  las  operaciones  iniciales  de  cada  trabajo.  

Sea  !!,! = 0,  para  todo   !, ! ∈ !  

Paso  2.  Selección  de  maquina  

Calculemos  para  cada  schedule  parcial  

! ! = min !!,! + !!,!  


!,! ∈!

y  denotemos  ! ∗ ,  la  máquina  en  la  cual  se  alcanza  el  mínimo.  

Paso  3:  (Ramificación/Branching)  

Sea  !!  el  conjunto  de  todas  las  operaciones  (! ∗ , !)  en  la  máquina  ! ∗  tales  que  

!! ∗ ,! < !(!)  

Para  cada  operación  en  !′  considere  un  schedule  parcial  (extendido)  con  la  operación  
como  la  siguiente  en  la  máquina  ! ∗ .  

Para  cada  uno  de  los  schedules  parciales  (extendidos),  hay  que  borrar  la  operación  de  
!  ,  incluir  su  sucesor  inmediato  en  !  y  regresar  al  paso  2.  

 
[ SCHEDULING E INVENTARIOS] 7
 

El  algoritmo  anterior  es  la  base  para  el  proceso  de  ramificación.  En  el  paso  tres  se  realiza  la  
ramificación   del   nodo   que   es   caracterizado   por   el   schedule   parcial   dado,   el   número   de   ramas  
es   igual   al   número   de   operaciones   en  !′.   Con   este   algoritmo   se   puede   generar   el   árbol  
completo.   Las   hojas   del   árbol   (los   nodos   de   la   parte   inferior   del   árbol)   corresponden   a   todos  
los  schedules  activos  posibles.  

Un   nodo   en   el   árbol   corresponde   a   un   schedule   parcial,   este   se   caracteriza   por   una   selección  
de   arcos   disyuntivos,   los   cuales   indican   el   orden   en   que   todos   los   predecesores   de   un  
conjunto  !  han   sido   programados.   Una   rama   que   sale   del   Nodo  !  corresponde   a   la   selección  
de   una   operación   ! ∗ , ! ∈ !′  a   ser   realizada   en   la   máquina  ! ∗ .   El   arco   disyuntivo   ! ∗ , ! →
! ∗ , !  es  añadido  a  la  máquina  ! ∗  para  todas  las  operaciones   ! ∗ , !  que  todavía  no  han  sido  
programadas   en   la   máquina  ! ∗ .     Lo   anterior   implica   que   el   nuevo   nodo   (recientemente  
creado)   en   el   nivel   inferior,   llamémoslo  ! ! ,   el   cual   corresponde   a   un   schedule   parcial   con   solo  
una   operación   más,   contiene   varios   arcos   disyuntivos   que   ahora   son   seleccionados.  
Refirámonos  al  grafo  que  incluye  todos  los  arcos  conjuntivos  y  el  conjunto  D’  como  el  grafo  
!(!! ).  El  número  de  ramas  que  salen  del  nodo  !  es  igual  al  número  de  operaciones  en  !! .  

Para  encontrar  una  cota  inferior  para  el  makespan  en  el  nodo  !,  considere  el  grafo  G(D’).  El  
largo  de  la  ruta  crítica  en  este  grafo  es  una  cota  inferior.  

Ejemplo  
Consideremos  el  problema  presentado  en  el  ejemplo  anterior:  

Secuencia  de   Tiempos  de  


Trabajos  
máquinas   procesamiento  
1   1,2,3   p11=10,  p21=8,  p31=4  
2   2,1,4,3   p22=8,  p12=3,  p42=5,  p32=6  
3   1,2,4   p13=4,  p23=7,  p43=3  
 

El  grafo  inicial  solo  contiene    arcos  conjuntivos  como  se  muestra  en  la  siguiente  figura:  

1,1 10 2,1 8 3,1

0 4

U 0 2,2 8 1,2 3 4,2 5 3,2 6 V

0 3

1,3 4 2,3 7 4,3


 

 
8   [ POLITÉCNICO GRANCOLOMBIANO]
 

El   makespan   correspondiente   a   este   grafo   es   22.   Al   aplicar   el   método   Branch   &   Bound   (en  
adelante  B&B)  a  esta  instancia,  se  obtiene:  

Nivel  1:  

  ! = { 1,1 ; 2,2 ; (1,3)}  


  ! ! = min 0 + 10; 0 + 8; 0 + 4 = 4  
  ! ∗ = 1  

  !! = { 1,1 ; (1,3)}  

Así,  hay  dos  nodos  de  interés  en  el  nivel  1,  uno  correspondiente  a  la  operación  (1,  1)  que  es  
procesada  primero  en  la  máquina  1,  y  el  otro,  correspondiente  a  la  operación  (1,  2)    procesada,  
primero,  en  la  máquina  1.  

Si   la   operación   (1,   1)   es   programada   primero,   entonces,   los   dos   arcos   disyuntivos,   que   se  
muestran  en  la  figura  siguiente,  son  añadidos  al  grafo:  

1,1 10 2,1 8 3,1

0 4
10

U 0 2,2 10 8 1,2 3 4,2 5 3,2 6 V

0 3

1,3 4 2,3 7 4,3


 
 

El  nodo  está  caracterizado  por  los  dos  arcos  disyuntivos:  

(1,  1)  (1,  2)  

(1,  1)    (1,  3)  

La   adición   de   estos   dos   arcos   disyuntivos   incrementa,   inmediatamente,   la   cota   inferior   del  
makespan  a  24.  Para  mejorar  esta  cota  se  puede  generar  para  la  máquina  1,  una  instancia  de  
un   problema   tipo  1 ! !!"# ,   donde   el   release   date   del   trabajo   j   es   determinado   por   la   ruta  
más  larga  desde  el  nodo  de  origen  U  hasta  el  (1,  j)  en  el  grafo  anterior.  El  due  date  del  trabajo  
j  se  calcula  por  medio  de  la  ruta  más  larga  desde  el  nodo  (1,  j)  hasta  el  nodo  de  destino  V,  que  

 
[ SCHEDULING E INVENTARIOS] 9
 

se  resta  !!,!  de  la  longitud,  y  luego  resta  el  valor  obtenido  de  24.  Estos  cálculos  nos  llevan  al  
siguiente  problema  para  una  sola  máquina:  

J1   J2   J3  
 
p1,j   10   3   4  
r1,j   0   10   10  
d1,j   10   13   14  
 

La  secuencia  que  minimiza  !!"#  es  123,  con  un  !!"# = 3.  Esto  implica  que  una  cota  
inferior  para  el  makespan  en  el  nodo  correspondiente  es  24+3  =  27.  

Una  instancia  de  1 !! !!"#  se  puede  generar  para  la  máquina  2  de  la  misma  forma.  El  release  
date  y  el  due  date  son:  

J1   J2   J3  
 
p1,j   8   8   7  
r1,j   10   0   14  
d1,j   20   10   21  
 

La   secuencia   óptima   para  1 !! !!"#  es   213   con   un  !!"# = 4.   Esto   genera     una   cota  
inferior  mejor  para  el  makespan  en  el  nodo  que  corresponde  programar  primero  la  operación  
(1,  1),  24+4=28.  Al  analizar  las  máquinas  3  y  4  no  conducen  a  una  mejor  cota  inferior.  

El  proceso  continua  explorando  todos  los  nodos  que  no  han  sido  examinados  hasta  que  se  
obtiene   la   solución.   Se   recomienda   revisar   las   lecturas   adicionales   para   obtener   mayor  
detalle  en  este  procedimiento.  

 
10   [ POLITÉCNICO GRANCOLOMBIANO]