“diseÑo e implementaciÓn de algoritmos de...

96
“DISEÑO E IMPLEMENTACIÓN DE ALGORITMOS DE PROGRAMACIÓN DE TRABAJOS EN MÁQUINAS” PROYECTO FINAL DE CARRERA Realizado por: Antonio Luis Castro del Fresno Dirigido por: José Manuel García Sánchez INGENIERÍA DE ORGANIZACIÓN INDUSTRIAL ESCUELA DE INGENIEROS DE SEVILLA ABRIL 2013

Upload: ledat

Post on 28-Sep-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

 

 

 

“DISEÑO E IMPLEMENTACIÓN DE ALGORITMOS DE PROGRAMACIÓN DE TRABAJOS EN MÁQUINAS” 

PROYECTO FINAL DE CARRERA 

Realizado por:  Antonio Luis Castro del Fresno  Dirigido por: José Manuel García Sánchez  

INGENIERÍA DE ORGANIZACIÓN INDUSTRIAL 

ESCUELA DE INGENIEROS DE SEVILLA ABRIL 2013 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

2

"La realidad parece compleja. Sin embargo, en el fondo, funciona en base a reglas muy simples que pueden descubrirse a través de la investigación adecuada. Todo puede reducirse a sencillas relaciones de causa y efecto".  Eliyahu M. Goldratt   

Eliyahu M. Goldratt (31 de marzo 1947 ‐ 11 de junio 2011). Licenciado en Física de la Universidad de Tel Aviv, realizó su master y doctorado en la Universidad de Bar‐Ilan. Es el creador de la Teoría de Restricciones (TOC, del inglés Theory of Constraints) 

En 1982 fue presidente y mayor accionista de una compañía productora de un software de programación de la producción, catalogada en ese año por la revista Inc. Magazine como la sexta de mayor crecimiento en EE. UU. A pesar de estos resultados se sentía frustrado. Su frustración se debía a que a pesar de los muy buenos resultados que obtenían las empresas al implementar su software y al gran esfuerzo realizado para venderlo (presentaciones, pruebas piloto, seminarios, etc), conseguir más clientes era un proceso extremadamente lento. 

Viendo que con las presentaciones convencionales no se lograba romper la barrera del mercado, decidió hacer el intento con una manera no convencional y tuvo la idea de comunicar su método a través de una novela sobre producción. En ese momento comenzó a trabajar en "La meta", a pesar de que a nadie le gustaba la idea, ni siquiera al co‐autor Jeff Cox, quien rehusó a esperar al cobro en base a los royalties que generase la novela y exigió que se le pagaran en efectivo y por adelantado todos sus honorarios. 

Tras trece meses de trabajo terminó de escribir el libro y emprendió una tarea titánica para que alguna editorial se decidiera a publicarlo. Finalmente North River Press decide apoyarlo y hacen una primera edición de 3.000 copias, pensando que tendría mucha suerte si las vendía todas. A día de hoy se han vendido más de 4 millones de copias en todo el mundo.

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

3

ÍNDICE   1.‐ INTRODUCCIÓN.  2.‐ PROGRAMACIÓN DE TRABAJOS EN MÁQUINAS.    2.1.‐ INTRODUCCIÓN A LA SECUENCIACIÓN.    2.2.‐ RESEÑA SOBRE OPTIMIZACIÓN.      2.3.‐ PROBLEMAS DE PROGRAMACIÓN DE TRABAJOS EN MÁQUINAS.  3.‐ DISEÑO DE LA APLICACIÓN INFORMÁTICA.    3.1.‐ ENTORNO    3.2.‐ ESTRUCTURA DE LA APLICACIÓN.    3.3.‐ IMPLEMENTACIÓN DE LAS RUTINAS.       3.4.‐ FORMATO DE ARCHIVO DE ENTRADA DE DATOS.    3.5.‐ INSTALACIÓN.    3.6.‐ EJEMPLOS DE RESOLUCIÓN DE PROBLEMAS.    3.7.‐ AMPLIACIÓN DE LA COLECCIÓN DE PROBLEMAS.    3.8.‐ ELIMINAR LAS RESTRICCIONES EN EL NÚMERO DE MÁQUINAS Y/O                      TRABAJOS.  4.‐ CONCLUSIONES.  5.‐ BIBLIOGRAFÍA.  ANEXO I.‐ CD CON EL PROGRAMA           

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

4

1.‐ INTRODUCCIÓN.  El  presente  documento  ha  sido  elaborado  como  proyecto  final  de  carrera  de  los estudios conducentes al título de Ingeniería en Organización Industrial (en adelante IOI) tal y como marcan los planes de estudio vigentes.  El  objetivo  de  este  proyecto  es  el  de  proporcionar  una  herramienta  informática  de apoyo  a  los  alumnos  que  cursen  asignaturas  donde  se  planteen  problemas  de Programación  de  Trabajos  en Máquinas  (en  adelante  PTM),  como  es  el  caso  de  la asignatura Secuenciación de 2º curso de la Titulación de IOI.  Este  programa  implementa  los  algoritmos  de  resolución  de  diecinueve  de  los problemas más típicos de PTM y que se estudian a lo largo del curso.  La  idea  de  elaborar  este  programa  surge  cuando  el  autor  del  mismo  cursaba  la asignatura  “Secuenciación”  y  observa  que  no  existe  ningún  software  específico  que facilite  al  alumno  la  representación  gráfica  y  la  resolución  de  los  problemas  de  la asignatura,  obligándole  a  invertir  demasiado  tiempo  en  la  aplicación  manual  de algoritmos y en la posterior confección de los diagramas de Gantt con los resultados de cada problema y por tanto disponer de menos tiempo efectivo para dedicar al análisis y comprensión de los diferentes problemas.  El programa ha sido desarrollado sobre un fichero de hoja de cálculo Excel empleando los módulos de programación en  lenguaje Visual Basic para Aplicaciones (en adelante VBA) que tiene incorporada esta aplicación de Microsoft.  Además de los motivos que se expondrán más adelante, en la decisión de emplear VBA sobre Microsoft Excel pesó en buena medida  la necesidad del autor de aprender  las peculiaridades de este  lenguaje de programación para mejorar en el día a día de  su trabajo, puesto que Microsoft Excel es una herramienta fundamental. En este sentido se puede afirmar que la motivación ha sido doble.  El proyecto que se presenta a continuación se ha estructurado en cuatro apartados o capítulos:  En el primero de ellos se exponen los fundamentos teóricos de la Programación de Trabajos en Máquinas que constituyen la base de la aplicación.  En el segundo apartado se detalla en profundidad el software elaborado, mostrando cómo es su estructura, cuáles son sus características y funcionalidades así como sus limitaciones y posibilidades de ampliación en el futuro. Este capítulo finaliza con un ejemplo de resolución de cada uno de los problemas mediante la aplicación.  El tercer capítulo está reservado a las conclusiones y el cuarto a la bibliografía que ha servido de referencia y consulta al redactor de este proyecto.   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

5

2.‐ PROGRAMACIÓN DE TRABAJOS EN MÁQUINAS.    2.1.‐ INTRODUCCIÓN A LA SECUENCIACIÓN.  La  secuenciación  de  trabajos  en  máquinas,  es  conocida  universalmente  como scheduling y    se define como  la asignación en el  tiempo de  los  recursos disponibles  con objeto de optimizar una determinada medida de comportamiento.  A  partir  de  un  determinado  criterio  y  de  restricciones,  se  trata  de  establecer  la secuencia  para  el  procesamiento  de  una  serie  de  trabajos  sobre  un  conjunto  de máquinas.  Existe un amplio espectro de características que pueden asociarse a  los  trabajos y al modo de su procesamiento en el sistema.  Un problema queda determinado en base a tres factores:  

‐  La arquitectura del taller. ‐  Las características de los trabajos. ‐  El criterio de optimización.   

Atendiendo a la disposición de las máquinas dentro de un taller tenemos los siguientes tipos de arquitectura:  

a)  Máquinas en serie.  

  Los entornos de máquinas en serie se clasifican a su vez en función del modelo o esquema de paso de los trabajos por las diferentes máquinas. Así pues tendremos los siguientes esquemas  

 a.1) Sistemas de flujo uniforme (Flow shop): Donde el modelo de paso es el mismo para todos los trabajos, esto es, que todos los trabajos pasan por cada una de las máquinas del sistema usando el mismo orden de paso por las mismas.  

 esquema de un sistema flow shop 

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

6

a.2) Sistemas de tipo taller (Job shop): Cada trabajo tiene su propio esquema de paso por las máquinas.  

 esquema de un sistema job shop 

 a.3) Sistemas de taller abierto (Open shop): El modelo de paso de cada trabajo por las máquinas es libre, esto es, que además de que cada trabajo tenga su propio esquema de paso por las máquinas, este es abierto y no tiene que seguir un orden. Ejemplo: un trabajo debe pasar por las máquinas 1 y 2 pero daría igual si lo hace en un orden u otro.    b)  Máquinas en paralelo 

  Respecto a los sistemas en paralelo y atendiendo a las características de las máquinas se distinguen a su vez tres tipos:  

Máquinas idénticas: Puesto que se trata de máquinas iguales, el tiempo de proceso de una operación es el mismo en cada máquina.    Máquinas uniformes: Cada máquina posee una velocidad de proceso diferente, independiente de los trabajos.   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

7

Máquinas no relacionadas: Cada máquina posee una velocidad de proceso diferente sobre cada trabajo. Este caso sería el que más se asemeja a un sistema productivo real puesto que el tiempo de proceso dependerá tanto de la máquina empleada (tecnología, potencia,...) como de la naturaleza del trabajo a realizar.    c) Sistema Híbrido: Taller flexible  Se trata de un sistema mixto compuesto de m centros o estaciones de máquinas en serie, cada uno de ellos formados a su vez por un conjunto de máquinas en paralelo.  

 Representación  La representación clásica de la solución a un problema de secuenciación es el diagrama de Gantt. En este diagrama queda definida la asignación de trabajos en máquinas en cada uno de los instantes temporales.  

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

8

 Notación  La notación empleada para describir un problema de secuenciación se realiza 

mediante una tripleta de valores o campos  / / :  

  ‐ El campo  hace referencia al el entorno de las máquinas, tanto el número de       las mismas como su disposición (tipo de arquitectura del sistema).  

  ‐ El campo  se usa para describir las características y restricciones de   procesamiento de los trabajos.   

  ‐ El campo   define cuál es el objetivo del problema.  Con respecto a los valores típicos que pueden aparecer para describir el entorno de las 

máquinas (campo  ). Dado un conjunto  M = {M1, M2,.., Mj, ..., Mm}: que representa la totalidad de las m máquinas de un problema, se pueden dar los siguientes casos de 

parámetros de :    Fm: Sistema de flujo uniforme con m máquinas en serie.     Jm: Sistema de taller con m máquinas en serie.     Om: Sistema de taller abierto con m máquinas en serie.     Pm: m máquinas idénticas en paralelo.     Qm: m máquinas uniformes en paralelo.     Rm: m máquinas no relacionadas en paralelo.     Sm: Sistema de flujo uniforme con m centros de máquinas en paralelo.   Con respecto a los valores típicos que pueden aparecer para describir las 

características de los trabajos a procesar (campo  ). Dado un conjunto  J  = {J1, J2,.., Ji, .., Jn}: que representa los n trabajos que deben procesarse se tiene la siguiente información:  pij : Tiempo de proceso del trabajo Ji en la máquina Mj. (pi para el caso de una sola máquina)   ri : Instante de llegada de Ji al sistema. Cuando todos los trabajos están disponibles al comienzo del procesamiento, ri = 0.   di : Fecha de entrega del trabajo Ji.   wi : Peso(coste o valor) del trabajo Ji. 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

9

 VARIABLES   Igualmente se pueden definir una serie de variables en base a los diferentes instantes de estudio. Serían las siguientes:  Ci :  Es el tiempo en el que finaliza el trabajo Ji.   Cij   : Para problemas con más de una máquina, es el tiempo de finalización del trabajo Ji en Mj  

 Fi   : Tiempo de permanencia del trabajo en el sistema, medido como la diferencia entre el instante de finalización y el instante de llegada al sistema, esto es, Fi:  = Ci – ri  Li :  Representa la desviación entre la fecha de finalización de un trabajo y su fecha de entrega prevista. Responde por tanto a la fórmula Li  = Ci – di. Si Li < 0 indicaría un adelanto.   Ti : Representa la tardanza de un trabajo o lo que es lo mismo, la diferencia solo positiva entre la fecha de entrega de un trabajo y el instante de finalización. Responde a la fórmula Ti = máximo {0, Ci – di}  Ei : Representa el adelanto de un trabajo o lo que es lo mismo, la diferencia solo positiva entre el instante de finalización y la fecha de entrega de un trabajo. Responde a la fórmula Ei = máximo {0, di ‐ Ci}.  Para una mejor comprensión, se expone un diagrama de Gantt resumen con los instantes de estudio indicados en el apartado anterior.  

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

10

1 si

0 en otro caso

i iTi

C dX

1 si

0 en otro caso

i iEi

C dX

Adicionalmente a las variables del apartado anterior, se usan a menudo otras variables de tipo booleano para el control de los trabajos que se retrasan y adelantan:         De manera análoga, se pueden definir variables booleanas para el control de los trabajos finalizados sin retraso ni adelanto:          

Restricciones de procesamiento de los trabajos (  )   En la mayoría de ocasiones, los problemas presentan una serie de características y restricciones en el procesamiento de los trabajos como las que se destacan a continuación:   ‐ Preemption (prmt): Rotura de trabajos. Esta característica hace referencia a la posibilidad de abandonar el procesamiento de un trabajo en una máquina sin haber concluido la operación, regresando más tarde para finalizarla.  ‐  Restricciones de precedencia (pre): En algunos entornos aparecen relaciones de precedencia obligada entre pares de trabajos.  ‐  No‐wait (No‐Wait): Aparece en entornos de máquinas en serie en los que los trabajos deben ser procesados desde su inicio en la primera máquina, hasta su finalización en la última máquina, sin ninguna interrupción entre máquinas.   ‐ Blocking (Block): Esta característica aparece en sistemas de fabricación en serie en los que no están permitidos los buffers intermedios de un cierto tamaño entre máquinas, puesto que bloquean el funcionamiento de las mismas.          

1 si

0 en otro caso

i i

i

C dX

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

11

Objetivos (  )  Finalmente se estudiará el último campo, el correspondiente a los objetivos o criterios para la búsqueda de soluciones.  Estos objetivos pueden agruparse según tres grandes grupos:   1. Criterios basados en  tiempos de finalización de los trabajos:  

Ci : Minimizar la suma de los tiempos de finalización de los trabajos.   

wiCi : Minimizar el coste total asociado a la finalización de los trabajos. El peso wi se entiende como un coste de espera o un valor añadido al trabajo Ji.  Cmax = Max{C1,…,Cn}: Minimizar el tiempo de finalización de todos los trabajos, también llamado longitud de la programación (makespan).   2. Criterios basados en fechas de entregas:   

Li : Minimizar  la suma de retrasos o retraso total. Equivalente a minimizar el retraso 

medio. De forma análoga se estudian wiLi y Lmax.   

Ti : Minimizar  la tardanza total. De forma análoga se definen  wiTi y Tmax.   

(Ei + Ti): Minimizar la suma de las desviaciones de los instantes de finalización de los trabajos respecto a sus fechas de entrega di. Cuando se establecen penalizaciones ui para los adelantos y vi para los retrasos de cada trabajo, el objetivo viene a ser (uiEi + viTi).   

XTi : Minimizar el número de trabajos retrasados. También se estudia la minimización 

del coste de los trabajos retrasados, representado por wiXTi .  

 

(XTi + XEi) : Minimizar el número de trabajos adelantados y retrasados. Igual que 

anteriormente, también se plantea el criterio wi(XTi + X

Ei). Este objetivo es equivalente 

al de maximizar los trabajos terminados justo en su fecha de entrega (on time)  

(Max Xi o bien Max wiXi).    3. Criterios basados en costes de inventario y utilización de máquinas   

Ij : Minimizar el tiempo total en que están desocupadas las máquinas, siendo 

 Ij = Cmax ‐ pij , y pij la suma de los tiempos de procesado de todos los trabajos sobre la máquina Mj.   

vjIj : Minimizar el tiempo ponderado de desocupación de las máquinas, siendo vj un peso por unidad de operación.   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

12

  2.2.‐ RESEÑA SOBRE OPTIMIZACIÓN.  Un problema de gestión se presenta en entornos económicos (industriales y de servicios) en los que hay que gestionar una serie de recursos para realizar una determinada actividad, utilizando un criterio de tipo económico.   Los criterios van referidos a la minimización de los costes de la actividad, o a la maximización de beneficios.  También son llamados Problemas de Optimización, puesto que son problemas donde se intenta optimizar la utilización de ese conjunto de recursos.  El área de las matemáticas dedicada al estudio de los problemas de optimización  es la Investigación Operativa.   La Ingeniería de Organización estudia, entre múltiples disciplinas, el planteamiento y resolución de esta clase de problemas.  Optimizar significa poco más que mejorar; sin embargo, en el contexto científico la optimización es el proceso de tratar de encontrar la mejor solución posible para un determinado problema.   En un problema de optimización existen diferentes soluciones y un criterio para discriminar entre ellas con el objetivo de encontrar la mejor. De forma más precisa, estos problemas se pueden expresar en cómo encontrar el valor de unas variables para los que una determinada función objetivo alcanza su valor máximo o mínimo, sujetas a unas restricciones.   La resolución de un problema de optimización depende fundamentalmente del tipo de variables que forman parte del mismo y del carácter lineal o no lineal de las restricciones.    Un problema de optimización está formado por tres componentes principales:  

 Un conjunto de variables: Referidas a la actividad que se desarrolla en 

el sistema que se quiere optimizar. 

 Un conjunto de restricciones: Expresan la relación entre el consumo de 

recursos y las limitaciones de los mismos, así como toda clase de 

características que hay que imponer en el problema y que están 

asociadas a la actividad que se realiza en el sistema. 

 Una (o varias) función(es) objetivo(s): Criterio que se desea optimizar 

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

13

  Clasificación de problemas 

   Problemas Enteros  La programación entera estudia los problemas con variables enteras. Se denominan problemas de optimización combinatoria o simplemente Problemas Combinatorios.  La mayoría de los problemas industriales pertenecen a esta categoría. Los problemas continuos son siempre subproblemas de un problema superior entero.  Muchos de ellos se agrupan en categorías, siendo identificable su grado de complejidad según dicha categoría.  Ejemplos:   

• Problemas de flujo en redes: Problemas enteros que pueden resolverse 

como problemas continuos. 

•  Problemas de routing.  

•  Problemas de asignación. 

•  Problemas de secuenciación.  

Las principales características de los problemas enteros son las siguientes:  

• Poseen un número finito de soluciones. 

• El conjunto de soluciones no es convexo. 

•  La solución no tiene que estar en un vértice, ni contigua a un vértice de 

intersección de restricciones. 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

14

  Un ejemplo clásico de problema entero es el conocido como PROBLEMA DE LA MOCHILA:  Dada una mochila con un volumen V y un conjunto de n objetos, cada uno caracterizado por un volumen vi y un peso pi, se trata de maximizar el peso total de los objetos introducidos en la mochila.  

•  VARIABLES: Una variable por cada objeto, que señale si el objeto es o no 

introducido en la mochila, para una solución cualquiera. 

    

• RESTRICCIONES: 

El problema posee una única restricción: Que la suma de los volúmenes de los objetos que introduces en la mochila no supere el volumen V de la mochila.     

  

1 si el objeto i es introducido en la mochila1

0 si noix i n

1

n

i ii

v x V

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

15

  Para determinar la solución óptima, es necesario evaluar todas las soluciones posibles, sean o no admisibles. Para el ejemplo anterior, deberíamos evaluar 24 soluciones. Nótese por tanto que el número de soluciones a evaluar aumenta de forma exponencial al añadir un nuevo elemento al problema.  

   Sabiendo que un ordenador actual es capaz de evaluar 1 millón de soluciones/segundo, puede llegarse a la siguiente conclusión:  

n=20  Tiempo  1 segundo n=40  Tiempo  2 semanas 

n=60  Tiempo  365 siglos    Una vez llegado a este punto, hay que indicar que los problemas combinatorios pueden ser de dos tipos:  

-  Problemas para los que únicamente se conocen algoritmos de resolución 

exacta cuyo tiempo de cálculo crece exponencialmente con el tamaño del 

problema (el nº de elementos). Ejemplo: Problema de la mochila visto 

anteriormente. 

-  Problemas sobre los que sí existen algoritmos que resuelven de forma exacta 

el problema y sólo crecen polinomialmente con el tamaño del problema. 

Ejemplo: Problema de asignación de n entidades. 

 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

16

A partir de aquí se caracterizan los problemas en:  

•  Problemas  Clase P: Son los problemas para los que existe un algoritmo que 

en un número polinomial de pasos obtiene siempre el óptimo del problema. Se 

considera que son resolubles eficientemente. 

• Problemas  Clase NP: Son los problemas para los que no existe un algoritmo 

que en un número polinomial de pasos obtenga siempre el óptimo del 

problema. Aunque si es posible, dada una solución, comprobar en tiempo 

polinomial si su coste es mejor que un determinado valor. 

Son éstos los problemas más complejos para resolver. Los métodos exactos requieren un tiempo de computación tal y como se ha visto antes muy elevado cuando el tamaño del problema es considerable.   Dentro de NP se distinguen los problemas NP‐Completos. Son aquellos que tienen la peculiaridad de que todos los problemas en NP pueden ser reducidos polinomialmente a ellos. Es decir, que si se puede dar una solución en tiempo polinomial para uno de ellos, se podría dar para todos los de NP (y P=NP).   La mayoría de los problemas reales de gestión empresarial son de esta clase.  Resolución de problemas combinatorios  En Optimización, la pregunta de cómo resolver un problema de forma práctica ha ido experimentado grandes cambios debido al auge de las tecnologías y de la aparición continua de nuevas técnicas.   Desde la aparición de métodos como el Simplex en Programación lineal (años 50) son muchas las técnicas de resolución que han surgido para los problemas de programación matemática.  De igual modo han sido muchas las herramientas o aplicaciones para optimización que han ido apareciendo en el mercado.  En general, los métodos de resolución son de dos tipos:  

-  Métodos exactos: Devuelven la solución óptima (mejor) del problema. Se 

utilizan en problemas continuos (Método SIMPLEX), en problemas de clase P y 

para problemas de clase NP que no sean de gran tamaño.  

- Métodos aproximados (Heurísticas): Devuelven una buena solución no 

necesariamente óptima en un tiempo razonable. 

   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

17

Sobre los métodos exactos cabe destacar lo siguiente:  La enumeración o análisis completo de las soluciones no se considera admisible.  El objetivo de estos métodos es el de realizar una enumeración parcial de soluciones dentro de las cuales exista garantía de encontrar la solución óptima.  Dentro de estos métodos de enumeración parcial, los más conocidos son los siguientes:  

- Branch and bound (Método exacto más conocido). 

-  Branch and cut. 

-  Programación dinámica. 

-  Métodos basados en grafos . 

 De manera adicional a los métodos de enumeración parcial, existen también las Heurísticas. ¿qué son?  

Son Algoritmos que proporcionan soluciones factibles (admisibles), las cuales, aunque no optimicen la función objetivo, se supone que al menos se acercan al valor óptimo en un tiempo de cálculo razonable. Podríamos decir que proporcionan soluciones “satisfactorias”.  Suelen ser procedimientos simples, a menudo basados en el sentido común. Heurística proviene de heuriskein (palabra griega que significa encontrar), aunque lo que realmente hacen las heurísticas es buscar.  Factores que hacen interesante el uso de heurísticas:  

-  En casos en los que no existe un método exacto de resolución o éste 

requiere mucho tiempo de cálculo y memoria. 

-  Cuando no se necesita la solución óptima. 

-  Cuando los datos son pocos fiables. 

-  Cuando existan limitaciones de tiempo. 

-  Como paso intermedio en la aplicación de otro algoritmo 

      

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

18

¿Cuáles son las ventajas del uso de  heurísticas?  

- Suelen ser más fáciles de entender por parte de gente no experta que 

los complejos métodos que utilizan la mayoría de las técnicas exactas. 

-  Mayor flexibilidad para el manejo de las características del problema. 

-  No suelen ser complejas incluso para funciones no lineales. 

  ¿Cuáles son los inconvenientes del uso de heurísticas?   No aseguran optimalidad, esto es, que no es posible conocer la calidad de la solución, es decir, cómo de cerca están del valor óptimo. Para corregir esto se pueden usar varios mecanismos:   

*  Realizar acotaciones (relajación Lagrangeana; eliminar restricciones)   * Construir métodos sencillos que simplemente detecten que la heurística no es buena. Por ejemplo, generar soluciones aleatoriamente y ver si son similares a la proporcionada por la heurística.  

                      

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

19

*max

1

n

ii

C p

  2.3.‐ PROBLEMAS DE PROGRAMACIÓN DE TRABAJOS EN MÁQUINAS.  Se expone a continuación una colección de los problemas clásicos de PTM que se estudian a lo largo de la asignatura, así como sus peculiaridades y métodos de resolución:    2.3.1.‐ F1/ /Cmax.  Se trata de un problema de clase P, con una sola máquina y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan).  Cualquier asignación de trabajos que no deje huecos en la programación, esto es, que asegure que la máquina no esté ociosa entre trabajo y trabajo, sería una solución óptima admisible para este problema.   El valor óptimo de Cmáx puede calcularse mediante la siguiente fórmula:           2.3.2.‐ F1/ri/Cmax  Es un problema de clase P, con una sola máquina y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan).  Es una variante del problema anterior, añadiendo una restricción en el instante de llegada de los diferentes trabajos al sistema.   La solución óptima es también una variante de la de ese mismo problema, puesto que nuevamente se trata de asignar los trabajos de forma que no queden huecos innecesarios en la programación de la máquina.  Si se asignan los trabajos de menor a mayor instante de llegada el sistema, sin dejar huecos, se garantiza la solución óptima.           

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

20

  2.3.3.‐ F1/ /ΣCi   Es un problema de clase P, con una sola máquina y cuyo objetivo es minimizar la suma de los tiempos de finalización de los trabajos.  Partiendo del razonamiento de que la longitud de un trabajo introducido se sumará al valor de Ci de todos los trabajos siguientes en la secuencia, lo lógico por tanto sería ir asignando primero los trabajos de menor duración.  Matemáticamente la demostración sería la siguiente:  Sean dos secuencias S1 y S2 que únicamente varían en el orden de dos de sus trabajos  

  

  Por tanto la solución óptima para este problema se obtendría mediante la asignación de los trabajos por orden creciente de su tiempo de proceso o regla SPT (Shortest Process Time).              

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

21

  2.3.4.‐ F1/pre/Cmax  Es un problema de clase P, con una sola máquina y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan).  En este problema se introduce otro tipo de restricción en forma de relaciones de precedencia entre trabajos.  La solución óptima es nuevamente aquella que no deje huecos en la programación de la máquina respetando las relaciones de precedencia entre trabajos.  Este tipo de problema puede resolverse mediante la aplicación de grafos de arcos y nodos que plasman las relaciones de precedencia entre trabajos y asignando los mismos por  orden creciente de niveles. 

 Ejemplo de grafo de arcos y nodos 

      2.3.5.‐ F1/ /ΣLi  Es un problema de clase P, con una sola máquina y cuyo objetivo es minimizar la suma de las desviaciones de las fechas de finalización de los trabajos con respecto a las fechas de entrega.  La solución óptima se obtiene asignando los trabajos por orden creciente de su tiempo de proceso (regla SPT) y es independiente de las fechas de entrega según se demuestra a continuación:  

 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

22

  2.3.6.‐ F1/ /Lmax  Es un problema de clase P, con una sola máquina y cuyo objetivo es minimizar la desviación máxima con respecto a la fecha de entrega prevista.   La solución óptima se obtiene asignando los trabajos por orden creciente de su fecha de entrega o lo que es lo mismo, aplicando la regla EDD (Earliest Due Data)  

Esto es debido a que por ejemplo si se intercambian dos trabajos J1 y J2 (d1d2 ) ordenados por EDD, la fecha de finalización del último será la misma (tf), pero el retraso de J1 será ahora mayor al que poseía  antes (pues termina después) y mayor 

que el que poseía J2 antes (pues al ser d1d2  L2= tf ‐d2  L1= tf ‐d1)     2.3.7.‐ F1/ri,pi=1/Lmax  Es un problema de clase P, con una sola máquina y cuyo objetivo es minimizar la desviación máxima con respecto a la fecha de entrega prevista.   En este problema se introduce otro tipo de restricción que son las fechas de llegada al sistema de los trabajos. Además este problema incorpora la peculiaridad de que todos los trabajos tienen tiempo de proceso unitario.  La solución óptima a este problema se obtiene aplicando la regla EDD ampliada, esto es, tras cada instante de tiempo, se aplica la regla EDD al conjunto de trabajos disponibles en el sistema.      2.3.8.‐ F1/ /ΣXTi  Es un problema de clase P, con una sola máquina y cuyo objetivo es  minimizar el número de trabajos que se retrasan con respecto a su fecha de entrega.  La solución óptima se consigue aplicando el Algoritmo de Hodgson & Moore.  La filosofía de este algoritmo sería la siguiente:  Si se van secuenciando los trabajos por EDD, en el momento que un trabajo  se retrase, significara que un trabajo tiene que retrasarse seguro (pues el instante de finalización de todos es el mismo). En ese caso y puesto que uno de ellos se va a retrasar lo más lógico es quitar de la secuencia al que tenga un tiempo de proceso superior, y continuar introduciendo trabajos en la secuencia.   Los trabajos que se quitan de la secuencia se consideran retrasados y se introducen al final de la secuencia, una vez comprobada la introducción de todos los trabajos. que se expone a continuación. 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

23

  2.3.9.‐ F1/ri,prmp/Lmax  Es un problema de clase P, con una sola máquina y cuyo objetivo es minimizar la desviación máxima con respecto a la fecha de entrega prevista.  Este tipo problema incluye la opción de "rotura" (preemption) de los trabajos, lo que permite interrumpir en un momento determinado el proceso sobre un trabajo para continuarlo más adelante.   La solución óptima se obtiene aplicando el algoritmo de Horn.   El algoritmo de Horn, promueve un planteamiento muy similar a la regla EDD ampliada que ya se vio en el problema F1/ri,pi=1/Lmax. En este caso se aplicará la regla EDD cada vez que ocurra alguno de los siguientes eventos: bien que finalice el trabajo que está siendo procesado, o bien que un nuevo trabajo llegue al sistema.  

 Instante 1: el trabajo J1 comienza a procesarse en la máquina 

  

 Instante 2: El proceso del trabajo J1 se interrumpe (preemption) 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

24

  

  

Instante 3: J1 se retira de la máquina y en su lugar comienza a procesarse J2.  

 Instante 4: Una vez finalizado J2 se vuelve a colocar J1 en la máquina para ser procesado. 

  

  2.3.10.‐ F2/ /Cmax  Es un problema de clase P, con dos máquinas y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan). Al tratarse de un problema de tipo Flow Shop, todos los trabajos han de ser procesados en orden por las máquinas 1 y 2.  

 Arquitectura del problema F2 

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

25

1

( 2 1) 1m

i ijj

S m j p i n

La solución óptima a este problema se obtiene mediante la aplicación del algoritmo de Johnson.  El algoritmo de Johnson parte  de las siguientes premisas:  

- En cualquier asignación no deben de existir huecos en la primera máquina.   

-  Respecto a la máquina 1, como interesa que los trabajos vayan quedando disponibles lo antes posibles para ser procesados en la segunda máquina, se podrían ordenar los trabajos de menor a mayor tiempo de proceso(en M1).  

-  Por otro lado, como van a existir huecos en la máquina 2, interesaría introducir los trabajos con mayor tiempo de proceso (en M2) antes, puesto que disminuirá el tamaño de los huecos, lo cual significa que se finalizaría antes. 

     2.3.11.‐ Fm/m≥3/Cmax  Es un problema de clase NP, con un número de máquinas mayor o igual a 3 y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan). Al tratarse de un problema de tipo Flow Shop, todos los trabajos han de ser procesados en orden por dichas máquinas.  Para este problema no se dispone de una heurística o algoritmo que garantice la solución óptima.  En la bibliografía clásica se suelen aplicar tres heurísticas diferentes para comparar los resultados obtenidos entre ellas.  Las heurísticas serían las siguientes:  ‐ Heurística de Palmer  Las prioridades de los trabajos se establecen de forma que los trabajos con pij que tienden a aumentar de una máquina a otra reciben más prioridad.  Índice de prioridad:    Los trabajos se ordenan en orden no decreciente respecto a Si         

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

26

11

21

' ( 1) 1

' 1

m

i ijj

m

i ijj

p m j p i n

p jp i n

‐ Heurística de  Dannenbring   Se transforma el problema original en uno equivalente de dos máquinas de tipo           F2 / /Cmax que posteriormente se resolverá mediante el algoritmo de Johnson. Los tiempos de proceso que se aplicarían en estas dos máquinas equivalentes se obtienen mediante las siguientes fórmulas.          

 Transformación del problema de M máquinas a 2 mediante el algoritmo de Dannenbring  

   ‐ Heurística CDS  Esta heurística propone la generación de m‐1 problemas equivalentes de dos máquinas que se resolverán de la misma forma que problema F2 / / Cmax  (algoritmo de Johnson).  Se tomará como solución, el mejor valor posible que se obtenga de cualquiera de los m‐1 problemas.   Para cada uno de los problema se obtienen los tiempos de proceso equivalentes en las dos máquinas mediante la aplicación de las siguientes fórmulas:         

11

21

1 ; 1 1

1 ; 1 1

i

kk

ijj

mk

ijj m k

p p i n k m

p p i n k m

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

27

 Partición para generar el primer problema equivalente del algoritmo CDS 

   

 Partición para generar el segundo  problema equivalente del algoritmo CDS 

   

 

 Partición para generar el m‐1  problema equivalente del algoritmo CDS 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

28

  2.3.12.‐ J2/ /Cmax  Es un problema de clase P, con dos máquinas y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan). Al tratarse de un problema de tipo Job Shop, cada trabajo tiene una secuencia de paso diferente por las máquinas.   

 Problema J2 y sus cuatro diferentes rutas de paso. 

 La solución óptima de este problema se obtiene mediante la aplicación del algoritmo de Jackson que se expone a continuación:  Se dividen los trabajos en 4 grupos en función de su ruta de paso por las máquinas 1‐2, 2‐1, 1 ó 2.    El orden de procesamiento en cada máquina se hace según lo siguiente:         M1 = {Johnson(J12), J1, Johnson(J21)}        M2 = {Johnson(J21), J2, Johnson(J12)}  La asignación se realiza sin dejar innecesariamente una máquina ociosa y teniendo en cuenta que debe terminar el proceso en una máquina para comenzar en la siguiente     2.3.13.‐ Pm/ /ΣCi.  Es un problema de clase P, con varias máquinas dispuestas en paralelo y cuyo objetivo es minimizar la suma de los tiempos de finalización de los trabajos.  Al igual que el problema equivalente con una sola máquina, la regla SPT obtiene la secuencia óptima. Los trabajos ordenados según dicha regla se van asignando a la máquina que esté libre en el instante menor, esto se conoce como Algoritmo de asignación de Conway.       

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

29

max

max

( ) 4 1

( ) 3 3

C LPT

C OPT m

  2.3.14.‐ Pm/ /Cmax  Es un problema de clase NP, con varias máquinas dispuestas en paralelo y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan).  No existe ninguna heurística que garantice la solución óptima para este problema, sin embargo aplicar la regla LPT (longest process time) y asignar por el algoritmo de Conway ofrece unos buenos resultados. Se puede demostrar que la solución encontrada por esta heurística (LPT) dista de la solución óptima una cantidad dependiente del número de máquinas y no superior a 4/3:      Para este problema el autor de este proyecto ha propuesto una heurística alternativa de resolución que poder comparar con la anterior. Esta heurística alternativa se describe a continuación:   1.‐Cálculo de una cota objetivo. Este valor de cota constituye a priori el mejor valor posible del objetivo (Cmax). Este valor se obtiene mediante la siguiente fórmula:  

 * En caso de que el valor obtenido sea decimal, se redondeará hasta el entero superior. 

 2.‐ Ordenar los trabajos mediante LPT.  3.‐ Para cada máquina se va repitiendo el siguiente proceso: ir asignando los trabajos en orden LPT hasta que la suma de los tiempos de proceso de los trabajos asignados a la misma iguale el valor de la cota objetivo (en cuyo caso finalizaría la asignación en esa máquina y se pasaría a la siguiente). Si la asignación de un trabajo implicara rebasar el valor de la cota objetivo, no se asignaría y se probaría con el siguiente trabajo según el orden LPT. Si ningún trabajo pudiera ser asignado sin rebasar el valor de la cota objetivo, finalizaría la asignación de esa máquina y pasaría a la siguiente.   4.‐ En una última fase, aquellos trabajos que hubieran quedado excluido sin asignar en el paso 3, se van asignando por LPT a las máquinas que antes vayan quedando libres (Conway).        

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

30

  2.3.15.‐ Pm/prmp/Cmax  Es un problema de clase P, con varias máquinas dispuestas en paralelo y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan).  La solución óptima a este problema puede obtenerse aplicando el algoritmo de McNaughton.  Este algoritmo se basa en el siguiente razonamiento: Se programan todos los trabajos seguidos y luego se reparten en m porciones para cada máquina. El tamaño de dichas porciones será igual a:       El algoritmo de McNaughton se expone a continuación:  

1. Calcular Cmax *  

2. i=1; t=0; j=1 (instante t actual en la máquina j) 

       3.  MIENTRAS i n     SI (t+pi) < Cmax 

* ENTONCES       Programar Ji en MJ en el intervalo [t,t+pi]       t=t+pi      SI NO       Programar Ji en MJ en el intervalo [t, Cmax 

*]       pi=pi – (Cmax * ‐ t);        i=i‐1       t=0     FIN SI     i=i+1   FIN MIENTRAS               

*max

1

1max max ,

n

i ij

i

C p pm

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

31

  2.3.16.‐ F1/ /ΣTi  Es un problema de clase NP, con una sola máquina y cuyo objetivo es minimizar la suma de los retrasos de todos los trabajos con respecto a su fecha de entrega.    Una heurística que ofrece una solución aceptable aunque no óptima es la regla MDD (Modified Due Data).  Esta heurística asigna en cada momento el trabajo con un valor mayor entre la fecha de entrega di y el tiempo de finalización del trabajo si fuera procesado en ese momento.  En cada iteración del algoritmo se introduce un trabajo, en concreto, aquél cuyo valor ni sea menor, donde ni = max (di; t + pi) y t es el instante en el que se encuentra la secuenciación.       2.3.17.‐ Pm/ /ΣXTi  Es un problema de clase P, con varias  máquinas en paralelo y cuyo objetivo es  minimizar el número de trabajos que se retrasan con respecto a su fecha de entrega.  Al igual que en su problema equivalente de una sola máquina, la solución óptima se consigue aplicando el Algoritmo de Hodgson & Moore más el criterio de asignación de Conway (se van asignando los trabajos a la primera máquina en quedar disponible).  La filosofía de este algoritmo sería la siguiente:  Si se van secuenciando los trabajos por EDD, en el momento que un trabajo  se retrase, significara que un trabajo tiene que retrasarse seguro (pues el instante de finalización de todos es el mismo). En ese caso y puesto que uno de ellos se va a retrasar lo más lógico es quitar de la secuencia al que tenga un tiempo de proceso superior, y continuar introduciendo trabajos en la secuencia. Los trabajos que se quitan de la secuencia se consideran retrasados y se introducen al final de la secuencia, una vez comprobada la introducción de todos los trabajos.            

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

32

  2.3.18.‐ Pm/ /Lmax  Es un problema de clase P, con varias  máquinas en paralelo y cuyo objetivo es minimizar la desviación máxima con respecto a la fecha de entrega prevista.  Al igual que en el problema equivalente de una sola máquina, la solución óptima se obtiene ordenando los trabajos por orden creciente de su fecha de entrega o lo que es lo mismo, aplicando la regla EDD (Earliest Due Data)  A continuación se van recorriendo en orden las máquinas y asignando el trabajo a la máquina que no empeore el Lmax que lleve acumulado en ese instante.  En el caso de que cualquier asignación del trabajo a cualquier máquina, empeore el Lmax, se asignará a la máquina que lo empeore en menor medida.       2.3.19.‐ Pm/pre/Cmax  Es un problema de clase P, con varias máquinas en paralelo y cuyo objetivo es minimizar el tiempo de finalización de todos los trabajos (makespan).  Los trabajos incorporan una restricción adicional en forma de relaciones de precedencia.  La solución óptima es una variante del problema equivalente de una sola máquina F1/pre/Cmax.   Partiendo de un grafo de nodos y arcos se establece una serie de niveles de precedencia de trabajos y se van asignando los trabajos por niveles a la máquina que quede libre antes (Algoritmo de Conway). Este proceso nos garantiza la solución óptima al problema.                

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

33

3.‐ DISEÑO DE LA APLICACIÓN INFORMÁTICA.     3.1.‐ ENTORNO.    El programa objeto de este proyecto ha sido desarrollado en código VBA (Visual Basic para Aplicaciones) y se ha implementado dentro de un archivo excel habilitado para macros. Está compuesto en base a una serie de formularios (que constituyen la interfaz de entrada de datos), procedimientos y funciones que asisten al usuario en la resolución de los problemas clásicos de Programación de Trabajos en Máquinas (PTM) y que se estudian a lo largo de la asignatura de Secuenciación de segundo curso de IOI.     Se ha optado por implementar este programa sobre un hoja excel por los siguientes motivos:   ‐ Al no requerir instalación se reducen los problemas de compatibilidad con distintos sistemas operativos.  ‐ Se simplifica notablemente el proceso de edición de futuras versiones, puesto que no se requieren los procesos de compilación, y de creación de un ejecutable y de un instalable tras cada modificación.  ‐ La propia interfaz de excel, con su estructura de celdas y hojas se emplea para la captura y almacenamiento de datos así como para la representación de gráficos.  El archivo tiene un tamaño inferior a 1MB y se incluye dentro del CD anexo al proyecto.       3.2.‐ ESTRUCTURA DE LA APLICACIÓN.     Como ya se ha indicado previamente la aplicación está construida en base a formularios, que van guiando al usuario durante el proceso en la creación del problema, en la introducción de datos y en la resolución del mismo.    El siguiente diagrama de flujo representa de forma esquemática el funcionamiento general del programa.  

 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

34

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

35

Los distintos bloques de código están distribuidos dentro del programa de la siguiente forma:  ‐ "Detrás" de los diferentes formularios para dirigir los eventos que va activando el usuario sobre ellos.  ‐ Módulo 1. En este módulo se ha colocado el programa principal junto con las principales rutinas y funciones auxiliares de uso general que se emplean en la resolución de los diferentes problemas.  ‐ Módulo 2. En este módulo se han colocado las 19 rutinas específicas correspondientes a los diferentes tipos de problemas. Desde ellas se realizan  llamadas a las funciones auxiliares del Módulo 1.  A continuación, se hace un repaso de las diferentes ventanas y formularios que muestra el programa durante su funcionamiento:  Al abrir el archivo "Secuenciacion.xlsm" se inicia la aplicación de forma automática (auto_open) y aparece la siguiente ventana de bienvenida.  

   Una vez que el usuario hace click en el botón de "ENTRAR AL PROGRAMA" (no tiene otra opción), el programa le muestra un formulario donde se le da a elegir entre crear un problema desde el principio o importar los datos de un archivo .txt con datos guardados en alguna sesión previa.  

  

 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

36

   Si el usuario escoge la opción de crear un problema desde el principio, el programa le mostrará un formulario para  que elija el tipo de problema que desee resolver mediante un control combobox, así como el número de máquinas (en el caso de que esto no quede prefijado por el tipo de problema) y el número de trabajos.  

  

  En caso de que el usuario hubiese escogido la opción de importar datos desde un archivo txt, se le mostrará un formulario que hace de las veces de explorador de archivos para ayudarle a localizar el archivo que desee cargar.  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

37

  Una vez localizado y cargado el archivo con los datos que se han de importar, el programa mostrará al usuario un formulario de selección del tipo de problema. Dado que para un mismo conjunto de datos, pueden aplicar varios problemas, el programa ofrecerá al usuario solo las opciones compatibles con el conjunto de datos volcados. El número de máquinas y de trabajos quedará sin embargo fijados (ver imagen más abajo) en base a la información que contenía el archivo importado. Para el ejemplo de la imagen, los datos importados solo podían corresponder al problema F2//Cmax y por tanto el combobox solo ofrece esta opción al usuario.  

 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

38

En el caso de que se hubiera seleccionado la opción de crear un programa desde el principio y una vez seleccionado el tipo de problema y los números de máquinas y trabajos, se llegaría a la hoja "DATOS" donde se deben rellenar los datos numéricos del problema en una tabla adaptada específicamente al tipo de problema elegido.  

  Como puede verse en la imagen anterior, la tabla está creada directamente sobre una hoja excel para que el usuario introduzca de forma manual los datos.  En el eje de ordenadas (por filas) tenemos la descripción del parámetro a cumplimentar y en el eje de abscisas (por columnas) tenemos el trabajo al que corresponden.  Si se hubiera escogido la opción de importar datos, esta tabla ya aparecería rellena con los datos del archivo txt. 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

39

  

Tras rellenar todas las celdas de la tabla, el usuario pulsará el botón validar.  El programa comprobará si los datos introducidos son coherentes, esto es, que estén todos completos y que se trate de valores numéricos. De no ser así, el programa nos indicará cuál es la información que falta o bien no se ha rellenado correctamente.  Después de esta validación se generará la solución de forma gráfica (diagrama de Gantt) en la hoja "GRAFICOS" como puede verse en la siguiente imagen.  

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

40

Se indicará también la solución numérica del problema. Cmáx=31 en el ejemplo.  Desde esta misma hoja, se tiene acceso a otra serie de funciones mediante el uso de los botones que aparecen en la parte inferior. La función de cada uno de ellos se explica a continuación.  

Este botón permite resolver el mismo problema pero aplicando otro algoritmo. Esta opción solo está disponible para los problemas Fm/m≥3/Cmax y  Pm//Cmax, para los que se han implementado varios algoritmos de resolución. 

  

Este botón devuelve al usuario a la pantalla de "DATOS" y le ofrece la posibilidad de editar los datos que hubiese introducido anteriormente, pero dentro del mismo tipo de problema.   Este botón permite al usuario abordar un nuevo problema desde el principio.    Este botón permite al usuario guardar los datos introducidos a un archivo .txt que podrá importar más tarde.   

 Este botón permite al usuario cargar los datos de un archivo .txt siempre y cuando éste contenga los datos de una forma interpretable por el programa.  

 Con este botón el usuario abandonaría la aplicación.    

 Este botón muestra al usuario una ventana con una breve descripción de los fundamentos de resolución del problema.   

       

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

41

  3.3.‐ IMPLEMENTACIÓN DE LAS RUTINAS.  Como se ha expuesto anteriormente, este programa permite al usuario resolver hasta diecinueve tipos de problemas clásicos de Programación de Trabajos en Máquinas (PTM).  Todas las rutinas de resolución están contenidas dentro del módulo 2 del bloque de microsoft visual basic. Reproducir de forma íntegra en este documento el código fuente de todas las rutinas  es algo que carece de mucho interés didáctico,  sin embargo se van a describir de manera esquemática todas las rutinas mediante el empleo de pseudocódigo. No obstante, se insiste en que el código fuente íntegro está contenido junto al propio programa que se encuentra en el cd‐rom anexo a este documento.  Los comentarios que sirven de aclaración al pseudocódigo se resaltarán en color verde, para diferenciarlos del resto.         3.3.1.‐ F1/ /Cmax     Este problema admite varias soluciones siempre y cuando se cumpla la premisa de que no se dejan huecos en la programación que provoquen que la máquina quede ociosa entre trabajo y trabajo. Se trata por tanto de un método exacto que proporciona una solución óptima.  La rutina que da solución a este problema se ha llamado funocmax y el pseudocódigo sería el siguiente:  J = {J1,J2,... Jn} 'sea J el conjunto de los n trabajos del problema.  td = 0     'sea td el tiempo disponible, la variable que almacena el instante en que la máquina queda libre tras finalizar el trabajo asignado. En el instante inicial, td es cero.  Desde i = 1 hasta n  ' siendo n el número de trabajos   Asigna Jn a la máquina en el tiempo disponible     Td = Td + Pi   'actualiza el tiempo disponible con el tiempo de proceso del               trabajo asignado Siguiente i        

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

42

    3.3.2.‐ F1/ri/Cmax    La rutina que da solución a este problema se denomina funoricmax y se trata de un método exacto. El pseudocódigo de esta rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Ordenar J en orden creciente de fecha de llegada al sistema  td = 0     'sea td el tiempo disponible, la variable que almacena el instante en que la máquina queda libre tras finalizar el trabajo asignado. En el instante inicial, td es cero.  Desde i = 1 hasta n  ' recorriendo el vector de trabajos J ya ordenado por fecha de               llegada   Asigna Jn a la máquina en el tiempo disponible     td = td + pi   'se actualiza la variable tiempo disponible con el tiempo de proceso                   del trabajo asignado Siguiente i        3.3.3.‐ F1/ /ΣCi     La rutina que da solución a este problema se denomina funosci y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Ordenar J en orden creciente de tiempo de proceso (regla SPT)  td = 0     'sea td el tiempo disponible, la variable que almacena el instante en que la máquina queda libre tras finalizar el trabajo asignado. En el instante inicial, td es cero.  Desde i = 1 hasta n  ' recorriendo la matriz de trabajos J ya ordenada por SPT      Asigna  Jn a la máquina en el tiempo disponible     Td = Td + Pi   'se actualiza el tiempo disponible con el tiempo de proceso del               trabajo asignado Siguiente i         

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

43

    3.3.4.‐ F1/pre/Cmax  La rutina que da solución a este problema se denomina funoprecmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Particionar  J en subgrupos por  nivel* en función de las relaciones de precedencia.  * un trabajo que no depende de ningún otro, será de nivel 0. Un trabajo que depende de otro de un nivel q, se considerará de nivel q + 1. En caso de depender de varios trabajos el nivel del trabajo sería el del trabajo de mayor nivel más uno.  td = 0     'sea td el tiempo disponible, la variable que almacena el instante en que la máquina queda libre tras finalizar el trabajo asignado. En el instante inicial, td es cero.  Desde nivel 0 hasta último nivel    Desde i = 1 hasta n  ' siendo n el número de elementos que hay de cada nivel        Asigna  Jn a la máquina en el tiempo disponible       td = td + pi   'se actualiza el tiempo disponible con el tiempo de proceso          del trabajo asignado   Siguiente i  Siguiente nivel      3.3.5.‐ F1/ /ΣLi  La rutina que da solución a este problema se denomina funosli  y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente (Nótese que es idéntico al problema F1/ /ΣCi):  J = {J1, J2,...Jn}    'sea J el conjunto de los n trabajos del problema.  Ordenar J en orden creciente de tiempo de proceso (regla SPT)  td = 0     'sea td el tiempo disponible, la variable que almacena el instante en que la máquina queda libre tras finalizar el trabajo asignado. En el instante inicial, td es cero.  Desde i = 1 hasta n  ' recorriendo la matriz de trabajos J ya ordenada por SPT      Asigna  Jn a la máquina en el tiempo disponible       td = td + pi   'se actualiza el tiempo disponible con el tiempo de proceso        del trabajo asignado Siguiente i  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

44

    3.3.6.‐ F1/ /Lmax  La rutina que da solución a este problema se denomina funolmax  y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Ordenar J en orden creciente de fecha de entrega (regla EDD)  td = 0     'sea td el tiempo disponible, la variable que almacena el instante en que la máquina queda libre tras finalizar el trabajo asignado. En el instante inicial, td es cero.   Desde i = 1 hasta n  ' recorriendo la matriz de trabajos J ya ordenada por EDD      Asigna  Jn a la máquina en el tiempo disponible     td = td + pi   'se actualiza el tiempo disponible con el tiempo de proceso del                             trabajo asignado  Siguiente i       3.3.7.‐ F1/ri,pi=1/Lmax  La rutina que da solución a este problema se denomina funoripilmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Averiguo el ri máximo  'esto permite acotar el problema  Desde i = 1 hasta n    Desde t = 0 hasta ri máximo  'que se ha calculado anteriormente    Ordena trabajos con ri < =  t por regla edd.    Al trabajo con menor di se le asigna el orden i    Siguiente t  Siguiente n  Asignar los trabajos a la máquina según el orden i  calculado anteriormente         

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

45

    3.3.8.‐ F1/ /ΣXTi  La rutina que da solución a este problema se denomina funosxti y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Ordenar  J según EDD  Asignar los trabajos a la secuencia óptima por edd. Si un trabajo se retrasa, sacar de la secuencia óptima aquel trabajo de mayor duración.  Asignar posteriormente los trabajos sacados de la secuencia óptima por edd.       3.3.9.‐ F1/ri,prmp/Lmax  La rutina que da solución a este problema se denomina funoriprmplmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Ordenar  J de menor a mayor fecha de entrega  ' (Regla EDD)  MIENTRAS queden trabajos de J sin asignar  sea t la variable instante actual  'Al inicio t = 0  

Calcular  = min { ri; JiJ }  'Primera fecha de llegada al sistema  

Calcular  = min { ri: ri >  } 'Instante de llegada del siguiente trabajo, siempre superior al instante actual. Recorrer el conjunto J ya ordenado por EDD y escoger el primer trabajo Jk no asignado previamente que verifique ri<= instante actual.  

CALCULAR L = min {pk, ‐}  'intervalo hasta siguiente interrupción  

PROGRAMAR Jk en [, + L]  SI L >= pk ENTONCES      Asignar Jk     Δt = pk SI NO     No asignar Jk     pk=pk‐L 'actualiza el tiempo de proceso del trabajo Jk restándole lo ya procesado     Δt = pk‐L FIN SI 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

46

t = t + Δt 'el instante actual se actualiza con el tiempo de proceso asignado 

ri = t   Ji: ri <= t 'actualiza el valor de ri con el tiempo transcurrido L para los trabajos 

con ri =   FIN MIENTRAS.       3.3.10.‐ F2/ /Cmax  La rutina que da solución a este problema se denomina fdoscmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:   J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  PARTIR J en 2 secuencias: 

        SI1= {Ji: pi1  pi2}  : Trabajos con tiempo en máquina 1 igual o inferior al tiempo en máquina 1         SI2= {Ji: pi1 > pi2}  : Trabajos con tiempo en máquina 1 superior al tiempo en máquina 2  ORDENAR las secuencias         S1 = {SI1 en orden no decreciente de pi1}        S2 = {SI2 en orden no creciente de pi2}  ASIGNAR la secuencia final S  S= {S1,S2}  Sin dejar huecos innecesarios y sin interrupción entre la salida de una máquina y el inicio de la siguiente.                

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

47

    3.3.11.‐ Fm/m≥3/Cmax  Para la resolución de este problema se han implementado tres rutinas diferentes de acuerdo a las heurísticas de Palmer, Dannenbring y CDS. El pseudocódigo de las 3 rutinas se expone a continuación:   Palmer:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Para cada trabajo J se calcula el índice de prioridad Si mediante la siguiente fórmula:     Asignar los trabajos en orden creciente de Si, sin dejar huecos innecesarios y sin interrupción entre la salida de una máquina y el inicio de la siguiente.  Dannenbring:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Construir problema equivalente de 2 máquinas virtuales con las siguientes fórmulas para obtener los tiempos de proceso equivalente:        PARTIR J en 2 secuencias: 

        SI1= {Ji: pi1  pi2}  : Trabajos con tiempo en máquina 1 igual o inferior al tiempo en máquina 1         SI2= {Ji: pi1 > pi2}  : Trabajos con tiempo en máquina 1 superior al tiempo en máquina 2  ORDENAR las secuencias         S1 = {SI1 en orden no decreciente de pi1}        S2 = {SI2 en orden no creciente de pi2}  ASIGNAR la secuencia final S  S= {S1,S2} Sin dejar huecos innecesarios y sin interrupción entre la salida de una máquina y el inicio de la siguiente. 

1

( 2 1) 1m

i ijj

S m j p i n

11

21

' ( 1) 1

' 1

m

i ijj

m

i ijj

p m j p i n

p jp i n

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

48

CDS:   Se generan m‐1 problemas de tipo F2 / / Cmax que se resuelven mediante el algoritmo de Johnson. Para cada problema k se obtienen los tiempos mediante las fórmulas:                      3.3.12.‐ J2/ /Cmax  La rutina que da solución a este problema se denomina jdoscmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:   J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  DIVIDIR  J en 4 grupos:  

J12 [Trabajos con ruta de proceso 12] ; J21, J1; J2  

Ordenar mediante algoritmo Johnson los trabajos J12 

Ordenar mediante algoritmo Johnson los trabajos J21 

 Asignación de cada máquina:         M1 = {Johnson(J12), J1, Johnson(J21)}        M2 = {Johnson(J21), J2, Johnson(J12)}               

11

21

1 ; 1 1

1 ; 1 1

i

kk

ijj

mk

ijj m k

p p i n k m

p p i n k m

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

49

    3.3.13.‐ Pm/ /ΣCi  La rutina que da solución a este problema se denomina sptconway y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:   1. Ordenar J={J1,...,Jn} según regla SPT 2.   sj=0 j=1...m 3.   PARA i=1 HASTA n     sk= min {sj}     Programar Ji en Mk en el intervalo [sk,sk+pi]     sk=sk+pi    FIN PARA        3.3.14.‐ Pm/ /Cmax  La rutina que da solución a este problema se denomina lptconway y se trata de un método heurístico. El pseudocódigo de dicha rutina sería el siguiente:  1. Ordenar J={J1,...,Jn} según regla LPT 2.   sj=0 j=1...m 3.   PARA i=1 HASTA n     sk= min {sj}     Programar Ji en Mk en el intervalo [sk,sk+pi]     sk=sk+pi    FIN PARA    el autor del proyecto ha incluido una heurística alternativa que se expone a continuación.               

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

50

Algoritmo alternativo:  La rutina que da solución a este problema se denomina acsi  y el pseudocódigo de dicha rutina sería el siguiente:   1.‐Cálculo de una cota objetivo. Este valor de cota constituye a priori el mejor valor posible del objetivo (Cmax). Este valor se obtiene mediante la siguiente fórmula:  

 * En caso de que el valor obtenido sea decimal, se redondeará hasta el entero superior. 

 2.‐ Ordenar los trabajos mediante LPT.  3.‐ Por cada máquina se va repitiendo el siguiente proceso: ir asignando los trabajos en orden LPT hasta que la suma de los tiempos de proceso de los trabajos asignados a la misma iguale el valor de la cota objetivo (en cuyo caso finalizaría la asignación en esa máquina y se pasaría a la siguiente). Si la asignación de un trabajo implicara rebasar el valor de la cota objetivo, no se asignaría y se probaría con el siguiente según el orden LPT. Si ningún trabajo pudiera ser asignado sin rebasar el valor de la cota objetivo, finalizaría la asignación de esa máquina y pasaría a la siguiente.   4.‐ En una última fase, aquellos trabajos que hubieran quedado excluido sin asignar en el paso 3, se van asignando por LPT a las máquinas que antes vayan quedando libres (Conway).                     

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

51

    3.3.15.‐ Pm/prmp/Cmax  La rutina que da solución a este problema se denomina pmprmpcmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:   

1. Calcular Cmax *   'Regla de Mc Naughton 

 

 

 

 

 2. i=1; t=0; j=1 (instante t actual en la máquina j) 

       3.  MIENTRAS i n     SI (t+pi) < Cmax 

* ENTONCES       Programar Ji en MJ en el intervalo [t,t+pi]       t=t+pi      SI NO       Programar Ji en MJ en el intervalo [t, Cmax 

*]       pi=pi – (Cmax * ‐ t);        i=i‐1       t=0     FIN SI     i=i+1   FIN MIENTRAS        3.3.16.‐ F1/ /ΣTi  La rutina que da solución a este problema se denomina funosti y se trata de un método heurístico. El pseudocódigo de dicha rutina sería el siguiente: t = 0  For i = 1 To n     For j = I To n        If Jobs(j).di >= Jobs(j).pi + t Then          Jobs(j).ni = Jobs(j).di         Else          Jobs(j).ni = Jobs(j).pi + t        End If     Next     Ordenarcrecienteporni Jobs()     Asignar Job i a la secuencia       t = t + Jobs(i).pi  Next    

*max

1

1max max ,

n

i ij

i

C p pm

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

52

    3.3.17.‐ Pm/ /ΣXTi  La rutina que da solución a este problema se denomina pmsxti y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Ordenar  J de menor a mayor fecha de entrega  ' (Regla EDD)  Asignar los trabajos a la secuencia óptima por edd a la máquina que más tarde que más tarde quede disponible pero sin ocasionar retraso.  Si no pudiera colocar el trabajo en ninguna máquina sin implicar retraso, lo retiro de la secuencia óptima.  Asignar posteriormente los trabajos sacados de la secuencia óptima por edd + conway.       3.3.18.‐ Pm/ /Lmax  La rutina que da solución a este problema se denomina pmlmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente:  J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema. Ordenar J por fecha de llegada 'Regla EDD  Asignar a la máquina que más tarde quede libre y no empeoré (o empeore menos) el Lmax que se lleva acumulado.  A continuación recorrer en orden las máquinas y asignar el trabajo a la máquina que no empeore el Lmax que hay acumulado.  En el caso de que cualquier asignación del trabajo a cualquier máquina, empeore el Lmax, se asignaré a la máquina que lo empeore en menor medida.      3.3.19.‐ Pm/pre/Cmax  La rutina que da solución a este problema se denomina pmprecmax y se trata de un método exacto. El pseudocódigo de dicha rutina sería el siguiente: J = {J1, J2,...Jn} 'sea J el conjunto de los n trabajos del problema.  Partiendo de un grafo de nodos y arcos se establece una serie de niveles de precedencia de trabajos y se van asignando los trabajos de cada nivel a la máquina que quede libre antes (Algoritmo de Conway). Este proceso garantiza la solución óptima al problema.   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

53

  3.4.‐ FORMATO DE ARCHIVO DE ENTRADA DE DATOS.  Tal y como se ha comentado ya, el programa además de permitir la introducción de datos  de forma manual, ofrece la posibilidad de guardar y cargar los datos desde un archivo .txt para recuperarlos y trabajar con ellos en otro momento.  Este archivo .txt puede generarse bien a través de la propia aplicación al elegir guardar los datos o bien puede ser creado directamente con un editor de texto. Aunque no se aconseja hacerlo de forma directa, si  un usuario decide hacerlo deberá tener  presentes unos criterios mínimos para que estos datos sean interpretables correctamente por el programa.  Estos criterios se exponen a continuación:    ‐ Cada dato se escribirá en una línea no siendo necesario separadores (espacios, comas, guiones,...) tan solo el salto de línea.  ‐ La primera línea contendrá siempre el número de máquinas.  ‐ La segunda línea contendrá siempre el número de trabajos.  Después aparecerán los datos numéricos del programa precedidos de una línea donde indicar qué son los datos que van a continuación.   ‐ Estos identificadores se escriben siempre de la misma manera y en el mismo orden:    pi: para identificar tiempos de proceso. Si se tratase de un problema con varias máquinas y tiempos de proceso diferentes se indicaría pi1 y en las líneas sucesivas los tiempos de proceso de los trabajos correspondientes a esa máquina, luego se escribiría pi2 y en las líneas siguientes los tiempos de proceso de los trabajos en esa segunda máquina y así sucesivamente.    ri: para identificar instantes de llegada al sistema de los trabajos   di: para identificar fechas de entrega   pre: para identificar relaciones de precedencia   ruta: para identificar secuencia de paso por máquinas.    A modo de ejemplo se expone a continuación el contenido de un archivo con los datos necesarios para resolver el problema tipo J2/ /Cmax. Lo indicado en color verde corresponde tan solo a aclaraciones, no formando parte del contenido del archivo de texto:      

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

54

 2      'número de máquinas  6     'número de trabajos Pi1   'identificador de tiempo de proceso en la máquina 1  3     'datos en orden de los diferentes tiempos de proceso en la máquina 1  3   0   2   1   3  Pi2     'identificador de tiempo de proceso en la máquina 2  3      'datos en orden de los diferentes tiempos de proceso en la máquina 2  1   2   3   2   0  ruta 'identificador de rutas  21  'datos en orden de las rutas  12   2   12   21   1   A continuación se guardaría el archivo con el nombre y en la ubicación deseada y con la extensión .txt y ya podría ser importado desde el programa.                      

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

55

  3.5.‐ INSTALACIÓN.  Al estar todo incluido dentro del archivo excel "secuenciacion.xlsm", no se requiere hacer ninguna instalación y el único requisito sería copiar este archivo al ordenador desde el que se desee ejecutar la aplicación, en cualquier ubicación.  Sí es necesario no obstante tener instalado Microsoft Excel en cualquier versión posterior a 2003. La aplicación ha sido desarrollada en Excel 2007 habiéndose probado tanto en Excel 2003 como en 2010 no habiéndose detectado ningún problema de compatibilidad con ambas versiones.                                       

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

56

  3.6.‐ EJEMPLOS DE RESOLUCIÓN DE PROBLEMAS.    A continuación se va a resolver un problema de cada uno de los tipos admitidos por el programa a modo de ejemplo usando la aplicación.        3.6.1.‐     F1/ /Cmax.  Partiendo de los datos de la siguiente tabla:   

  Se elige el tipo de problema mediante el formulario:  

  

Se rellenan manualmente los resultados en la hoja de DATOS:  

     

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

57

Y tras validarlos se obtiene la siguiente solución:  

       3.6.2.‐     F1/ri/Cmax  Partiendo de los datos de la siguiente tabla:  

   Se elige el problema mediante el formulario de la aplicación:  

        

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

58

Se rellenan manualmente los resultados en la hoja de DATOS:   

   Y tras validarlos se obtiene la siguiente solución:  

  

          3.6.3.‐     F1/ /ΣCi    Se procede a resolver este problema con los datos siguientes.  

          

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

59

 Se elige el problema y el número de trabajos mediante el formulario siguiente:  

    Se rellenan lo datos de tiempo de proceso en la hoja de DATOS:   

   Y tras validarlos se obtendría la siguiente solución:  

  

       

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

60

  3.6.4.‐     F1/pre/Cmax  Se va a resolver este problema con los siguientes datos:  

  Las relaciones de precedencia de este problema ejemplo, corresponden al siguiente grafo de arcos y nodos. 

  Se elige el tipo de problema y el número de trabajos mediante el formulario de la aplicación:  

       

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

61

Se rellenan los resultados en la hoja de DATOS:  

   *Si las relaciones de precedencia introducidas en el sistema hubieran sido incoherentes (por ejemplo, estableciendo relaciones de precedencia mutuas entre dos trabajos) el programa lo habría advertido con un mensaje de error.  Tras la validación de los resultados, se obtendría la siguiente solución:  

  

  Se muestra a continuación un ejemplo en el que se indican relaciones de precedencia incoherentes: J6 y J4 son precedentes el uno del otro.  

    Tras pulsar el botón de validar el programa mostraría la siguiente ventana: 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

62

 

  y tras pulsar Aceptar, se devolvería al usuario a la hoja de DATOS para que revisará los valores introducidos.       3.6.5.‐     F1/ /ΣLi  Se usarán los siguientes datos:  

   Se elige el tipo de problema y el número de trabajos en el formulario de la aplicación:  

   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

63

Se rellena la hoja de DATOS:  

   Y tras validar se obtendría la siguiente solución:  

        3.6.6.‐     F1/ /Lmax  Usando como ejemplo los siguientes datos:                    

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

64

Se elige el tipo de problema mediante el formulario de la aplicación:   

   Se rellena manualmente la hoja de DATOS:  

   Y tras validarlos se obtendría la siguiente solución:  

  

  

   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

65

  3.6.7.‐     F1/ri,pi=1/Lmax  Usando como ejemplo los siguientes datos:  

    y eligiendo el tipo de problema mediante el formulario de la aplicación:  

   Se procede a rellenar la hoja de DATOS:  

         

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

66

Y tras validarlos el programa daría la siguiente solución:  

  

        3.6.8.‐     F1/ /ΣXTi   Usando como ejemplo los siguientes datos:  

  

 se elige el tipo de problema mediante el formulario de la aplicación:  

         

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

67

Se rellenan manualmente la hoja de DATOS:  

   Y tras validarlos se obtendría la siguiente solución:  

  

       3.6.9.‐     F1/ri,prmp/Lmax  Se va a resolver un problema ejemplo con los siguientes datos:  

   

 se elige el tipo de problema mediante el formulario de la aplicación:  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

68

  Se rellena manualmente la hoja de DATOS:   

  Y tras validarlos se obtendría la siguiente solución:  

  

 Nótese que el trabajo J5, debió ser interrumpido para colocar en la secuencia el trabajo J3 y a continuación fue procesado.       

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

69

    3.6.10.‐     F2/ /Cmax  Se va a resolver un problema ejemplo con los siguientes datos:  

   se elige el tipo de problema mediante el formulario de la aplicación:  

  Se rellena manualmente la hoja de DATOS:  

          

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

70

Y tras validarlos se obtendría la siguiente solución:  

        3.6.11.‐     Fm/m≥3/Cmax  El programa permite resolver este problema mediante tres algoritmos diferentes que son las heurísticas de Palmer, Dannenbring y CDS.  A modo de ejemplo se va resolver este problema con los siguientes datos:  

  se elige el tipo de problema mediante el formulario de la aplicación:  

   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

71

Se rellena manualmente la hoja de DATOS:  

  Y tras validarlos aparecerá la siguiente ventana para que se indique mediante qué tipo de heurística se desea resolver el problema:  

   El usuario puede elegir una, dos o tres heurísticas y las soluciones se representarán en la misma ventana de GRÁFICOS. Se muestran a continuación las soluciones obtenidas mediante la aplicación simultánea de las tres.   

   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

72

  

  

   Para el caso del ejemplo y como puede apreciarse, se obtiene un mejor resultado con la heurística CDS (56 vs 58 de las heurísticas de Palmer y Dannenbring).        3.6.12.‐     J2/ /Cmax  Se resuelve a continuación el siguiente problema de ejemplo:  

   

Nótese cuáles son los cuatro grupos de trabajo atendiendo a las rutas de proceso:   

         

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

73

se elige el tipo de problema mediante el formulario de la aplicación:  

  Se rellena manualmente la hoja de DATOS:  

  Nótese que si un trabajo no requiere el paso por una máquina, en tiempo de proceso se indicará el valor 0.  En la fila de "ruta" se indicará el orden de paso de los trabajos en las máquinas, habiendo cuatro alternativas posibles que son: 12,21,1 ó 2.  Finalmente, tras validar estos datos se obtendría la siguiente solución: 

   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

74

    3.6.13.‐     Pm/ /ΣCi  A continuación se va a resolver este problema con los datos de la siguiente tabla:  

  se elige el tipo de problema mediante el formulario de la aplicación:  

  Se rellena manualmente la hoja de DATOS:  

           

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

75

Y tras validarlos se obtendría la siguiente solución:  

 

       3.6.14.‐     Pm/ /Cmax  Para este problema existen dos heurísticas diferentes. Por un lado se emplea la heurística vista en el temario de la asignatura, esto es, aplicar la regla LPT + asignación Conway y por otro una heurística alternativa propuesta por el autor del proyecto y que ya ha sido descrita anteriormente.  Se aprovechará también este problema de ejemplo para comparar ambas:  

  se elige el tipo de problema mediante el formulario de la aplicación:  

 

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

76

Se rellena manualmente la hoja de DATOS:  

  Tras validar los datos, el programa pregunta al usuario sobre la heurística que desea emplear en la resolución del problema:  

   Tras elegir las dos opciones,  puesto que se desea realizar una comparativa, se obtendrían ambas soluciones:   

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

77

Para los datos del ejemplo, la heurística alternativa, ofrece mejores resultados que el algoritmo LPT + CONWAY. Se deja nuevamente abierto, a criterio del lector la comparativa de ambos algoritmos para cualquier otro conjunto de datos.       3.6.15.‐     Pm/prmp/Cmax   Resolviendo el problema con los datos de la siguiente tabla:   

  se elige el tipo de problema mediante el formulario de la aplicación:  

   Se rellena manualmente la hoja de DATOS:  

    

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

78

Y tras validarlos se obtendría la siguiente solución:       

    3.6.16.‐     F1/ /ΣTi  Resolviendo el problema con los datos de la siguiente tabla:  

   se elige el tipo de problema mediante el formulario de la aplicación:  

      

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

79

Se rellena manualmente la hoja de DATOS:  

   Y tras validarlos se obtendría la siguiente solución:   

        3.6.17.‐     Pm/ /ΣXTi  Se ha resuelto a modo de ejemplo este problema con los datos de la siguiente tabla:  

   se elige el tipo de problema mediante el formulario de la aplicación:  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

80

  Se rellena manualmente la hoja de DATOS:   

   Y tras validarlos se obtendría la siguiente solución:  

  

    

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

81

    3.6.18.‐     Pm/ /Lmax   Resolviendo este problema usando los datos de la siguiente tabla  

  se elige el tipo de problema mediante el formulario de la aplicación:   

   Se rellena manualmente la hoja de DATOS:  

      

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

82

Y tras validarlos se obtendría la siguiente solución:   

       3.6.19.‐     Pm/pre/Cmax  A modo de ejemplo se resolverá un problema basado en los datos de la siguiente tabla:  

   En base a los datos, se puede confeccionar el siguiente grafo de nodos y arcos:   

       

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

83

se elige el tipo de problema mediante el formulario de la aplicación:  

    Se rellena manualmente la hoja de DATOS:  

  Y tras validarlos se obtendría la siguiente solución:    

   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

84

  3.7.‐ AMPLIACIÓN DE LA COLECCIÓN DE PROBLEMAS.  Aunque actualmente el programa solo ofrece solución a una colección cerrada de problemas, existe la posibilidad de poder ir añadiéndole nuevos tipos. Para facilitar la labor a los futuros programadores que deseen ampliar la aplicación, se va a realizar a continuación una descripción exhaustiva de todas las modificaciones necesarias para que las nuevas rutinas queden implementadas de forma correcta.  La mejor forma de explicar el proceso de ampliación es hacerlo mediante un ejemplo y por ello se va a suponer que se desea incorporar un nuevo tipo de problema, correspondiente a dos máquinas en paralelo idénticas donde los trabajos se asignan a las máquinas de forma totalmente aleatoria, no existiendo ningún tipo de restricción. Llamaremos a este problema ficticio haciendo uso de la nomenclatura de secuenciación: P2/RANDOM/Cmax. Nótese que este problema carece de interés didáctico alguno a nivel de PTM.   A continuación se exponen los puntos del código dónde el programador deberá ir realizando las modificaciones pertinentes:  1º en formulario "TIPROBLEMA"  dentro de la rutina de inicialización del formulario, esto es, dentro de Private Sub userform_initialize() se añadirá la siguiente línea   ComboBox2.AddItem "P2/random/Cmax"  de esta forma cuando se inicie el programa, se mostrará dentro de la colección de posibles problemas a elegir del combobox.  

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

85

dentro de la rutina Private Sub ComboBox2_Click() que es la rutina que se activa al cambiar un valor del combobox de problemas, se añadirá una opción más dentro de la estructura "Select Case combobox2.value"  Case "P2/random/Cmax"      nmaq = 2                       'el número de máquinas se fija a 2     nmaq.Enabled = false    'se inhabilita la edición del campo de número de máquinas     nmaq.BackColor = &H80000011 'se pone el color negro de fondo       de esta manera cuando se elija el nuevo problema, el número de máquinas quedará ya fijado en 2 y la celda quedará bloqueada para que no pueda modificarse tal y como puede verse en la imagen siguiente.   

  En el caso de que se trate de un problema con un número variable de máquinas se deberá usar el siguiente código de forma que el número de máquinas quede abierto para que el usuario pueda introducirlo más adelante.      nmaq = ""                         'número de máquinas vacío, para que lo meta el usuario     nmaq.Enabled = true          'se habilita el cambio del campo número de máquinas     nmaq.BackColor = &H80000005    'se pone de fondo el color blanco   2º en la función "creamatriz2" que se encuentra dentro del Módulo 1.  Llegado a este punto en el que el programa ya conoce el número de trabajos y máquinas y el tipo de problema que se quiere resolver, el siguiente paso es crear una matriz de recogida de datos adecuada al problema elegido.  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

86

La función "creamatriz2" tiene esa misión. En el tipo de problema "ficticio" que se emplea como ejemplo, la única información necesaria es la correspondiente a los tiempos de proceso que al tratarse de máquinas idénticas se indicará en una sola línea.   Dentro de la estructura "Select Case c" existente, se añadirá una nueva opción      Case "P2/random/Cmax"          Sheets("DATOS").Cells(1 + 1 + Offsetmatriz, 1) = "Pi" 'son máquinas idénticas     Sheets("DATOS").Cells(2, 2) = "P2/random/Cmax"    3º en la rutina "valida" que se encuentra dentro del Módulo 1.   En esta rutina se realizan en primera instancia una serie de validaciones (que los datos introducidos sean numéricos, que no estén vacíos,...) y en caso de que los datos cumplen con los requisitos de validación, a continuación se dirigirá el flujo del programa al algoritmo de resolución correspondiente al problema elegido.   Por tanto y nuevamente se requerirá añadir una nueva alternativa dentro de la estructura "Select Case tipo" mediante el código siguiente:  Case "P2/random/Cmax" Call p2randomcmax  obviamente el procedimiento "p2randomcmax" que se invoca con este código aún no existe y debe ser creado.    4º creación del procedimiento que resuelve el nuevo problema.  En el caso del ejemplo, deberá crearse una rutina específica que se llamará "p2randomcmax" donde llevar a cabo el algoritmo de resolución. El algoritmo y su programación quedan obviamente a criterio del nuevo programador, no obstante, se indican algunas pautas que debería seguir puesto que pueden simplificar la tarea.  ‐ las rutinas de resolución de los problemas se encuentran en el Módulo 2, únicamente por cuestión de orden, siendo totalmente indiferente su ubicación a efectos prácticos.  ‐ existe una colección de rutinas y funciones auxiliares ya creadas que pueden ser de interés. Por ejemplo de cara a la representación gráfica de la solución, existe un procedimiento llamado "hojagraficos" que crea el diagrama de Gantt en base a una matriz con los resultados. La matriz de resultados se realiza con una estructura definida y que se expone a continuación:  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

87

 Ejemplo de la tabla "Matriz" con los resultados del problema 

 Por tanto, el programador sólo tendría que conseguir con el código conformar una matriz como la de la imagen anterior y posteriormente invocar a la rutina "hojagraficos" que representaría de forma gráfica la solución como se muestra en la imagen siguiente.  

 Representación gráfica de los resultados mediante el procedimiento "hojagraficos" 

 A continuación y para mostrar otras rutinas y funciones ya creadas que pueden ser de ayuda al programador, se va a proceder a resolver de forma completa el problema ficticio.  Se insiste en que se trata de un problema sencillo y carente de utilidad didáctica, puesto que una vez introducidos los datos, el programa asignará a cada uno de los trabajos un valor aleatorio (random) y los trabajos se irán asignando a la máquina libre en orden según el número aleatorio generado.     

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

88

El valor aleatorio se conseguirá usando las funciones propias de visual basic randomize y rnd. Como semilla se empleará el valor del número de trabajos. A continuación se usará la función "ordenamatriz" con los parámetros siguientes:  ‐  6 (que corresponde a la fila donde se encuentran los datos de prioridad aleatorio en base a los que ordenaremos)   ‐ TRUE (que sirve para indicarle que la ordenación sea de menor a mayor).  Como resultado, esta función indicará en la misma tabla de entrada de datos el orden que ocupa cada uno de los trabajos en base al criterio de ordenación elegido tal y como puede verse en la imagen siguiente.  

   Después se usará el procedimiento "replica" cuya misión no es más que la de hacer una copia de la matriz de la hoja "DATOS" a una nueva hoja llamada "DATOS REPLICA" pero con las trabajos en el orden ya determinado anteriormente, tal y como puede apreciarse en la siguiente imagen.  

  A continuación y en base a estos datos ya ordenados, se confeccionará la MATRIZ con los resultados finales para poder hacer uso luego del procedimiento "hojagraficos".     

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

89

Se hace mediante este sencillo algoritmo:  For j = 1 To nmaq    Sheets("MATRIZ").Cells(1, 2 * j) = "M" & j Sheets("MATRIZ").Cells(2, 2 * j) = "t0JiM" & j Sheets("MATRIZ").Cells(2, (2 * j) + 1) = "tfJiM" & j  Next j tdm1 = 0 tdm2 = 0      For i = 1 To ntra                 acutrabajo = Sheets("DATOS REPLICA").Cells(4, i + 1)                 acutiempo = Sheets("DATOS REPLICA").Cells(5, i + 1)                               If tdm1 <= tdm2 Then 'para ver qué máquina queda libre antes         t0 = tdm1         tf = tdm1 + acutiempo         Sheets("MATRIZ").Cells(2 + i, 1) = acutrabajo         Sheets("MATRIZ").Cells(2 + i, 2) = t0         Sheets("MATRIZ").Cells(2 + i, 3) = tf         tdm1 = tf         Else         t0 = tdm2         tf = tdm2 + acutiempo         Sheets("MATRIZ").Cells(2 + i, 1) = acutrabajo         Sheets("MATRIZ").Cells(2 + i, 4) = t0         Sheets("MATRIZ").Cells(2 + i, 5) = tf         tdm2 = tf         End If             Next i  5º en la rutina "hojagraficos" que se encuentra dentro del Módulo 1.  Además de crear el diagrama de Gantt, esta función indica el valor numérico de la solución. Se tendrá que añadir una opción más a la estructura "Select Case c " tal y como se indica a continuación:      Case "P2/random/Cmax"     texto = "P2/random/Cmax"     solucion = calccmax     'se hace uso de la función calcular cmax existente   

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

90

 El resultado obtenido sería el siguiente:  

   

En la hoja "GRAFICOS" donde se muestra el diagrama de Gantt con la resolución del problema, existen una serie de botones con algunas funciones que se deberán editar también para completar el cambio.  6º en la rutina "nuevoalgoritmo" que se encuentra dentro del Módulo 1. 

 

Esta rutina se ejecuta al pulsar el botón                              que hay en la parte inferior de la hoja. Este botón fue creado pensando en algunos problemas que admiten varios algoritmos de resolución. Para aquello casos en los que solo se ha contemplado un único algoritmo de resolución simplemente se mostrará una ventana advirtiendo que no existe esta posibilidad. Es también el caso del ejemplo que nos ocupa, así que simplemente se añadirá una opción más a la estructura "Select Case tipo" mediante el siguiente código:  Case "P2/random/Cmax" msj = MsgBox("No se ha programado ningún algoritmo alternativo para este problema.", vbExclamation, Title:="NO EXISTE ESTA POSIBILIDAD") end   de forma que una vez añadido este código, si un usuario pulsa el botón para aplicar otro algoritmo, recibirá el siguiente mensaje:  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

91

    7º en la rutina "explicalgoritmo" que se encuentra dentro del Módulo 2.    Esta rutina se ejecuta al pulsar el botón                            que hay en la parte inferior de la hoja. Al pulsar este botón se recibe un mensaje explicativo sobre el procedimiento aplicado para alcanzar la solución. En este caso, puesto que el problema que se ha creado no tiene ninguna utilidad, se indicará que se trata de un ejemplo y para ello se añadirá una nueva alternativa a la estructura "Select Case tipo" existente. 

 Case "P2/random/Cmax"     solucion = "P2/random/Cmax"     msj = MsgBox(solucion & Chr(13) & Chr(13) & "Algoritmo de ejemplo, sin ninguna utilidad.", vbInformation, Title:="ALGORITMO DE RESOLUCIÓN")  obteniéndose este resultado si se pulsa el botón:  

          

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

92

8º en el formulario PROBLEMAIMP.  La última modificación que debe hacerse en el programa original es relativa a la función de importación de datos a partir de un archivo .txt.  En primer lugar se debe analizar la rutina "posibleproblema" dentro del Módulo 2, que es la encargada de ofrecer al usuario las posibilidades de resolución en base a los datos que se quieren importar, como por ejemplo el número de máquinas, si hay o no fechas de entrega, de disponibilidad, relaciones de precedencia, etc...  Se ha denominado "bloque" a cada conjunto de problemas que pueden resolverse con un mismo tipo de datos de entrada. Se han determinado a su vez 12 "bloques" de problemas diferentes.  El caso ficticio que se viene usando como ejemplo corresponde a 2 máquinas idénticas en paralelo y donde no existen ni fechas de entrega ni relaciones de precedencia. Si se siguen las líneas de código de la rutina "posibleproblema", se observa que este "bloque" de problemas se ha identificado con el número 6.  Una vez identificado el bloque en el que incluir el nuevo problema hay que dirigirse a la rutina de inicialización del formulario PROBLEMAIMP. En ella existe una estructura para cargar el combobox con la colección de posibles problemas en base al bloque identificado anteriormente. Bastaría únicamente con añadir una nueva línea dentro de "Select Case problemas", en concreto dentro de la opción "Case 6" se  incluirá el siguiente código:  "P2/random/Cmax"  Al importar cualquier archivo de texto con datos correspondientes a dos máquinas en paralelo idénticas y sin relaciones de precedencia, se mostrará junto con otros problemas la posibilidad de resolver también el problema ficticio.  

  

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

93

Todos los fragmentos de código que se han añadido para llevar a cabo la implementación del nuevo problema se han conservado en el programa original precedidos con el símbolo comilla simple (') para que sean identificados como comentarios y sean ignorados durante la ejecución del programa. Para activarlos bastaría con eliminar el símbolo (').   3.8.‐ ELIMINAR LAS RESTRICCIONES EN EL NÚMERO DE MÁQUINAS Y/O TRABAJOS.  Como se ha comentado anteriormente, el programa tiene limitado tanto el número de máquinas (hasta un máximo de 7)  como el de trabajos (hasta un máximo de 20).  La razón de esta limitación no es otra que de comodidad y evitar la representación de diagramas de Gantt demasiado grandes.  No obstante si el usuario o el futuro programador desean eliminar estas restricciones, pueden hacerlo editando el código en los puntos que se indican a continuación.  1º en el formulario "TIPROBLEMA".  Dentro de la rutina "Private Sub aceptartipo_Click()" habría que eliminar los siguientes fragmentos de código:   If IsNumeric(a) Then     If a > 7 Then     msj = MsgBox("Por simplificar la representación gráfica del problema," & Chr(13) &_  "el número de máquinas está limitado como máximo a 7.", vbExclamation,_ Title:="DATOS NO VÁLIDOS")     Exit Sub     End If End If  (...)  If IsNumeric(b) Then     If b > 20 Then        msj = MsgBox("Por simplificar la representación gráfica del problema," & Chr(13) &                "el número de trabajos está limitado como máximo a 20.", vbExclamation,          Title:="DATOS NO VÁLIDOS")       Exit Sub     End If End If     

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

94

2º En la rutina "leer_fichero_de_texto" que se encuentra en el Módulo 1.  Dentro de esta rutina que es la encargada de importar datos desde un archivo de texto, también aparece el código indicado en el punto anterior.   Se debería igualmente de eliminar estos fragmentos de código.    3º En la rutinas "hojagraficos" y hojagraficosalt" que se encuentran en el Módulo 1.  Al comienzo de dichas rutinas se define un array denominado "colores" de veinte componentes que contiene los números correspondientes a los colores que se emplearán en los diagramas de Gantt para cada trabajo.  Si se decidiera aumentar el límite de trabajos a procesar, habría que aumentar en idéntica proporción la longitud de este vector.                               

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

95

4.‐ CONCLUSIONES.   Con  este proyecto  se ha  logrado  alcanzar  el objetivo principal que no  era otro  que dotar  al  estudiante  de  Programación  de  Trabajos  en Máquinas  de  una  herramienta sencilla y práctica que  le ayudase en  la resolución y análisis de  los problemas clásicos de esta disciplina.   La mayor  complejidad  del  proyecto  ha  residido  tanto  en  la  cantidad  de  algoritmos implementados como en el diseño y representación de los resultados. Para el autor del proyecto que ya conocía varios lenguajes de programación, la programación orientada a objetos de  los  formularios ha  resultado  algo novedoso  a  la par que práctico para poder  aplicar  en  el  futuro  en  su  vida  laboral.  Un  tiempo  muy  significativo  de  la duración total del proyecto se ha destinado a la depuración de errores por este motivo.  Se ha hecho un gran esfuerzo en intentar dotar a la aplicación de la mayor flexibilidad posible,  como  por  ejemplo  poder  comparar  resultados  de  diferentes  heurísticas  o realizar la importación de datos desde un archivo de texto.   Destacar  también el entorno en el que  se ha  implementado el programa, Microsoft Excel: Este entorno permite una portabilidad muy sencilla y práctica, puesto que es un software  muy  extendido.  La  utilización  de  otro  software  hubiera  beneficiado  la implementación pero no se habría conseguido este grado de accesibilidad.   Aunque se contempla una posible ampliación del programa para añadir nuevos tipos de problemas a la colección (a ello se ha dedicado el punto 3.7 de este documento), la implementación  de  otras  funciones  como  por  ejemplo  un  editor  de  heurísticas  que permitiera al usuario crear algoritmos más complejos y que le asistiera en el estudio de otros problemas habría  sido deseable. Esta  idea que  inicialmente  formaba parte del objetivo del proyecto, debió desecharse debido al aumento enorme de la complejidad y tiempo de la programación, en especial en el aspecto gráfico, para lo que visual basic no  es  quizás  el  lenguaje  de  programación más  apropiado.    En  esta  herramienta  se permitiría  al  usuario  aplicar  por  ejemplo  reglas  estáticas  y  dinámicas  así  como comparar  resultados  entre  heurísticas.    Queda  por  tanto  abierto  este  importante campo de mejora para futuros proyectos o para mejoras del actual.              

Diseño e implementación de algoritmos de programación de trabajos en máquinas.  

96

5.‐ BIBLIOGRAFÍA.  Para la realización de este proyecto las principales referencias de consulta han sido las siguientes publicaciones que se exponen a continuación:   * Deterministic Scheduling Theory. R. Gary Parker.  * Apuntes de la asignatura Secuenciación (2º curso IOI). José Manuel García Sánchez.  * Programación de tareas. SCHEDULING. Germán Andrés Méndez Giraldo.  * Técnicas inteligentes y estocásticas en scheduling. Un enfoque en la producción y las operaciones. Omar Danilo Castrillón Gómez 

* EXCEL 2007: VISUAL BASIC PARA APLICACIONES. Reed Jacobson. 

* Manual de Visual Basic para Excel. José Pedro García Sabater y Gonçal Bravo i Reig.