• No se han encontrado resultados

Optimizando el secuenciamiento de tareas mediante un algoritmo genético con dinámica del cuello de botella

N/A
N/A
Protected

Academic year: 2022

Share "Optimizando el secuenciamiento de tareas mediante un algoritmo genético con dinámica del cuello de botella"

Copied!
75
0
0

Texto completo

(1)
(2)

Optimizando el secuenciamiento de tareas mediante un algoritmo genético con dinámica del cuello de

botella

por

Ing. Israel Marck Martinez Perez

Tesis

Presentada al Programa de Graduados en Computation, Information y Comunicaciones

del

Instituto Tecnológico y de Estudios Superiores de Monterrey, Campus Monterrey como requisito parcial para obtener el grado académico de

Maestro en Ciencias

Instituto Tecnológico y de Estudios Superiores de Monterrey Campus Monterrey

Monterrey, N.L. Mayo de 2000

(3)

© Israel Marck Martínez Perez, 2000

(4)

Dedicatoria

A Dios, por haberme permitido alcanzar una meta más en la vida.

A mis padres, con todo mi amor y cariño, como un tributo a su esfuerzo realizado en la formation de mis hermanos y en la mía.

A mis hermanos, Eliseo y Rocío, como motivación para seguir sus mas anhelados sueños.

A la memoria de mis abuelitos y a la salud de mis abuelos.

A ella

iv

(5)

Reconocimientos

Deseo expresar mi mas profundo agradecimiento a todas las personas e instituciones que hicieron posible este trabajo de investigación:

Al Dr. Manuel Valenzuela, por sus valiosos consejos en el transcurso de la inves- tigación y por invitarme a participar en este proyecto.

Al Dr. Fernando Mata y al Dr. Horacio Martinez, por su minuciosa revision de este trabajo, por sus sugerencias y comentarios.

Al Dr. Francisco Cantú, por brindarme la oportunidad de trabajar en el Centro de Inteligencia Artificial al inicio de mis estudios.

Al Centro de Inteligencia Artificial, por facilitar el uso de sus instalaciones y equipo.

Al Consejo Nacional de Ciencia y Tecnología (CONACYT), por su apoyo y finan- ciamiento al proyecto.

A toda mi familia, por todo su apoyo y entusiasmo.

A Dora Elia, por su invaluable apoyo y motivation durante mis estudios de maestría.

ISRAEL MARCK MARTÍNEZ PÉREZ

Instituto Tecnológico y de Estudios Superiores de Monterrey Mayo 2000

(6)

Optimizando el secuenciamiento de tareas mediante un algoritmo genético con dinámica del cuello de

botella

Israel Marck Martínez Pérez, M.C.

Instituto Tecnológico y de Estudios Superiores de Monterrey, 2000

Asesor de la tesis: Dr. Manuel Valenzuela Rendón

En esta tesis de investigación se realiza un estudio para resolver uno de los problemas más importantes dentro de la industria y uno de los mas complejos de la Inteligencia Artificial: la programación de tareas. Se propone un algoritmo genético en combinación con la heurística dinámica del cuello de botella para optimizar este problema en una y multiples maquinas de acuerdo a los objetivos de la production justo a tiempo y tardanza ponderada. Se realizan experimentos con mas de 300 problemas de diferentes características y restricciones como lo son el factor de rango, el factor de tardanza, el número de tareas, el número de maquinas y el tipo de ambiente. Los resultados muestran una estrategia de optimization eficiente y robusta que bien puede tratar con las restricciones y objetivos que demandan los problemas del mundo real.

(7)

Índice General

Dedicatoria iv

Reconocimientos v

Resumen vi

Índice de Tablas ix

Índice de Figuras x

Capítulo 1 Introducción 1

Capítulo 2 El modelo de programación de tareas 3

2.1 Programación de tareas 3

2.2 Programación de tareas en una máquina 4

2.3 Clasificación de problemas en una maquina 5

2.4 Objetivos de la producción 6

2.5 Fundamentos de maquinas paralelas 7

2.5.1 El modelo de maquinas paralelas 7

2.6 Resumen 8

Capitulo 3 Dinámica del cuello de botella 10

3.1 Definición 10

3.2 Aplicando DCB al problema estático de secuenciamiento de tareas . . . 11

3.3 Minimizando la tardanza ponderada 12

3.4 Minimizando la penalization por entregas prematuras y por entregas

tardías 16

3.5 Dinámica del cuello de botella para multiples maquinas 19 3.5.1 Secuenciamiento en multiples maquinas con DCB 19

3.5.2 Minimizando la tardanza ponderada 20

3.5.3 La heurística de despacho 21

3.6 Resumen 21

(8)

Capítulo 4 Algoritmos genéticos 22

4.1 AGs: un panorama general 22

4.2 Codification para programación de tareas en una máquina 25

4.3 Herencia en algoritmos genéticos 26

4.4 Resumen 26

Capítulo 5 Optimizando el secuenciamiento de tareas mediante un al- goritmo genético con dinámica del cuello de botella 28 5.1 AGs: un nuevo enfoque para la programación de tareas 28

5.2 Combinando algoritmos genéticos con DCB 29

5.2.1 Codification del cromosoma 29

5.3 El algoritmo genético híbrido 30

5.4 Minimizando la tardanza ponderada 31

5.4.1 Modelo del problema 31

5.4.2 Experimentos 31

5.4.3 Resultados (Twt / 1 máquina/dinámico) 33

5.5 Minimizando la penalization por entregas prematuras y entregas tardías 37

5.5.1 Modelo del problema 37

5.5.2 Experimentos 38

5.5.3 Diseño de los experimentos 38

5.5.4 Resultados (ETwt / l máquina/estático) 40

5.5.5 Resultados (ETwt/l máquina/dinámico) 43

5.6 Implementation de maquinas paralelas en el AG híbrido 46 5.6.1 Minimizando la tardanza ponderada como función objetivo . . . 46

5.6.2 Un algoritmo robusto 47

5.6.3 Experimentos 47

5.6.4 Resultados (Twt/máquinas paralelas/dinámico) 48 5.7 Algunas recomendaciones para mejorar el desempeño del algoritmo genético

híbrido 49

5.8 Resumen 50

Capítulo 6 Herencia y el algoritmo genético híbrido 52 6.1 Incorporando herencia en el algoritmo genético híbrido 52

6.2 Experimentos 53

6.3 Resultados (ETwt/l máquina/dinámico) 53

6.4 Resumen 56

Capítulo 7 Conclusiones 60

Vita 64

viii

(9)

Índice de Tablas

3.1 Datos del ejemplo 14

3.2 Ciclo 1 15

3.3 Ciclo 2 15

3.4 Ciclo 3 16

3.5 Ciclo 4 16

3.6 Ciclo 5 16

5.1 Datos del problema 1 32

5.2 Parámetros del AG para el problema 1 32

5.3 Datos del problema 2 33

5.4 Parámetros del AG para el problema 2 33

5.5 Complejidad de los experimentos 39

5.6 Parámetros del AG para el problema estático (50 y 100 tareas) 40 5.7 Parámetros del AG para el problema dinámico (50 tareas) 40 5.8 Parámetros del AG para el problema dinámico (100 tareas) 41 5.9 Resultados ETwt estático para 8 tareas (promedio) 43 5.10 Resultados ETwt estático para 50 tareas (promedio) 43 5.11 Resultados ETwt estático para 100 tareas (promedio) 43 5.12 Resultados ETwt dinámico para 50 tareas (promedio) 44 5.13 Resultados ETwt dinámico para 100 tareas (promedio) 44 5.14 Parámetros del AG para el problema de maquinas paralelas (50 y 100

tareas) 48

6.1 Parámetros del AG con herencia para problemas de 100 tareas 53

(10)

Índice de Figuras

3.1 Heurística para Twt 13

3.2 Heurística lineal. Tardanza ponderada 13

3.3 Heurística exponencial R&M. Tardanza ponderada 14

3.4 Heurística para ETwt 18

3.5 Heurística LINET 18

4.1 Esquema del algoritmo genético simple 24

5.1 Mejor individuo contra número de evaluaciones para AGT1 (problema 1). 34 5.2 Mejor individuo contra número de evaluaciones para AGT2 (problema

1) 35

5.3 Mejor individuo contra número de evaluaciones para AGT3 (problema 1). 35 5.4 Mejor individuo contra número de evaluaciones para AGT1 (problema 2). 36 5.5 Mejor individuo contra número de evaluaciones para AGT2 (problema 2). 36 5.6 Mejor individuo contra número de evaluaciones para AGE1 (100 tareas,

estático, T=0.2, R=1.0) 42

5.7 Mejor individuo contra número de evaluaciones para AGE1 (100 tareas,

estático, T=0.6, R=0.4) 42

5.8 Mejor individuo contra número de evaluaciones para AGE1 (100 tareas,

dinámico, T=0.6, R=0.4) 45

5.9 Mejor individuo contra número de evaluaciones para AGE2 (100 tareas,

dinámico, T=0.6, R=0.4) 45

5.10 Mejor individuo contra número de evaluaciones para AGE3 (100 tareas,

dinámico, T=0.6, R=0.4) 46

5.11 Mejor individuo contra número de evaluaciones para AGMP (50 tareas,

T=0.8, R=0.2) 49

5.12 Mejor individuo contra número de evaluaciones para AGMP (100 tareas,

T=0.8, R=0.2) 50

6.1 Mejor individuo contra número de evaluaciones para AGE2 (T=0.6,

R=0.4) 54

x

(11)

6.2 Mejor individuo contra número de evaluaciones para AGHl (10% población

evaluada, T=0.6, R=0.4) 55

6.3 Mejor individuo contra número de evaluaciones para AGH2 (20% población

evaluada, T=0.6, R=0.4) 55

6.4 Mejor individuo contra número de evaluaciones para AGH3 (30% población

evaluada, T=0.6, R=0.4) 56

6.5 Mejor individuo contra número de evaluaciones para AGE2 (T=0.2,

R=1.0) 57

6.6 Mejor individuo contra número de evaluaciones para AGHl (10% población

evaluada, T=0.2, R=1.0) 57

6.7 Mejor individuo contra número de evaluaciones para AGH2 (20% población

evaluada, T=0.2, R=1.0) 58

6.8 Mejor individuo contra número de evaluaciones para AGH3 (30% población

evaluada, T=0.2, R=1.0) 59

(12)

Capítulo 1

Introducción

La programación de tareas es una actividad económicamente muy importante para cualquier industria manufacturera y de servicios. Una eficiente programación de la producción se verá reflejada en una disminución de los costos de producción, en un aumento de la capacidad de producción y una mejor calidad de los productos; sin embargo, no es un problema sencillo de resolver, ya que es un problema del tipo NP difícil, los cuales se caracterizan porque su complejidad crece exponencialmente de acuerdo al tamaño del problema. Es por esta razón que desde hace algunas décadas investigadores de diversas áreas del conocimiento entre las que destacan la ingeniería industrial, la investigación de operaciones y más recientemente la inteligencia artificial, se han dedicado a modelar matemáticamente este problema, sin que hasta el momento se haya encontrado un método que permita satisfacer los requerimientos de optimalidad, memoria y tiempo.

En esta tesis se aborda el problema utilizando una de las tecnologías de la in- teligencia artificial más relevantes de los últimos tiempos: los algoritmos genéticos.

Hoy en día existe un gran número de investigaciones realizadas con estos métodos para resolver diferentes modelos de programación de tareas; sin embargo, la mayoría tienen como común denominador un algoritmo genético que manipula directamente los programas de tareas representados en el cromosoma. En este trabajo se presenta un en- foque diferente, en donde el algoritmo genético trabaja en conjunto con una heurística conocida como dinámica del cuello de botella, para encontrar secuencias de tareas que optimizan algunos de los objetivos de la producción más importantes en la industria: la producción justo a tiempo y la penalización por entregas tardías en el secuenciamiento de tareas en una máquina y en máquinas paralelas.

La tesis se encuentra organizada de la siguiente manera. En el capítulo 2 se presentan los fundamentos del modelo de la programación de tareas en una y múltiples máquinas. En el capítulo 3 se explican los principios de la heurística dinámica del cuello de botella. El funcionamiento y los conceptos básicos de los algoritmos genéticos se muestran en el capítulo 4. En el capítulo 5 se formaliza el algoritmo genético híbrido y se presentan los resultados obtenidos de una serie de experimentos para observar su desempeño en diferentes tipos de problemas. El capítulo 6 tiene que ver con la

(13)

incorporación de herencia en el modelo para satisfacer los requerimientos de tiempo de ejecución. Por último, en el capítulo 7 se presentan las conclusiones de la investigación.

(14)

Capítulo 2

El modelo de programación de tareas

En este capítulo se define el problema de la programación de tareas así como los fun- damentos del modelo de la programación de tareas en una máquina. Se describe la terminología, notación y los principales objetivos económicos utilizados en la literatu- ra, y que serán empleados a lo largo de esta tesis. Se presenta además una extensión a este modelo: el modelo de máquinas paralelas. El estudio de este problema es impor- tante porque en la práctica es común que los recursos se encuentren en paralelo para despachar los trabajos de una manera más eficiente y, representa uno de los problemas a resolver en esta investigación.

2.1 Programación de tareas

La programación de tareas consiste en organizar, escoger, y fijar tiempos de uso de un recurso para llevar a cabo todas las actividades necesarias para producir las salidas deseadas, en los tiempos deseados, satisfaciendo un gran número de restricciones de relación y de tiempo entre las actividades y los recursos asignados al proceso (Morton y Pentico, 1994). Las principales decisiones que se tienen que tomar en la progra- mación de tareas son del tipo de secuenciamiento, ruteo, reconfiguración de recursos y de actividades. Tomar buenas decisiones puede tener resultados económicamente muy importantes dentro de la industria, ya que una eficiente programación de la producción se verá reflejada en una disminución de los costos de producción, en un aumento de la capacidad de producción y una mejor calidad de los productos; sin embargo, es un problema muy difícil de resolver; su complejidad radica en que su espacio de soluciones está dado por la cardinalidad recursos x tareasx tiempo, por lo que para problemas de tamaño razonable el costo computacional requerido para solucionarlos puede ser muy alto e incluso intratable (Mattfeld, 1995). Esto sin tomar en cuenta el número de restric- ciones tales como el tiempo límite para elaborar algún producto, restricciones técnicas de algunos procesos, escasez de recursos y otros más que dificultan la programación.

Por esta razón, la programación de tareas ha sido objeto de numerosos estudios e in- vestigaciones para definir métodos heurísticos y probabilísticos que permitan encontrar

(15)

buenas soluciones de acuerdo a uno o varios objetivos económicos dentro de la produc- ción. Algunos ejemplos de estos métodos son búsqueda tabú (Glover, 1990; DellÁmico y Trubian, 1991); recocido simulado (Laarhoven et al., 1992), redes neuronales (Shaw et al., 1992), dinámica del cuello de botella (Morton y Pentico, 1994), y algoritmos genéticos (Goldberg y Lingle, 1985).

2.2 Programación de tareas en una máquina

La programación de tareas en una máquina consiste de un número finito de tareas n esperando ser procesados por un único recurso m. Cada tarea j hace fila para esperar por el recurso, en lo que se dice ser un problema de secuenciamiento de tareas. Sólo una tarea puede ser procesada a la vez. Los siguientes conceptos están directamente relacionados con una tarea j (Morton y Pentico, 1994):

Tiempo de procesamiento (pj). Es el tiempo que tarda en procesarse la tarea j en el recurso m.

Tiempo de llegada (aj). Es el tiempo en que la tarea j arriva al sistema, por lo que se encuentra lista para ser procesada.

Fecha límite (dj). La fecha límite dj representa la fecha en que la tarea j debe ter- minar su procesamiento, es decir, la fecha prometida de entrega al cliente.

Ponderación (WJ). La ponderación de una tarea j nos dice qué tan importante es una tarea para ser procesada primero en relación a otras tareas. Regularmente esta ponderación está dada en términos de utilidades. Existen algunas variantes como wej que es la importancia de una tarea para que no se entregue antes de su fecha límite, y wtj, que indica la importancia de una tarea para que no se entregue después de su fecha límite.

Tiempo de completamiento (Cj). El tiempo de completamiento es el tiempo en que la tarea j completa su procesamiento desde el inicio de operaciones del sis- tema.

Tiempo de flujo (Fj). Es la cantidad de tiempo que una tarea j permanece dentro del sistema.

Demora (Lj). Es el margen de tiempo positivo o negativo en que la tarea j excede su fecha límite.

(16)

Tardanza (Tj). Es el margen de tiempo en que una tarea j termina su procesamiento después de la fecha límite; si termina antes entonces la tardanza es cero.

Tj = max{0, Lj}.

Tempranez (Ej). Es el margen de tiempo en que una tarea j termina su procesamien- to antes de la fecha límite; si termina después entonces la tempranez es igual a cero.

Ej = max{0, — Lj}.

2.3 Clasificación de problemas en una máquina

La programación de tareas en una máquina puede ser clasificada de diferentes maneras tomando en cuenta las restricciones que se pueden tener en el ambiente (estático o dinámico), en los procesos (con interrupciones o sin interrupciones) y en los objetivos de la producción (regulares e irregulares) que se intenten minimizar.

Ambiente estático. En el ambiente estático todas las tareas se encuentran disponibles al inicio de la operación del sistema; es decir, o, = 0 para todas las tareas.

Ambiente dinámico. En el ambiente dinámico las tareas pueden estar llegando en el transcurso de la operación del sistema.

Procesos sin interrupción. En este criterio, una tarea no puede ser suspendida has- ta finalizar su procesamiento.

Procesos con interrupción permitida. Se puede suspender sin costo alguno el pro- ceso de una tarea para dar paso a una más importante. La tarea suspendida puede continuar su procesamiento más adelante.

Objetivos regulares. En un objetivo regular, siempre es preferible terminar una tarea antes de su fecha límite, que incurrir en costos por terminarla después de esta fecha.

Objetivos irregulares. Los objetivos irregulares no solamente toman en cuenta el tiempo en que una tarea se propasa de su fecha límite, sino que también penaliza otros factores, como el tiempo de anticipación con que se entrega.

El problema de programación de tareas en una máquina puede simplificarse con- siderando ciertas condiciones iniciales como es el caso de un ambiente estático y obje- tivos de la producción regulares.

(17)

2.4 Objetivos de la producción

Un sistema de producción puede tener uno o más objetivos por cumplir que pueden ser clasificados como regulares o irregulares; ya sea para maximizar la utilización del recurso, minimizar el tiempo de flujo de una tarea en el sistema, o minimizar alguna medida de la tardanza de la tarea. A continuación se presentan algunos de los objetivos típicos utilizados en los sistemas de producción:

Makespan. Este objetivo trata de minimizar el tiempo de completamiento de las tareas. La idea intuitiva del makespan es que si se terminan de procesar antes de tiempo, permite a otras nuevas tareas empezar su procesamiento por adelantado.

Cmax = max{C¿}.

Tiempo de flujo ponderado. El tiempo de flujo ponderado trata de minimizar el lapso de tiempo que las tareas permanecen en el sistema de acuerdo a su impor- tancia.

Demora ponderada. Este objetivo intenta disminuir el margen de tiempo positivo o negativo que las tareas exceden su fecha límite para evitar una penalización Wj.

Tardanza ponderada. Objetivo de la producción que intenta minimizar el margen de tiempo positivo en que las tareas propasan su fecha límite de acuerdo a su importancia.

Tiempo de flujo máximo. El tiempo de flujo máximo trata de minimizar la cantidad de tiempo que las tareas permanecen dentro del sistema.

Demora máxima. Este objetivo de la producción se encarga de reducir el lapso de tiempo (positivo o negativo) que las tareas exceden su fecha límite.

= max{Lj}.

(18)

Tardanza máxima. Objetivo de la producción que minimiza la cantidad de tiempo positivo en que las tareas propasan su fecha límite. Este objetivo es importante cuando los clientes soportan pequeñas tardanzas en la entrega de sus pedidos, pero su disgusto aumenta progresivamente en tardanzas mayores.

7^ax = max{Tj}.

Número de tareas tardías. Este objetivo intenta disminuir el número de tareas tardías resultando de gran utilidad cuando los clientes no aceptan tareas retrasadas, por lo que la orden se pierde.

donde p(x) =

Penalización por entregas prematuras y entregas tardías. Este objetivo pena- liza cada tarea que se entrega antes o después de su fecha límite. Es muy útil cuando los clientes no quieren sus tareas retrasadas pero tampoco las recogen cuando están listas con anticipación.

2.5 Fundamentos de máquinas paralelas

El estudio de las máquinas paralelas se puede considerar como una generalización de la programación de tareas en una máquina. La diferencia radica en que no solamente hay que determinar una secuencia de tareas, sino que además se tienen que tomar decisiones de ruteo; es decir, decidir que máquina será la encargada de procesar una tarea dada.

Existen diferentes modelos para máquinas paralelas (Pinedo, 1995). Se puede hablar de máquinas paralelas idénticas si una tarea puede ser procesada durante el mismo lapso de tiempo en cualquiera de las máquinas; o de máquinas paralelas diferentes, cuando el tiempo de procesamiento de una tarea varía dependiendo de la máquina que la esté procesando. El modelo general de máquinas paralelas considera ambos casos anteriores.

2.5.1 El modelo de máquinas paralelas

La programación de tareas en múltiples máquinas (paralelas) consiste de un número finito de tareas n esperando ser procesadas por una cantidad M de recursos paralelos.

Cada tarea j hace fila para esperar ser procesada por alguno de los recursos. Sólo

(19)

una tarea puede ser procesada a la vez por máquina. Los siguientes conceptos están directamente relacionados con una tarea j :

Tiempo de procesamiento (pjm)- Es el tiempo que tarda en procesarse la tarea j en el recurso m. En el modelo de máquinas paralelas idénticas se tiene que Pjm = pj. En el modelo de máquinas paralelas diferentes cada máquina tiene una velocidad vm, por lo que

Pjm = Z-. (2.1)

vm

Tiempo de llegada (aj), Es el tiempo en que la tarea j arriva al sistema, por lo que se encuentra lista para ser procesada.

Disponibilidad de la máquina (am). Es el tiempo en que la máquina m se encuen- tra disponible en el sistema para poder procesar tareas. Si am = 0 estamos hablando del modeló de disponibilidad estática; en caso contrario se trata del modelo de disponibilidad dinámica.

Al igual que en el modelo de programación de tareas en una máquina, las tareas cuentan con los demás parámetros relacionados con una tarea, como por ejemplo la fecha límite dj y la ponderación Wj, entre otros.

2.6 Resumen

La programación de tareas es una actividad económicamente importante dentro de la industria de la producción y de servicios ya que permite tomar decisiones acerca del secuenciamiento, ruteo, reconfiguración de recursos y de actividades para poder maximizar las salidas optimizando el uso de los recursos. El modelo de programación de tareas en una máquina consiste de un único recurso en donde una cantidad finita de tareas esperan su turno para ser procesadas. Distintas condiciones iniciales pueden ser tomadas en cuenta para simplificar el modelo de acuerdo a las características del ambiente, los procesos y los objetivos a minimizar. Existen diferentes objetivos de la producción que pueden ser optimizados, entre los que destacan la tardanza ponderada y la penalización por entregas prematuras y entregas tardías, que son los objetivos considerados en la investigación de esta tesis. El modelo de máquinas paralelas consiste de un número finito de tareas n esperando ser procesados por una cantidad M de recursos paralelos. Cada tarea j hace fila para esperar ser procesada por alguno de los recursos, por lo que se debe tomar decisiones acerca del ruteo de las tareas. Solamente una tarea puede ser procesada a la vez por máquina. Existen dos modelos importantes de máquinas paralelas: idénticas, cuando una tarea puede ser procesada durante el mismo lapso de tiempo en cualquiera de las máquinas, y diferentes, cuando el tiempo de

(20)

procesamiento de una tarea varía dependiendo de la máquina que la esté procesando.

El modelo general de máquinas paralelas considera ambos casos anteriores. En el siguiente capítulo se introducirá el concepto de dinámica del cuello de botella, una heurística capaz de resolver eficientemente algunos de estos modelos.

(21)

Capítulo 3

Dinámica del cuello de botella

La dinámica del cuello de botella (DCB) es una heurística que se deriva de los métodos de cuello de botella para resolver problemas de programación de tareas. En estos métodos se asigna una prioridad mayor al recurso más crítico (el más cargado en algún sentido) para ser programado primero. La mecánica es de la siguiente manera. Primero se tienen que calcular prioridades para todos los trabajos en t = 0. Después se programa el trabajo con la más alta prioridad de acuerdo a algún objetivo. Una vez programada la tarea, se recalculan las prioridades de los trabajos restantes en t = t+pj, donde pj es el tiempo de procesamiento del último trabajo programado, continuando con el mismo ciclo hasta que no queden trabajos.

Básicamente, la dinámica del cuello de botella estima un costo de retraso aproxi- mado para cada actividad, estimando el correspondiente retraso de entrega del trabajo final del cual es parte. La dinámica del cuello de botella también estima un costo de retraso aproximado por retrasar cualquier recurso agregando los costos de retraso para todas las actividades esperando por el recurso. Comparando los costos de retraso de un recurso contra los costos de retraso de cada actividad, permite que la actividad con mayor ahorro por unidad de costo del recurso sea programada primero.

3.1 Definición

Morton y Pentico (1994) presentan una definición formal de la dinámica del cuello de botella:

• Sea R(t) el precio por unidad de tiempo de usar el recurso en el tiempo t.

• Sea / la tasa de interés derivada del costo del capital de la firma.

• Por lo tanto IR(t) es el costo por unidad de tiempo en el cual el recurso se usa una unidad de tiempo antes o después.

• El tiempo de completamiento de la actividad j es solamente la influencia que j tiene sobre una función objetivo.

(22)

• La importancia Wj del trabajo j está dada por Wj = DjVj, donde Dj es el valor agregado; y Vj es la importancia del cliente.

• El slack está dado por Sj(t) = dj — pj — t, donde dj es la fecha límite de entrega del trabajo j y pj es el tiempo de procesamiento de j .

• Sea Uj(t) = fj(Sj(t)) el tiempo de urgencia de la actividad si el trabajo se pro- grama primero y espera completar su procesamiento en un tiempo Sj. Esto es, fj es el costo marginal de decrementar el tiempo Sj en la función objetivo con tiempo de completamiento t + Pj.

• El precio de retraso del trabajo j está dado por WjUj(t).

3.2 Aplicando DCB al problema estático de secuen- ciamiento de tareas

Aplicando la dinámica del cuello de botella al problema estático de secuenciamiento de tareas en una sola máquina se puede estimar la prioridad del trabajo j para ser programada primero. Se tiene que el recurso tiene un precio R y el trabajo j tiene una importancia Wj. Si decidimos procesarlo en un tiempo 5 antes o después, entonces_el_

ahorro o el costo para j es

SwjUj, (3.1)

pero el recurso es también usado un tiempo 8 antes o después, resultando en un costo

SIRpj (3.2)

por el uso del recurso. De esta manera, las ganancias de procesar un trabajo antes serían

(3.3) Dado que sólo hay un recurso, el trabajo con la prioridad más alta debería ser aquel con la más alta ganancia por unidad del costo del producto. La prioridad 11, del trabajo j está dada por

- 1 (3.4)

Tomando en cuenta que 5, /, y R son los mismos para todos los trabajos, las prioridades pueden ser estimadas por

11

(23)

n, = ^ , 0.5)

donde Wj es la importancia del trabajo, pj es el tiempo de procesamiento y [/,• es elPj

factor de urgencia en el tiempo actual.

3.3 Minimizando la tardanza ponderada

En este criterio de optimización se penalizan los trabajos tardíos; es decir, los trabajos que se exceden de su fecha límite. La tardanza ponderada se define como:

_ >&, (3.6)

donde

T _ í 0, si Cj - dj < 0;

3 \ Cj — dj, en caso contrario.

Cj es la fecha o tiempo en que se completa la tarea j . Si j se programa primero en el tiempo í, su slack estará dado por

Si = dj - Pj - t. (3.7)

Intuitivamente podemos decir que un trabajo cuyo slack sea negativo (que ya pasó su fecha límite) tendrá una mayor prioridad por ser un trabajo tardío. Esta heurística quedaría así:

í Wj/pj, para trabajos tardíos;

l i o = <(^ 0, en caso contrario.

Sin embargo, esta heurística puede ser corregida de dos maneras para hacerla más precisa. En la primera heurística la prioridad está dada en forma lineal por:

n,= S

(3.8)

donde pav es el tiempo promedio de procesamiento para los trabajos actualmente com- pitiendo. La notación -I- indica que si la expresión es negativa se sustituye por cero, es decir,

, f x, si x > 0; .

x = i n + 3-9

10, en caso contrario. v '

(24)

Prioridad J

-S Figura 3.1: Heurística para

Prioridad j

-Pav -S

Figura 3.2: Heurística lineal. Tardanza ponderada.

13

(25)

Prioridad J

0 -s

Figura 3.3: Heurística exponencial R&M. Tardanza ponderada.

El comportamiento de la heurística se puede observar en la figura 3.2. En la segunda heurística, conocida como R&M, la prioridad está dada en forma exponencial por

exp (3.10)

donde k es un parámetro que puede estar entre 1.0 y 3.0. Morton y Pentico (1994) reportan que esta heurística ha sido probada exhaustivamente arrojando muy buenos resultados para este tipo de problemas. En la figura 3.3 se puede observar su compor- tamiento.

A continuación se presenta un ejemplo de la mecánica de DCB para minimizar la tardanza ponderada utilizando la heurística exponencial R&M. Considere el conjunto de tareas dadas en la tabla 3.1.

Tabla 3.1: Datos del ejemplo.

31 23 45 6

Pj8 46 62 8

11 12 22

10dj

2016 1212 25

(26)

DCB primero calcula las prioridades de todas las tareas en el tiempo t = 0 y el tiempo de procesamiento promedio de las mismas (en este caso pav = 5.666). El parámetro k se fija arbitrariamente, en este ejemplo se tomó k = 2. Los cálculos se basan en la ecuación 3.10 y se muestran en la tabla 3.2. Se puede observar que la tarea 4 obtuvo la mayor prioridad por lo que resulta ser la primera en ser secuenciada.

Tabla 3.2: Ciclo 1.

- 3

2 34 5 6

V]8 64 2 6 8

11 1 2 2 2

10di 16 2012 12 25

102 1610 6 17

0.1047nj 0.0685 0.0607 0.413 0.1958 0.0557

Una vez secuenciada la primer tarea (j = 4), se elimina del conjunto de tareas y se recalculan las prioridades para los trabajos restantes. Se actualizan t (t + p4 = 2) y el tiempo de procesamiento promedio (pav = 6.4). En esta ocasión, la tarea 5 fue la de mayor prioridad, por lo que es la siguiente en ser secuenciada (ver tabla 3.3).

Tabla 3.3: Ciclo 2.

31 2 35 6

Pj8 64 6 8

11

i—i

22 10

4

16 2012 25

08 144 15

TIj 0.125 0.0888 0.0837 0.2436 0.0774

Se repite el procedimiento ahora eliminando la tarea 5 y recalculando las priori- dades de las cuatro tareas restantes. Se tiene que t = 8 (t+ps) y pav = 6.5. La siguiente actividad en ser procesada será la tarea 2 con una prioridad n2 — 0.1423.

15

(27)

Tabla 3.4: Ciclo 3.

31 23 6

Pi8 64 8

11 12

10di 1620 25

02 89

0.0 0.0.

.125rij 14231351 1251

Ahora sólo restan tres tareas. Se repite el proceso con t = t + p2 = 14, A; = 2 y pav = 6.666. En la tabla 3.5 se muestran los resultados obtenidos. En esta ocasión la tarea 3 alcanzó la mayor prioridad.

Tabla 3.5: Ciclo 4.

j1 36

Vi8 48

wi

11 2

<¿j

1020 25

02 3

0.0 0.

.125

21511996

En el último ciclo se tiene que t = 18 y pav = 8. La tarea 6 consiguió una prioridad mayor que la tarea 1 (ver tabla 3.6). De esta manera, la secuencia final está dada por las tareas 4, 5, 2, 3, 6 y 1.

Tabla 3.6: Ciclo 5.

j d¡ IIj

1 8 1 10 0 0.125 6 8 2 25 0 0.25

3.4 Minimizando la penalización por entregas pre- maturas y por entregas tardías

En este criterio de optimización se penalizan tanto las entregas de trabajos prematuros como las entregas de trabajos tardíos. Este objetivo se define como:

(3.11)

(28)

donde

o,

o,

dj,

Cj, si ( en

si ien

Cj - dj < 0;

caso contrario.

dj - Cj < 0;

caso contrario.

Tj = \ "' MW - « i ^ « . _ ( 3.1 2 )

(3.13) Se tiene que wtj es la penalización por entrega prematura de la tarea j , wtj es la penalización por entrega tardía, la fecha límite de entrega es dj y Cj es la fecha o tiempo en que se completa. Si la tarea j se programa primero en el tiempo t, su slack estará dado por

Sj = dj-pj-t. (3.14)

Intituivamente podemos decir que una tarea con un slack negativo (que se pasó de su fecha límite) o un slack positivo (falta tiempo para la fecha límite) tendrá una prioridad de acuerdo a su penalización por esa desviación. Esta heurística quedaría así:

n 3

(3.15) wtj/pj, para trabajos tardíos;

-wej/pj, para trabajos prematuros.

Esta heurística puede ser mejorada. Ow y Morton (1989) proponen una variante lineal de esta heurística (LINET), en donde la prioridad para los trabajos prematuros es de

—wej/pj] la prioridad para los trabajos tardíos es de wej/pj y crece linealmente de una prioridad negativa a una positiva:

wtj — min I u> , —— LO

Pj (3.16)

donde pav es el tiempo de procesamiento promedio de las tareas restantes, k es un parámetro que predice el cambio en prioridades de las tareas y w es igual a la suma entre wtj y wej. Así, el trabajo con la más alta prioridad se programa primero. Si se desea insertar tiempos muertos en el proceso se puede utilizar el mismo procedimiento, con la diferencia de que si las prioridades son negativas no se programa ningún trabajo.

Ow y Morton (1989) también proponen otra variante llamada EXPET en donde la prioridad negativa crece exponencialmente a una prioridad positiva.

17

(29)

Prioridad i

wt/p,

Figura 3.4: Heurística para £Twt-

Prioridad 3

Figura 3.5: Heurística LINET.

(30)

3.5 Dinámica del cuello de botella para múltiples máquinas

La dinámica del cuello de botella para múltiples máquinas es una extensión de DCB para una máquina descrita en la sección 3.1. Morton y Pentico (1994) presentan dicha generalización:

• Sea Rm(t) el precio por unidad de tiempo de usar el recurso m en el tiempo t.

• Sea / la tasa de interés derivada del costo del capital de la firma.

• Por lo tanto, / / ^ ( í ) es el costo por unidad de tiempo en que el recurso m se usa en una unidad de tiempo antes o después.

• Sea jm la actividad de interés siendo procesada en la máquina m.

• El tiempo de completamiento de la actividad jm es la influencia que la tarea j tiene sobre la función objetivo.

• La importancia Wj del trabajo j está dada por Wj — DjVj, donde Dj es el valor agregado y Vj es la importancia del cliente.

• El slack está dado por Sjm(t) = dj —Pjm — t, donde dj es la fecha límite de entrega del trabajo j y pjm es el tiempo de procesamiento de j en la máquina va.

• Sea Ujm(t) = fj(Sjm(t)) el tiempo de urgencia de la actividad jm que espera completar su procesamiento en un tiempo Sjm. Esto es, fj es el costo marginal de decrementar el tiempo Sjm en la función objetivo dada.

• El precio de retraso del trabajo jm está dado por WjUjm(t).

3.5.1 Secuenciamiento en múltiples máquinas con DCB

Aplicando la dinámica del cuello de botella al problema estático de secuenciamiento de tareas en múltiples máquinas, es posible estimar la prioridad de la tarea j para ser programada primero:

Se tiene que un recurso m tiene un precio Rm y una tarea j tiene una importancia Wj. El precio del recurso Rm puede ser estimado como

Y,WJUJrn(t), (3.17)

N

donde N es el número de tareas esperando por el recurso. Si decidimos procesar una tarea en un tiempo 6 antes o después, entonces el ahorro o el costo para j es

19

(31)

SWjUjm, (3.18) pero el recurso es también usado un tiempo 8 antes o después, resultando en un costo estimado por ponderar las operaciones restantes jm en el recurso m

SIRnPjm (3-19)

por el uso del recurso. De esta manera, las ganancias de procesar un trabajo antes serían

ÓWjUjm - SIRmPjm. (3.20)

Dado que hay varios recursos, el trabajo con la prioridad más alta debería ser aquel con la más alta ganancia por unidad de costo del producto por máquina. La prioridad Tljm del trabajo j está dada por

m = 5 - 1 (3.21)

Tomando en cuenta que Sel son los mismos para todos los trabajos, las prioridades pueden ser estimadas por

= ^ ^ n _ ( 3 2 2 )

¿WnPjm

donde Wj es la importancia del trabajo, Pjm es el tiempo de procesamiento de la tarea j en la máquina m, Rm es el precio del recurso en ese tiempo y Ujm es el factor de urgencia en el tiempo actual.

3.5.2 Minimizando la tardanza ponderada

Al generalizar la heurística exponencial R&M (ec. 3.10) para máquinas paralelas, se tiene ahora que la prioridad de una tarea se afecta por el número de máquinas M.

Así mismo, el slack debe ser una estimación del tiempo restante de la fecha prometida de entrega de la tarea j utilizando su tiempo de procesamiento en la máquina m.

Pj/M exp (3.23)

donde M es el número de máquinas efectivas.

(32)

3.5.3 La heurística de despacho

Ahora sólo hace falta una heurística de despacho que sea capaz de repartir tareas en diferentes máquinas de acuerdo a su disponibilidad. A continuación se muestra una heurística para el modelo general de máquinas paralelas considerando llegadas dinámicas de las tareas.

1. Esperar hasta que una máquina m esté disponible.

2. Calcular las prioridades de las tareas como si se procesaran en m.

3. Asignar la tarea j con la más alta prioridad a la máquina m.

4. Si quedan tareas pendientes regresar a 1.

3.6 Resumen

La dinámica del cuello de botella es una aproximación a los métodos de cuello de botella para resolver problemas de programación de tareas. Esta heurística estima costos de retraso aproximados para cada actividad y cada recurso para calcular las prioridades de las diferentes actividades y así programar primero la de mayor importancia. Si bien DCB puede ser utilizada en diferentes problemas de programación de tareas, en este capítulo solamente se presentó su aplicación en el problema de secuenciamiento de tareas en una y múltiples máquinas para minimizar la tardanza ponderada y la penalización por entregas prematuras y entregas tardías, que son los objetivos a los que se enfocará esta tesis. En el siguiente capítulo se dará una breve introducción a los algoritmos genéticos, que junto con dinámica del cuello de botella, conforma la base del algoritmo propuesto en esta investigación.

21

(33)

Capítulo 4

Algoritmos genéticos

Los algoritmos genéticos (AGs) han demostrado ser una herramienta muy poderosa para solucionar problemas de optimización simulando el proceso natural de la evolu- ción. Son capaces de encontrar buenas soluciones en cada generación de una población, cruzándose entre sí y reproduciéndose para encontrar individuos mejor adaptados.

Clásicamente los AGs han sido utilizados en la programación de tareas para encon- trar una secuencia óptima de los trabajos de acuerdo a uno o más objetivos de la producción. En este capítulo se dará una breve introducción a los algoritmos genéticos y a las diferentes maneras en que se puede codificar el problema de programación de tareas.

4.1 AGs: un panorama general

Los algoritmos genéticos (Goldberg, 1989) son métodos de búsqueda estocástica que están inspirados en la genética y en la teoría de la evolución natural de las especies.

Los AGs inician la búsqueda a través de una población aleatoria. Cada individuo de la población (cromosoma) representa una posible solución a un problema codificado por un alfabeto que usualmente es binario, aunque no necesariamente. Los individuos de la población evolucionan conforme pasa el tiempo (generaciones) a través de iteraciones.

En cada generación los individuos se evalúan de acuerdo a una función objetivo para conocer cuál es su aptitud. Mediante un mecanismo que trata de imitar el mecanismo de selección natural, se eligen a los individuos más aptos para que se reproduzcan, asignando un número de descendientes de acuerdo a su aptitud. La siguiente generación estará formada de los hijos de estos individuos superiores, los cuales son formados con el operador de cruce, en un intento para imitar este operador genético. Un cromosoma también tiene una probabilidad muy pequeña de ser modificado mediante el operador de mutación. Después de varias generaciones o de algún otro criterio de terminación, el AG encontrará un individuo más apto que en numerosas ocasiones representa una solución cercana al óptimo (o el óptimo mismo) del problema.

El algoritmo genético simple funciona de la siguiente manera:

(34)

1. Generar una población inicial P(0) aleatoriamente. Inicializar t«— 0.

2. Evaluar cada individuo de P(t).

3. Seleccionar y reproducir un conjunto de individuos prometedores I(t) de P(t).

4. Cruzar a los individuos I(t) por parejas.

5. Mutar a los hijos resultantes en I(t).

6. Crear una nueva población P(t + 1) reemplazando a la población P(t) por I(t).

t 4 - í + l .

7. Si no se cumple el criterio de terminación ir a 2.

El objetivo de la selección (paso 3) es escoger al conjunto de mejores individuos de acuerdo a una función objetivo para asignar un número de copias relacionado con su evaluación. La presión selectiva es crítica en la operación de un algoritmo genético, puesto que por un extremo el AG puede terminar prematuramente su búsqueda, mien- tras que por el otro, la búsqueda puede resultar demasiado lenta. Existen diferentes mecanismos de selección que han sido desarrollados, como la rueda de ruleta, el ranqueo y la selección por torneo. El objetivo del cruce (paso 4) es combinar las características de los individuos escogidos para generar a los hijos que conformen la nueva generación.

La manera más sencilla de realizar el cruce es mediante el cruce de un punto, en donde el punto de cruce entre un par de individuos se escoge aleatoriamente para que un hijo combine el segmento derecho del punto de cruce del primer padre con el segmento izquierdo del segundo. Por lo general, se recomienda una alta probabilidad de cruce para permitir una mayor exploración del espacio de soluciones y reducir las posibili- dades de quedar atrapado en un óptimo local. Además, existen otros tipos de cruce que pueden ser aplicados dependiendo de la estructura del problema como lo son el cruce de dos puntos y el cruce uniforme. La mutación (paso 5) consiste en cambiar el valor de un bit aleatoriamente. Al igual que en la naturaleza, esta probabilidad debe ser muy pequeña y su principal función es mantener la diversidad de la población así como evitar la convergencia de la población en óptimos locales. El AG termina la búsqueda (corrida) cuando un criterio de terminación (paso 7) ha sido alcanzado. Existen dife- rentes criterios utilizados en la literatura como el número de generaciones, el número de evaluaciones de la función objetivo y la convergencia de la población.

Los algoritmos genéticos difieren de los métodos de optimización clásicos y de otros procedimientos de búsqueda en varios aspectos. Goldberg (1989) sumariza las principales diferencias:

• Los AGs trabajan con un conjunto codificado de soluciones, no con las soluciones

en sí mismas.

23

(35)

( soluciones J

nueva generación

Icación

• •

— ^ ~

cromosomas 1100101010 101 non 10 0011011001 1100110001

cruce 110010 1010 101110 1110

}

110010 1110 1011101010

selección

rueda de ruleta

mutación 00110 1 1001

00110 0 1001

evaluación hijos 1100101110 1011101010 0011001001

Wdecodificar

^ - - ^

C soluciones )

evaluación

^ aptitud

Figura 4.1: Esquema del algoritmo genético simple.

(36)

• Los AGs buscan de una población de soluciones, no de una simple solución.

• Los AGs utilizan una función objetivo, no derivadas o algún otro conocimiento adicional.

• Los AGs usan reglas probabilísticas, no determinísticas.

Otra de las características básicas de los algoritmos genéticos es que trabajan sobre el espacio de soluciones codificadas y en el espacio de soluciones reales alternati- vamente: los operadores genéticos trabajan sobre el espacio de soluciones codificadas en los cromosomas mientras que la selección y la evaluación trabajan sobre el espacio de soluciones reales. La selección es el operador que liga la relación entre los cromosomas y el desempeño de las soluciones decodificadas.

4.2 Codificación para programación de tareas en una máquina

La representación de un problema en el cromosoma es probablemente la parte más crítica en el desempeño de un AG, ya que para cualquier aplicación es necesario asegurar que todo el espacio de soluciones sea correctamente expresado y manipulado por los operadores genéticos. Además, una buena codificación entre las diferentes variables del problema y su interrelación entre ellas permitirá al AG encontrar mejores soluciones.

Por razones de eficiencia, es preferible trabajar con alfabetos binarios (Goldberg, 1989).

Sin embargo, existen algunos casos como el del problema de optimización combinatoria en donde una codificación binaria no resulta tan fácil de realizar, por lo que en los últimos 14 años han surgido técnicas de codificación no binaria que utilizan operadores especiales de cruce que permiten la legalidad de la representación de permutaciones.

Algunos de ellos son los operadores PMX (Goldberg y Lingle, 1985; Oliver et al., 1987), CX (Oliver et al., 1987) y ERX (Whitley et al., 1989). No obstante que estos operadores son eficientes en problemas de permutaciones puras, tienen muchas limitaciones para poder representar restricciones más complejas en la programación de tareas, como el de aumentar el número de máquinas e incluir tiempos muertos insertados en las mismas (Bautista, 1991; Bautista y Valenzuela, 1992). Existe un método para codificar pro- blemas de ordenamiento con un alfabeto binario el cual resulta relativamente fácil de extender al problema de la programación de tareas con las restricciones mencionadas anteriormente (Ordóñez, 1991; Ordóñez y Valenzuela, 1992); sin embargo, el tamaño del cromosoma puede crecer en forma logarítmica de acuerdo al número de tareas, al número de máquinas y a los tiempos muertos insertados, por lo que para problemas grandes (mayores a 50 tareas) puede resultar en un costo computacional excesivamente

alto para que el AG pueda converger a buenos resultados.

25

(37)

4.3 Herencia en algoritmos genéticos

Existen algunos problemas de optimización en donde el costo computacional para calcular la evaluación de un individuo es demasiado alto, por lo que evaluar a una población entera puede resultar bastante questionable e incluso prohibitivo. El primer acercamiento para resolver este tipo de problemas fue propuesto en (Grefenstette y Fitzpatrick, 1985), donde se realiza una evaluación aproximada de cada individuo para optimizar el problema de substracción digital de angiografía para poder ahorrar tiem- po máquina de ejecución. En este trabajo se muestra que un algoritmo genético puede alcanzar buenos resultados si se realiza una evaluación aproximada de cada individuo aumentando a la vez el número de generaciones.

Existe otro enfoque en donde también se pretende disminuir el costo computacional en evaluaciones complejas de individuos conocido como herencia (Smith et al., 1995).

En analogía con la herencia genética, en donde los padres pasan algo de material genético a los hijos, la herencia en un algoritmo genético pasa algo de aptitud de los padres a los hijos. Con este mecanismo, solamente una parte de la población se evalúa mientras que el resto obtiene su aptitud por medio de la herencia de los padres.

Smith, Dike y Stegmann mencionan dos tipos de herencia: herencia promediada, en la cual un individuo hereda la aptitud promedio de los padres; y la herencia proporcional, en la cual un individuo hereda una aptitud ponderada de acuerdo a que proporción del material genético hereda de cada uno de los padres. En sus resultados muestran que es posible llegar a resultados óptimos evaluando tan sólo al 10% de la población en problemas fáciles como el OneMax, en donde la aptitud de un individuo corresponde al número de unos que contiene en el cromosoma.

4.4 Resumen

Los algoritmos genéticos son métodos de búsqueda estocástica que están inspirados en la genética y en la teoría de la evolución natural de las especies. Los AGs evolucionan una población de individuos mediante los operadores genéticos de cruce, mutación y selección para encontrar un individuo más apto, el cual representa la solución a un problema. La codificación del problema en el cromosoma es probablemente la parte más crítica en el desempeño de un AG, ya que para cualquier aplicación es necesario asegurar que todo el espacio de soluciones sea correctamente expresado y manipulado por los operadores genéticos. Esta afirmación es particularmente cierta para el caso de los problemas de optimización combinatoria, del cual forma parte la programación de tareas. Esto ha llevado a la necesidad de desarrollar algunos operadores especiales de cruce para que el cromosoma pueda representar correctamente las secuencias de tareas. En el siguiente capítulo se presenta un nuevo enfoque en el uso de los AGs para resolver problemas de programación de tareas. La idea básica consiste en aprovechar el

(38)

buen desempeño de alguna heurística para encontrar una secuencia eficiente de tareas mientras que el AG sólo hace refinamientos a la búsqueda mediante la modificación de algún parámetro de las mismas. A diferencia del enfoque anterior, ahora el cromosoma no representa directamente una secuencia de tareas, sino que representa un parámetro de las mismas.

27

(39)

Capítulo 5

Optimizando el secuenciamiento de tareas mediante un algoritmo genético con dinámica del cuello de botella

En este capítulo se introduce un algoritmo genético híbrido para resolver el problema de la programación de tareas en una y múltiples máquinas, en donde el algoritmo genético trabaja en conjunto con una heurística, la dinámica del cuello de botella, para encontrar mejores soluciones. Para el problema del secuenciamiento de tareas en una máquina, se estudian los objetivos para minimizar la tardanza ponderada {weighted tardiness) y la penalización por entregas prematuras y entregas tardías {weighted earliness plus weighted tardiness) desde un punto de vista dinámico, en donde los trabajos pueden llegar en diferentes tiempos del proceso. Primero se realizan experimentos utilizando problemas pequeños (de 15 y 20 tareas) para tener una idea del desempeño del algoritmo propuesto para después realizar una investigación exhaustiva en problemas de tamaño considerable (de 50 y 100 tareas). Así mismo, se presentan los resultados alcanzados en cada experimento y se da una serie de recomendaciones que permite mejorar su desempeño. Se concluye la investigación resolviendo el problema con dos máquinas paralelas para minimizar la tardanza ponderada. Al final se discuten los resultados obtenidos.

5.1 AGs: un nuevo enfoque para la programación de tareas

La idea principal consiste en aprovechar el buen desempeño de alguna heurística para encontrar una secuencia eficiente de tareas mientras que el AG sólo hace refinamientos a la búsqueda mediante la modificación de algún parámetro de las mismas. Ejemplo:

Se desea encontrar una secuencia de tareas que minimice la tardanza ponderada (7^t)- Utilizaremos la heurística WSPT (weighted shortest processing time) que consiste en encontrar una secuencia de acuerdo a la relación

(40)

> w2/p2 > w3/p3 > • • > wn/ pn. (5.1) Dada una lista de tareas la heurística encontrará una única secuencia de tareas con Twt = x. En nuestro AG, cada individuo en la población representa un conjunto de 5w, tantos como el número total de tareas. De esta manera, se pueden hacer modificaciones a los pesos originales de las tareas obteniendo un peso ajustado

w'j = Wj + SWJ. (5.2)

Estos pesos se usan para encontrar una secuencia WSPT, por lo que el número total de secuencias WSPT generadas por el AG está dado por m x n donde m es la población del AG, y n es el número máximo de generaciones. Así, la probabilidad de que el mejor individuo encontrado por el AG sea mejor que la secuencia encontrada por la heurística es mucho mayor.

5.2 Combinando algoritmos genéticos con DCB

Combinando las características de búsqueda ciega de los AGs con la idea intuitiva del despacho del recurso más crítico de la heurística DCB, es posible encontrar secuen- cias más eficientes que las encontradas solamente utilizando DCB. Por otro lado, la capacidad de la dinámica del cuello de botella para resolver problemas con diferentes restricciones permite al AG resolver múltiples tipos de problemas sin ni siquiera cam- biar la representación del cromosoma. La idea central es combinar lo mejor de ambos mundos para solucionar el problema de programación de tareas encontrando mejores soluciones. Ahora, a diferencia del ejemplo de la sección anterior, el AG modifica- rá algún parámetro de las tareas (tal como el peso o el tiempo de procesamiento) para que la heurística DCB encuentre la secuencia de acuerdo a esos nuevos datos. Bajo este enfoque, el tamaño del cromosoma crece linealmente con respecto al número de tareas, no importando otras restricciones tales como el número de máquinas y los tiem- pos muertos insertados, por lo que el costo computacional resulta mucho menor que utilizando una representación binaria de la secuencia de tareas.

5.2.1 Codificación del cromosoma

Cada cromosoma se divide en subconj untos de bits en una cantidad igual al número total de tareas del problema en cuestión. Cada subconjunto representa un valor decimal (previa codificación binaria a decimal) que se mapea linealmente a un valor real de la siguiente manera:

29

(41)

T/ T/ / Knax V'min V^real = ^entero 2 ' - l

en donde VTea\ es el valor real, Kntero es el valor decimal codificado, Kiax es el valor real máximo, Vmin es el valor real mínimo, y I es la cantidad de bits codificados.

5.3 El algoritmo genético híbrido

El algoritmo genético híbrido incorpora la dinámica del cuello de botella en el proceso de evaluación de los individuos, en donde el AG evalúa las secuencias dadas por esta heurística. En este algoritmo, la población inicial se genera aleatoriamente. El método de selección utilizado es la selección por torneo. No se necesita algún operador especial de cruce, por lo que el cruce de un punto puede ser utilizado. Los nuevos individuos generados reemplazan a la generación anterior. El pseudocódigo es el siguiente:

1. Generar una población inicial P(0) aleatoriamente. Inicializar t <- 0.

2. Evaluar cada individuo de P(t):

(a) Decodificar los parámetros de las tareas (SWJ) en el cromosoma.

(b) Obtener un parámetro ajustado (w'j) para cada tarea.

(c) Obtener una secuencia de tareas de acuerdo a DCB utilizando el conjunto de parámetros ajustados (w'j).

(d) Evaluar la secuencia dada utilizando el parámetro original (WJ) de cada tarea.

3. Seleccionar y reproducir un conjunto de individuos prometedores I(t) de P(t).

4. Cruzar a los individuos I(t) por parejas.

5. Mutar a los hijos resultantes en I(t).

6. Crear una nueva población P(t 4- 1) reemplazando a la población P(t) por I(t).

7. Si no se cumple el criterio de terminación regresar a 2.

(42)

5.4 Minimizando la tardanza ponderada

En esta sección se estudia el comportamiento del algoritmo genético híbrido para mi- nimizar la tardanza ponderada (7^t) en problemas de 15 y 20 tareas. La importancia de este objetivo se justifica cuando se desea reducir las entregas que exceden su fecha límite; es decir, cuando el cliente confía en la puntualidad de los servicios. Se considera un ambiente dinámico en donde las tareas pueden estar llegando en el transcurso de la operación del sistema. Tres diferentes AGs son probados. Dos de ellos utilizan dinámica del cuello de botella para generar las secuencias, mientras que el último utiliza WSPT.

Se emplea la heurística exponencial R&M (ec. 3.10) para obtener las prioridades de cada tarea.

5.4.1 Modelo del problema

Para este problema, se empleó el siguiente modelo. La máquina procesa las actividades serialmente una a la vez y ninguna de ellas puede ser interrumpida hasta que termine de procesarse. El tiempo de preparación de la máquina para las diferentes actividades es igual a cero. Cada actividad tiene un tiempo de procesamiento pj, una fecha límite de entrega dj, un tiempo de llegada Tj y una penalización por entrega tardía wtj. El objetivo a minimizar es la tardanza ponderada 7^t-

5.4.2 Experimentos

El experimento consistió en medir el desempeño de tres diferentes AGs. El primero (AGT1) modifica los pesos de las tareas y la secuencia se genera por DCB. El parámetro que se codifica en el cromosoma es 5w{. El peso ajustado está dado por:

w'j = Wj + SWJ. (5.4)

AGT2 modifica los tiempos de procesamiento de las tareas y la secuencia se genera por DCB. El parámetro que se codifica en el cromosoma es Sp^. El tiempo de procesamiento ajustado está dado por:

p'j = Pj + Spj. (5.5)

AGT3 modifica los pesos de las tareas y la secuencia se genera por WSPT. El parámetro que se codifica en el cromosoma es SWÍ. El peso ajustado está dado por:

w'j = Wj + 5WJ. (5.6)

Se realizaron pruebas con 2 problemas de 15 y 20 tareas, respectivamente. Cada al- goritmo genético utilizó selección de torneo y cruce de un punto. La heurística que se utilizó fue R&M con un valor k = 2. La población fue inicializada aleatoriamente.

31

(43)

Tabla 5.1: Datos del problema 1.

31 23 45 67 8

Pj1 21 25 53 3

di2 26 126 2012 20

Wj

11 22 11 33

rj

00 31 46 1011

39 1011 1213 1415

Pj4 43 32 21

30d, 3015 1525 2530

Wj

15 51 12 6

1510 179 2015 6

Tabla 5.2: Parámetros del AG para el problema 1.

Parámetros tamaño de población número de evaluaciones probabilidad de cruce probabilidad de mutación longitud de cromosoma tamaño del torneo bits por parámetro rango de 6w

AGT110 5000.9 0.0245 32 [0,6]

AGT210 5000.9 0.0245 32 [0,6]

AGT310 25000.9

0.0160 34 [-8,8]

Con todos los experimentos se hicieron 10 corridas obteniéndose el promedio del mejor individuo contra el número de evaluaciones, así como su desviación estándar.

Para el problema 1, en los tres AGs se tomaron poblaciones pequeñas (10 in- dividuos) con una probabilidad de cruce de 0.9. En el caso de AGT1 y AGT2, la probabilidad de mutación se fijó en 0.02 y el tamaño de los parámetros (8w) fue de 3 bits cada uno, con un rango de [0,6], lo que permite a la tarea con menor peso ser la de mayor peso (como se puede observar en la tabla 5.1, los valores máximos de pj y Wj son 5 y 6 respectivamente). En contraste, AGT3 necesita un mayor tamaño de parámetro (4 bits) con un rango de [—8,8] para poder lograr resultados aceptables. El resultado óptimo del problema 1 se obtuvo utilizando Branch and Bound, con un valor de Twt = 50. Empleando solamente DCB resulta en un valor Twt = 56. Los parámetros utilizados para cada uno de los AGs se muestran en la tabla 5.2.

Para el problema 2, en los tres AGs también se tomaron poblaciones pequeñas (10 individuos) pero se aumentó el número de generaciones por ser un problema un poco más grande. Ahora el tamaño por parámetro de AGT1 y AGT2 fue de 4 bits

Referencias

Outline

Documento similar