La programación de trabajos en taller , el problema de trabajo en taller ( JSP ) o problema de programación de trabajos en taller ( JSSP ) es un problema de optimización en informática e investigación de operaciones . Es una variante de la programación óptima de trabajos . En un problema general de programación de trabajos, se nos dan n trabajos J 1 , J 2 , ..., J n de tiempos de procesamiento variables, que deben programarse en m máquinas con potencia de procesamiento variable, mientras se intenta minimizar el makespan - la longitud total de la programación (es decir, cuando todos los trabajos han terminado de procesarse). En la variante específica conocida como programación de trabajos en taller , cada trabajo consta de un conjunto de operaciones O 1 , O 2 , ..., O n que deben procesarse en un orden específico (conocido como restricciones de precedencia ). Cada operación tiene una máquina específica en la que debe procesarse y solo se puede procesar una operación en un trabajo en un momento dado. Una relajación común es el taller de trabajo flexible , donde cada operación puede procesarse en cualquier máquina de un conjunto determinado (las máquinas de cada conjunto son idénticas).
El nombre proviene originalmente de la programación de trabajos en un taller de trabajo , pero el tema tiene amplias aplicaciones más allá de ese tipo de instancia. Este problema es uno de los problemas de optimización combinatoria más conocidos, y fue el primer problema para el que se presentó el análisis competitivo , por Graham en 1966. [1] Las mejores instancias de problemas para un modelo básico con un objetivo de makespan se deben a Taillard. [2]
En la notación estándar de tres campos para problemas de programación óptima de trabajos , la variante de taller se denota con J en el primer campo. Por ejemplo, el problema denotado con " " es un problema de taller de tres máquinas con tiempos de procesamiento unitarios, donde el objetivo es minimizar el tiempo máximo de finalización.
Existen muchas variantes del problema, incluidas las siguientes:
Dado que el problema del viajante de comercio es NP-duro , el problema del taller con una configuración dependiente de la secuencia también es claramente NP-duro, ya que el TSP es un caso especial del JSP con un solo trabajo (las ciudades son las máquinas y el vendedor es el trabajo). [ cita requerida ]
El gráfico disyuntivo [5] es uno de los modelos populares utilizados para describir las instancias del problema de programación de talleres. [6]
El enunciado matemático del problema puede hacerse de la siguiente manera:
Sean y dos conjuntos finitos . Debido al origen industrial del problema, se denominan máquinas y se denominan puestos de trabajo .
Sea el conjunto de todas las asignaciones secuenciales de trabajos a las máquinas, de modo que cada trabajo sea realizado por cada máquina exactamente una vez; los elementos pueden escribirse como matrices, en cuya columna se enumeran los trabajos que realizará la máquina, en orden. Por ejemplo, la matriz
significa que la máquina hará los tres trabajos en el orden , mientras que la máquina hará los trabajos en el orden .
Supongamos también que existe una función de costo . La función de costo puede interpretarse como un "tiempo total de procesamiento" y puede tener alguna expresión en términos de tiempos , el costo/tiempo que requiere la máquina para realizar el trabajo .
El problema del taller de trabajo es encontrar una asignación de trabajos tal que sea un mínimo, es decir, no existe tal que .
La eficiencia de programación se puede definir para una programación a través de la relación entre el tiempo total de inactividad de la máquina y el tiempo total de procesamiento, como se muestra a continuación:
Aquí se muestra el tiempo de inactividad de la máquina i , C es el tiempo de ejecución y m es la cantidad de máquinas. Observe que con la definición anterior, la eficiencia de programación es simplemente el tiempo de ejecución normalizado a la cantidad de máquinas y el tiempo total de procesamiento. Esto permite comparar el uso de recursos en instancias JSP de diferentes tamaños. [7]
Uno de los primeros problemas que se deben abordar en el JSP es que muchas soluciones propuestas tienen un coste infinito: es decir, existe tal que . De hecho, es bastante sencillo inventar ejemplos de este tipo al asegurar que dos máquinas se bloquearán , de modo que cada una espere la salida del siguiente paso de la otra.
Graham ya había proporcionado el algoritmo de programación de listas en 1966, que es (2 − 1/ m ) -competitivo, donde m es el número de máquinas. [1] Además, se demostró que la programación de listas es un algoritmo en línea óptimo para 2 y 3 máquinas. El algoritmo Coffman-Graham (1972) para trabajos de longitud uniforme también es óptimo para dos máquinas y es (2 − 2/ m ) -competitivo. [8] [9] En 1992, Bartal, Fiat, Karloff y Vohra presentaron un algoritmo que es 1.986-competitivo. [10] Karger, Philips y Torng presentaron un algoritmo 1.945-competitivo en 1994. [11] En 1992, Albers proporcionó un algoritmo diferente que es 1.923-competitivo. [12] Actualmente, el resultado más conocido es un algoritmo dado por Fleischer y Wahl, que logra un ratio competitivo de 1,9201. [13]
Albers presentó un límite inferior de 1.852. [14] Las instancias de Taillard tienen un papel importante en el desarrollo de la programación de talleres con el objetivo de makespan.
En 1976, Garey proporcionó una prueba [15] de que este problema es NP-completo para m>2, es decir, no se puede calcular ninguna solución óptima en tiempo polinomial determinista para tres o más máquinas (a menos que P=NP ).
En 2011, Xin Chen et al. proporcionaron algoritmos óptimos para la programación en línea en dos máquinas relacionadas [16] mejorando los resultados anteriores. [17]
La forma más simple del problema de minimización de makespan fuera de línea se ocupa de trabajos atómicos, es decir, trabajos que no se subdividen en múltiples operaciones. Es equivalente a empaquetar una cantidad de elementos de distintos tamaños en una cantidad fija de contenedores, de modo que el tamaño máximo de contenedor necesario sea lo más pequeño posible. (Si, en cambio, se debe minimizar la cantidad de contenedores y el tamaño de contenedor es fijo, el problema se convierte en un problema diferente, conocido como el problema de empaquetamiento de contenedores ).
En 1987, Dorit S. Hochbaum y David Shmoys presentaron un esquema de aproximación en tiempo polinomial que encuentra una solución aproximada al problema de minimización de makespan fuera de línea con trabajos atómicos con cualquier grado deseado de precisión. [18]
La forma básica del problema de programación de trabajos con múltiples (M) operaciones, sobre M máquinas, de modo que todas las primeras operaciones deben realizarse en la primera máquina, todas las segundas operaciones en la segunda, etc., y un solo trabajo no puede realizarse en paralelo, se conoce como el problema de programación de flujo de trabajo . Existen varios algoritmos, incluidos los algoritmos genéticos . [19]
Se puede utilizar un algoritmo heurístico de SM Johnson para resolver el caso de un problema de N trabajos con 2 máquinas cuando todos los trabajos deben procesarse en el mismo orden. [20] Los pasos del algoritmo son los siguientes:
El trabajo P i tiene dos operaciones, de duración P i1 , P i2 , que deben realizarse en la máquina M1, M2 en esa secuencia.
Si el mínimo pertenece a P k1 ,
Eliminar K de la lista A; añadir K al final de la lista L1.
Si el mínimo pertenece a P k2 ,
Eliminar K de la lista A; añadir K al comienzo de la lista L2.
El método de Johnson sólo funciona de forma óptima para dos máquinas. Sin embargo, dado que es óptimo y fácil de calcular, algunos investigadores han intentado adoptarlo para M máquinas ( M > 2).
La idea es la siguiente: imaginemos que cada trabajo requiere m operaciones en secuencia, en M1, M2… Mm. Combinamos las primeras m /2 máquinas en un centro de mecanizado (imaginario), MC1, y las máquinas restantes en un centro de mecanizado MC2. Entonces, el tiempo total de procesamiento para un trabajo P en MC1 = suma (tiempos de operación en las primeras m /2 máquinas), y el tiempo de procesamiento para el trabajo P en MC2 = suma (tiempos de operación en las últimas m /2 máquinas).
De esta manera, hemos reducido el problema de las m-máquinas a un problema de programación de dos centros de mecanizado. Podemos resolverlo utilizando el método de Johnson.
Recientemente se ha utilizado el aprendizaje automático para predecir el tiempo de ejecución óptimo de una instancia JSP sin producir realmente la programación óptima. [7] Los resultados preliminares muestran una precisión de alrededor del 80 % cuando se aplicaron métodos de aprendizaje automático supervisado para clasificar pequeñas instancias JSP generadas aleatoriamente en función de su eficiencia de programación óptima en comparación con el promedio.
A continuación se muestra un ejemplo de un problema de programación de talleres formulado en AMPL como un problema de programación de números enteros mixtos con restricciones de indicador:
parámetro N_TRABAJOS ; parámetro N_MÁQUINAS ; establecer TRABAJOS ordenados = 1 .. N_TRABAJOS ; establecer MÁQUINAS ordenadas = 1 .. N_MÁQUINAS ; param ProcessingTime { TRABAJOS , MÁQUINAS } > 0 ; param TiempoAcumulado { i en TRABAJOS , j en MÁQUINAS } = suma { jj en MÁQUINAS : ord ( jj ) <= ord ( j )} TiempoProcesamiento [ i , jj ]; param TimeOffset { i1 en TRABAJOS , i2 en TRABAJOS : i1 <> i2 } = max { j en MÁQUINAS } ( TiempoAcumulado [ i1 , j ] - TiempoAcumulado [ i2 , j ] + TiempoDeProcesamiento [ i2 , j ]); final var >= 0 ; var inicio { TRABAJOS } >= 0 ; var precede a { i1 en TRABAJOS , i2 en TRABAJOS : ord ( i1 ) < ord ( i2 )} binario ; minimizar makespan : fin ; sujeto a makespan_def { i en TRABAJOS }: fin >= inicio [ i ] + suma { j en MÁQUINAS } ProcessingTime [ i , j ]; sujeto a no12_conflicto { i1 en TRABAJOS , i2 en TRABAJOS : ord ( i1 ) < ord ( i2 )}: precede [ i1 , i2 ] ==> inicio [ i2 ] >= inicio [ i1 ] + TimeOffset [ i1 , i2 ]; sujeto a no21_conflicto { i1 en TRABAJOS , i2 en TRABAJOS : ord ( i1 ) < ord ( i2 )}: ! precede [ i1 , i2 ] ==> inicio [ i1 ] >= inicio [ i2 ] + TimeOffset [ i2 , i1 ]; datos ;parámetro N_TRABAJOS : = 4 ; parámetro N_MÁQUINAS : = 4 ; param TiempoDeProcesamiento : 1 2 3 4 : = 1 5 4 2 1 2 8 3 6 2 3 9 7 2 3 4 3 1 5 8 ;