Libreria de python para Programacion y Control de Operaciones
Project description
pyOSCUD-Librería de Python para la Programación y Control de Operaciones
Autor: Eduyn Ramiro Lopez Santana, PhD.
Universidad Distrital Francisco José de Caldas
pyOSCUD– (Python library for Operations Scheduling and Control – Universidad Distrital ) es una librería en python creada para la programación y control de operaciones. Esta librería tiene cinco clases (ver Figura 3‑1) que cubren problemas de programación de operaciones para tres ambientes específicos: una máquina, maquinas paralelas y múltiples maquinas, el problema de balanceo de líneas de ensamble y la representación de control en una línea de producción basada en física de planta.
Figura 3‑1. Diagrama de clases de pyOSCUD
Fuente: Elaboración propia.
Para la utilización de esta librería debe instalarse e importarse las librerías PulP, pandas, numpy, matplotlib, plotly, networkx e intertools. También debe importarse las librerías: math, random, y copy, como complementos.
Esta librería se encuentra en el Anexo A.
Problemas de Una Máquina
El problema consiste en una sola máquina (también llamado recurso) que debe procesar el conjunto de operaciones que se le asignen buscando optimizar un objetivo. La salida es una secuencia de operaciones (también se le puede llamar permutación) que define el programa (schedule). Una representación de este problema se presenta en Figura 3‑2, donde los trabajos arriban a la estación siguiendo un proceso que puede ser determinístico o estocástico, y luego son procesados de a uno, para posteriormente ser entregados en el orden que determina la solución al problema.

Figura 3‑2. Esquema de arribo y salida de trabajos para un maquina o estación de trabajo
Fuente: Elaboración propia.
Este tipo de problemas se considera el más sencillo (en comparación de los demás configuraciones) y en muchas ocasiones son la reducción de otros problemas o subproblemas en esquemas de solución iterativos, (M. L. Pinedo, 2022).
Estructura de la clase SingleMachineSP
Como argumentos de entrada esta clase tiene los establecidos en la Tabla 3‑1, indicando el tipo de obligatorio, fijo u opcional, la descripción y un ejemplo de ingreso. Cabe resaltar que un problema sencillo solo requiere tres argumentos obligatorios (n, J, p).
Tabla 3‑1. Argumentos de entrada para SingleMachineSP
| Parámetro | Tipo | Descripción | Ejemplo |
|---|---|---|---|
| n | Obligatorio | Número de trabajos | 4 |
| J | Obligatorio | Lista de Trabajos | ["A","B","C","D"] |
| p | Obligatorio | Tiempos de Procesamiento | {"A":20, "B":14, "C":35, "D":10} |
| m | Fijo m =1 | Número de máquinas | 1 |
| prec | Opcional, default {} | Listado de arcos del grafo de relaciones de precedencia entre trabajos. | [("A","B"),("A","C")] |
| M | Opcional, default [‘M1’] | Lista de Máquinas | ["Maquina 1"] |
| d | Opcional, default {} | Fechas de entrega | {"A":25, "B":45, "C":50, "D":30} |
| r | Opcional, default {} | Tiempo de liberación | {"A":0, "B":0, "C":0, "D":0} |
| w | Opcional, default {} | Pesos (importancia) de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| w1 | Opcional, default {} | Pesos asociados a la Anticipación de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| w2 | Opcional, default {} | Pesos asociados a la Tardanza de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| sj | Opcional, default {} | Tiempo de setup (alistamiento) de cada trabajo | {"A":5, "B":5, "C":5, "D":5} |
| sijk | Opcional, default {} | Tiempo de setup (alistamiento) de cada trabajo dependiente de la secuencia | |
| Start | Opcional, 0 | Tiempo de inicio de la programación | 0 |
| objective | Opcional, default None | Función objetivo, posibles valores: "AvgC": "AvgE": "AvgT": "MinTotalLateJobs": "WeightedC": "WeightedT": "WeightedE": "WeightedT+E": "Tmax": "Emax": "Cmax": "Lmax": "sijk": None:["AvgC", "AvgE","AvgT"] |
None |
| gantt | Opcional, default False | Si es Verdadero (True), presenta el diagrama de gantt para la solución, default False | True |
| verbose | Opcional, default False | Si es Verdadero (True), presenta el detalle del programa para la solución, default False | True |
Fuente: Elaboración propia.
Los principales métodos para representar la solución del problema y calcular el desempeño son presentados en la Tabla 3‑2, indicando la función, los argumentos de entrada, la descripción y la salida generada. Con la función set_sequence() se genera una secuencia o permutación de trabajos que será la entrada para ejecutar los métodos como se muestra en la Figura 3‑3, donde inicia con process() para calcular las variables del programa, luego visualize() el diagrama de gantt, y finalmente compute_objective() para evaluar el desempeño. La función showResults()es opcional para mostrar los detalles del programa, desde la función process() cuando la variable verbose es True.
Tabla 3‑2. Principales métodos para una solución de SingleMachineSP
| Función | Argumentos de entrada | Descripción | Salida |
|---|---|---|---|
| set_sequence(seq) | seq: secuencia de solución (generada de manera manual) | Establece una permutación como solución, para poder utilizarla para calcular las métricas de desempeño. | Sequence: lista con la permutación de la solución |
| process(Sequence) | Sequence: lista con la permutación de la solución | Realiza los cálculos correspondientes al programa, valores de . | results: diccionario con los detalles de la solución |
| compute_ objective(objective) | objective: función objetivo a calcular | Evalúa la función objetivo deseada para una solución calculada con la función process(). | obj: valor de la función objetivo. |
| visualize(results) | results: diccionario con los detalles de la solución | Crea el diagrama de Gantt de la solución. | Diagrama de Gantt orientado a trabajos y orientado a maquinas. |
| showResults(Sequence) | Sequence: lista con la permutación de la solución | Presenta los detalles del programa calculado. | Ninguno. |
| visualize_Graph(results) | results: diccionario con los detalles de la solución | Crea el diagrama del grafo para las relaciones de precedencia. | Grafo de las relaciones de precedencia. |
Fuente: Elaboración propia.
Figura 3‑3. Diagrama de secuencia de set_sequence() para SingleMachineSP
Fuente: Elaboración propia.
A manera de ejemplo, considere 4 trabajos que deben procesarse en una máquina para un problema tipo . Es decir, las restricciones de este problema corresponden:
- los trabajos están disponibles en el tiempo 0 (,
- no se permite la división de trabajos, es decir, si un trabajo empieza debe procesarse hasta finalizar
- la máquina está disponible desde el tiempo 0, y solo puede procesar un trabajo a la vez
- no hay tiempos de alistamiento, es decir que las transiciones entre trabajos son despreciables.
Lo primero es instalar e importar la librería:
# isntalar la libreria
pip install pyOSCUD
# importar la libreria
from pyOSCUD import SingleMachineSP
Los tiempos de procesamiento se describen a continuación junto con el código de ejecución:
# n: numero de trabajos
n = 4
# p: lista de tiempos de procesamiento
p = [20,14,35,10]
# Trabajos: lista de etiquetas
J = ["A","B","C","D"]
p ={J[j]:p[j] for j in range(n)}
# Create a Single Machine instance
SM = psm.SingleMachineSP(n=n, J=J, p=p)
# Establece la secuencia
s=SM.set_sequence(["A","B","C","D"])
# obtener resultados
res=SM.process(s)
# visualizar el Gantt
SM.visualize(res)
# calcular objetivos
SM.compute_objective(None)
# mostrar detalle de los resultados
SM.showResults(s)

Figura 3‑4. Ejemplo de Resultados SingleMachineSP
Fuente: Elaboración propia.
Los resultados son los siguientes en la Figura 3‑4. Se puede observar el detalle de la solución dada una secuencia establecida, con un makespan de 79, un promedio de tiempos de finalización de 50.5. Se puede observar que el promedio de la anticipación es de 0, y de tardanza de 50.5 (dado que se asume por defecto que las fechas de entrega son 0). En las siguientes secciones se describirán los métodos desarrollados que permiten obtener secuencias aplicando reglas o algoritmos específicos, y un modelo de optimización planteado.
Problemas de Máquinas Paralelas
El problema consiste en una sola estación de trabajo con varias máquinas en paralelo que debe procesar el conjunto de operaciones que se le asignen buscando optimizar un objetivo. La salida es una secuencia de operaciones (también se le puede llamar permutación) para cada máquina que define el programa (schedule). Una representación de este problema se presenta en Figura 3‑6, donde los trabajos arriban a la estación siguiendo un proceso que puede ser determinístico o estocástico, y luego son procesados de a uno en una de las maquinas en paralelo, para posteriormente ser entregados.

Figura 3‑6. Esquema de arribo y salida de trabajos para maquinas en paralelo
Fuente: Elaboración propia.
Este tipo de problemas se considera una generalización del problema de una maquina y un caso particular de máquinas múltiples, (M. L. Pinedo, 2022).
Estructura de la clase ParallelMachineSP
Como argumentos de entrada esta clase tiene los establecidos en la Tabla 3‑4, indicando el tipo de obligatorio, fijo u opcional, la descripción y un ejemplo de ingreso. Cabe resaltar que un problema sencillo solo requiere seis argumentos obligatorios (n, m, J, M, p, ty).
Tabla 3‑4. Argumentos de entrada para SingleMachineSP
| Parámetro | Tipo | Descripción | Ejemplo |
|---|---|---|---|
| n | Obligatorio | Número de trabajos | 4 |
| J | Obligatorio | Lista de Trabajos | ["A","B","C","D"] |
| m | Obligatorio | Número de máquinas | 2 |
| M | Obligatorio | Lista de Máquinas | [“MA”,”MB”] |
| p | Obligatorio | Tiempos de Procesamiento | {"A":25, "B":45, "C":50, "D":30} |
| ty | Obligatorio | Tipo de problema de programación P - maquinas paralelas idénticas Q - maquinas paralelas uniformes (distintas velocidades) R – maquinas paralelas no relacionados () |
P |
| prec | Opcional, default {} | Listado de arcos del grafo de relaciones de precedencia entre trabajos. | [("A","B"),("A","C")] |
| d | Opcional, default {} | Fechas de entrega | {"A":25, "B":45, "C":50, "D":30} |
| r | Opcional, default {} | Tiempo de liberación | {"A":0, "B":0, "C":0, "D":0} |
| w | Opcional, default {} | Pesos (importancia) de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| w1 | Opcional, default {} | Pesos asociados a la Anticipación de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| w2 | Opcional, default {} | Pesos asociados a la Tardanza de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| sj | Opcional, default {} | Tiempo de setup (alistamiento) de cada trabajo | {"A":5, "B":5, "C":5, "D":5} |
| sijk | Opcional, default {} | Tiempo de setup (alistamiento) de cada trabajo dependiente de la secuencia | |
| Start | Opcional, 0 | Tiempo de inicio de la programación | 0 |
| objective | Opcional, default None | Función objetivo, posibles valores: "AvgC": "AvgE": "AvgT": "MinTotalLateJobs": "WeightedC": "WeightedT": "WeightedE": "WeightedT+E": "Tmax": "Emax": "Cmax": "Lmax": "sijk": None:["AvgC", "AvgE","AvgT"] |
None |
| gantt | Opcional, default False | Si es Verdadero (True), presenta el diagrama de gantt para la solución, default False | True |
| verbose | Opcional, default False | Si es Verdadero (True), presenta el detalle del programa para la solución, default False | True |
Fuente: Elaboración propia.
Los principales métodos para representar la solución del problema y calcular el desempeño son presentados en la Tabla 3‑5, indicando la función, los argumentos de entrada, la descripción y la salida generada. Con la función set_sequence() se genera una secuencia o permutación de trabajos que será la entrada para ejecutar los métodos como se muestra en la Figura 3‑7, donde inicia con process() para calcular las variables del programa, luego visualize() el diagrama de gantt, y finalmente compute_objective() para evaluar el desempeño. La función showResults()es opcional para mostrar los detalles del programa, desde la función process() cuando la variable verbose es True. Se puede observar que la estructura es muy similar a la de la librería de Una Maquina (Figura 3‑3), solo cambian los argumentos de entrada de algunas funciones y el uso de la lista sequenceMach que es un arreglo con la lista de trabajos asignados a cada maquina en su orden.
Tabla 3‑5. Principales métodos para una solución de SingleMachineSP
| Función | Argumentos de entrada | Descripción | Salida |
|---|---|---|---|
| set_sequence(seq) | seq: secuencia de solución (generada de manera manual) | Establece una permutación como solución, para poder utilizarla en la programación. | Sequence: lista con la permutación de la solución |
| process(Sequence, sequenceMach={}) | Sequence: lista con la permutación de la solución sequenceMach={}, es un arreglo con la lista de trabajos asignados a cada maquina en su orden |
Si sequenceMach es vacío, entonces lo determina usando la secuencia dada. Realiza los cálculos correspondientes al programa, valores de . |
results: diccionario con los detalles de la solución |
| compute_ objective(objective) | objective: función objetivo a calcular | Evalúa la función objetivo deseada para una solución calculada con la función process(). | obj: valor de la función objetivo. |
| visualize(results) | results: diccionario con los detalles de la solución | Crea el diagrama de Gantt de la solución. | Diagrama de Gantt orientado a trabajos y orientado a maquinas. |
| showResults(sequenceMach) | sequenceMach: es un arreglo con la lista de trabajos asignados a cada maquina en su orden | Presenta los detalles del programa calculado. | Ninguno. |
| visualize_Graph(results) | results: diccionario con los detalles de la solución | Crea el diagrama del grafo para las relaciones de precedencia. | Grafo de las relaciones de precedencia. |
Fuente: Elaboración propia.
Figura 3‑7. Diagrama de secuencia de set_sequence() para ParallelMachineSP
Fuente: Elaboración propia.
A manera de ejemplo, considere la situación planteada por (M. L. Pinedo, 2022) para el problema tipo con 9 trabajos a procesar en 4 máquinas idénticas. Las restricciones de este problema corresponden:
- los trabajos están disponibles en el tiempo 0 (,
- no se permite la división de trabajos, es decir, si un trabajo empieza debe procesarse hasta finalizar
- cada máquina está disponible desde el tiempo 0, y solo puede procesar un trabajo a la vez
- no hay tiempos de alistamiento, es decir que las transiciones entre trabajos son despreciables.
Lo primero es instalar e importar la librería:
# isntalar la libreria
pip install pyOSCUD
# importar la libreria
from pyOSCUD import ParallelMachineSP
Ahora se realiza la definición de los tiempos de procesamiento y el ambiente de máquina:
# n: numero de trabajos
n = 9
# m: numero de maquinas
m = 4
# p: lista de tiempos de procesamiento
p = [7,7,6,6,5,5,4,4,4]
tags = ["A","B","C","D","E","F","G","H","I"]
M=["M1","M2","M3","M4"]
# start: tiempo de inicio
p ={tags[j]:p[j] for j in range(n)}
start = 0
# Create a Single Machine instance
PM = ParallelMachineSP(n=n,m=m, ty='P',J=tags, M=M, p=p)
Ahora se resuelve el problema, por ejemplo aplicando una secuencia inicial:
jl=PM.set_sequence(tags)
res=PM.process(jl)
PM.visualize(res)
PM.showResults(jl)
PM.compute_objective('Cmax')
Los resultados obtenidos se presentan en Figura 3‑8.


Figura 3‑8. Ejemplo de Resultados ParallelMachineSP
Fuente: Elaboración propia.
Problemas de Múltiples Maquinas
El problema consiste en una configuración de estaciones de trabajo con varias máquinas a través de la cual se debe procesar el conjunto de operaciones buscando optimizar un objetivo. Dependiendo de la naturaleza de la configuración, los trabajos se procesarán en todas o algunas de las maquinas teniendo una ruta definida o por definir, sujeta a diferentes restricciones operacionales. Este tipo de problemas es más complejo y representa la mayor cantidad de trabajos aplicados en esta área de conocimiento (M. L. Pinedo, 2022).
Estructura de la clase MultiMachineSP
Como argumentos de entrada esta clase tiene los establecidos en la Tabla 3‑7, indicando el tipo de obligatorio u opcional, la descripción y un ejemplo de ingreso. Cabe resaltar que un problema sencillo solo requiere seis argumentos obligatorios (n, m, J, M, p, ty) al igual que la librería de máquinas paralelas.
Tabla 3‑7. Argumentos de entrada para MultiMachineSP
| Parámetro | Tipo | Descripción | Ejemplo |
|---|---|---|---|
| n | Obligatorio | Número de trabajos | 4 |
| J | Obligatorio | Lista de Trabajos | ["A","B","C","D"] |
| m | Obligatorio | Número de máquinas | 3 |
| M | Obligatorio | Lista de Máquinas | [“MA”,”MB”] |
| p | Obligatorio | Tiempos de Procesamiento | {"A":{"MA": 5, "MB": 2}, "B":{"MA": 5, "MB": 15}, "C":{"MA": 10, "MB": 8}, "D":{"MA": 3, "MB": 2}} |
| ty | Obligatorio | Tipo de problema de programación F – Flow Shop J – Job Shop O – Open Shop) |
F |
| prec | Opcional, default {} | Listado de arcos del grafo de relaciones de precedencia entre trabajos. | [("A","B"),("A","C")] |
| d | Opcional, default {} | Fechas de entrega | {"A":10, "B":15, "C":10, "D":12} |
| r | Opcional, default {} | Tiempo de liberación | {"A":0, "B":0, "C":0, "D":0} |
| w | Opcional, default {} | Pesos (importancia) de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| w1 | Opcional, default {} | Pesos asociados a la Anticipación de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| w2 | Opcional, default {} | Pesos asociados a la Tardanza de cada trabajo | {"A":1, "B":1, "C":1, "D":1} |
| sj | Opcional, default {} | Tiempo de setup (alistamiento) de cada trabajo | {"A":5, "B":5, "C":5, "D":5} |
| sijk | Opcional, default {} | Tiempo de setup (alistamiento) de cada trabajo dependiente de la secuencia | |
| Start | Opcional, 0 | Tiempo de inicio de la programación | 0 |
| objective | Opcional, default None | Función objetivo, posibles valores: "AvgC": "AvgE": "AvgT": "MinTotalLateJobs": "WeightedC": "WeightedT": "WeightedE": "WeightedT+E": "Tmax": "Emax": "Cmax": "Lmax": "sijk": None:["AvgC", "AvgE","AvgT"] |
None |
| gantt | Opcional, default False | Si es Verdadero (True), presenta el diagrama de gantt para la solución, default False | True |
| verbose | Opcional, default False | Si es Verdadero (True), presenta el detalle del programa para la solución, default False | True |
Fuente: Elaboración propia.
Los principales métodos para representar la solución del problema y calcular el desempeño son presentados en la Tabla 3‑8, indicando la función, los argumentos de entrada, la descripción y la salida generada. Se debe resaltar que siguen el mismo esquema del caso de máquinas paralelas. Con la función set_sequence() se genera una secuencia o permutación de trabajos que será la entrada para ejecutar los métodos como se muestra en la Figura 3‑11, donde inicia con process() para calcular las variables del programa, luego visualize() el diagrama de gantt, y finalmente compute_objective() para evaluar el desempeño. La función showResults()es opcional para mostrar los detalles del programa, desde la función process() cuando la variable verbose es True.
Tabla 3‑8. Principales métodos para una solución de MultiMachineSP
| Función | Argumentos de entrada | Descripción | Salida |
|---|---|---|---|
| set_sequence(seq) | seq: secuencia de solución (generada de manera manual) | Establece una permutación como solución, para poder utilizarla en la programación. | Sequence: lista con la permutación de la solución |
| process(Sequence, sequenceMach={}, optimum=False) | Sequence: lista con la permutación de la solución sequenceMach={}, es un arreglo con la lista de trabajos asignados a cada maquina en su orden optimum=False, es una condición que calcula si la secuencia es óptima o no para el open shop |
Si sequenceMach es vacío, entonces lo determina usando la secuencia dada. Realiza los cálculos correspondientes al programa, valores de . |
results: diccionario con los detalles de la solución |
| compute_ objective(objective) | objective: función objetivo a calcular | Evalúa la función objetivo deseada para una solución calculada con la función process(). | obj: valor de la función objetivo. |
| visualize(results) | results: diccionario con los detalles de la solución | Crea el diagrama de Gantt de la solución. | Diagrama de Gantt orientado a trabajos y orientado a maquinas. |
| showResults(sequenceMach) | sequenceMach: es un arreglo con la lista de trabajos asignados a cada maquina en su orden | Presenta los detalles del programa calculado. | Ninguno. |
| visualize_Graph(results) | results: diccionario con los detalles de la solución | Crea el diagrama del grafo para las relaciones de precedencia. | Grafo de las relaciones de precedencia. |
Fuente: Elaboración propia.

Figura 3‑11. Diagrama de secuencia de set_sequence() para MultiMachineSP
Fuente: Elaboración propia.
A manera de ejemplo, considere 5 trabajos que deben procesarse en dos máquinas para un problema tipo . Es decir, las restricciones de este problema corresponden:
- los trabajos están disponibles en el tiempo 0 (,
- no se permite la división de trabajos, es decir, si un trabajo empieza debe procesarse hasta finalizar
- cada máquina está disponible desde el tiempo 0, y solo puede procesar un trabajo a la vez
- no hay tiempos de alistamiento, es decir que las transiciones entre trabajos son despreciables.
Lo primero es instalar e importar la librería:
# instalar la libreria
pip install pyOSCUD
from pyOSCUD import MultiMachineSP
Ahora se realiza la definición de los tiempos de procesamiento y el ambiente de máquina:
# n: numero de trabajos
n = 5
# m: numero de maquinas
m = 2
# M: maquinas
M=['M1','M2']
# p: lista de tiempos de procesamiento
p =[[5,1,9,3,10],[2,6,7,8,4]]
# d: lista de tiempos de entrega
d= [15,6,9,23,20]
# r: lista de tiempos de inicio
r = [0,0,0,0,0]
# w: lista de pesos
w = [1,1,1,1,1]
# tags: lista de etiquetas
tags = ['J1','J2','J3','J4','J5']
p ={tags[j]:{M[i]: p[i][j] for i in range(m) }for j in range(n)}
d ={tags[j]:d[j] for j in range(n)}
r ={tags[j]:r[j] for j in range(n)}
w ={tags[j]:w[j] for j in range(n)}
F2 = MultiMachineSP(n=n,m=m,M=M,J=tags,p=p,d=d,r=r,w=w,ty="Flow-Shop",verbose=True)
s=F2.set_sequence(tags)
res=F2.process(s)
F2.visualize(res)
Ahora se resuelve el problema, por ejemplo aplicando una secuencia inicial:
s=F2.set_sequence(tags)
res=F2.process(s)
F2.visualize(res)
Los resultados obtenidos se muestran en la Figura 3‑12.


Figura 3‑12. Ejemplo de Resultados MultiMachineSP
Fuente: Elaboración propia.
Problema de Balanceo de Líneas de Ensamble
En este problema se considera un conjunto de trabajos que deben procesarse en una línea compuesta por un número de estaciones donde cada estación tenga un tiempo de proceso llamado también tiempo de ciclo . El problema consiste en encontrar la mejor asignación para que la línea sea “balanceada” en cuanto a la carga de trabajo asignada a las estaciones buscando minimizar el tiempo de ciclo o el número de estaciones, lo cual equivale a minimizar el tiempo de ocio y maximizar la eficiencia del ciclo.
Estructura de la clase ProductionBalance
Como argumentos de entrada esta clase tiene los establecidos en la Tabla 3‑9, indicando el tipo de obligatorio u opcional, la descripción y un ejemplo de ingreso. Cabe resaltar que un problema sencillo solo requiere cuatro argumentos obligatorios (n, J, p, R) al igual que la librería de máquinas paralelas.
Tabla 3‑9. Argumentos de entrada para ProductionBalance
| Parámetro | Tipo | Descripción | Ejemplo |
|---|---|---|---|
| n | Obligatorio | Número de trabajos | 5 |
| J | Obligatorio | Lista de Trabajos | J=['A','B','C','D','E'] |
| p | Obligatorio | Tiempos de Procesamiento | p={'A':4,'B':2,'C':3,'D':5,'E':2} |
| R | Obligatorio | Listado de arcos del grafo de relaciones de precedencia entre trabajos. | R=(('A','C'),('B','E'),('C','D'),('E','D')) |
| ct | Opcional, default False | Tiempo de ciclo | 6 |
| ko | Opcional, default False | Número mínimo de estaciones | 3 |
| Kmax | Opcional, default False | Número máximo de estaciones | 5 |
| objective | Opcional, default None | Función objetivo, posibles valores: "Min K”: Número mínimo de estaciones "Min idle":Tiempo ocioso mínimo "Min ct":tiempo de ciclo mínimo "Mincost":función objetivo relacionada con un costo equivalente de usar una maquina adicional a ko None:[‘Mincost’] por defecto |
None |
| gantt | Opcional, default False | Si es Verdadero (True), presenta el diagrama de gantt para la solución, default False | True |
| verbose | Opcional, default False | Si es Verdadero (True), presenta el detalle del programa para la solución, default False | True |
Fuente: Elaboración propia.
Los principales métodos para obtener una solución del problema y para calcular el desempeño son presentados en la Tabla 3‑10 indicando la función, los argumentos de entrada, la descripción y la salida generada. Al aplicar algunas de las reglas (se presentan en la Tabla 3‑11 más adelante) obtenidas se obtiene los tres argumentos de salida results, cft, y kf que son el diccionario con los resultados detallados para construir la solución, el tiempo de ciclo y número de estaciones obtenidos, respectivamente. Como ejemplo se presenta la Figura 3‑17 de la regla SPT, donde inicia con su ejecución, y llama a un problema de una sola máquina aplicando la regla SPT en cada iteración sobre los trabajos que no tengan precedencias en un esquema forward. Con estos resultados se procede a visualizar la solución en el grafo con la función visualize_Graph() y evaluar el desempeño con la función performance().
Tabla 3‑10. Principales métodos para una solución de ProductionBalance
| Función | Argumentos de entrada | Descripción | Salida |
|---|---|---|---|
| init() | All | Define los argumentos de entrada, y solicita la información relevante a: ct: tiempo de ciclo ko: número mínimo de estaciones También calcula el desempeño teórico de la solución: EC: eficiencia del ciclo d: retraso del balance I: tiempo muerto |
Problema de Balanceo de Líneas de Producción |
| visualize_Graph() | results: diccionario con los detalles de la solución | Crea el diagrama del grafo para las relaciones de precedencia. | Grafo de las relaciones de precedencia y asignación de estaciones. |
| performance(results, ctf, kf) | results: diccionario con los detalles de la solución ctf: tiempo de ciclo kf: número de estaciones |
Evalúa el desempeño de la solución: EC: eficiencia del ciclo d: retraso del balance I: tiempo muerto De manera general y por estaciones. |
Resumen de los resultados. |
| optimizationModel(problemName, objetiveFunction) | problemaName: nombre del problema de optimización objetiveFunction: Función objetivo, posibles valores: "Min K”: Número mínimo de estaciones "Min idle":Tiempo ocioso mínimo "Mincost":función objetivo relacionada con un costo equivalente de usar una maquina adicional a ko None:[‘Mincost’] por defecto |
Crea el modelo de optimización para resolver el problema. | Modelo de optimización |
| solve() | Ninguno | Resuelve el modelo de optimización | results: diccionario con los detalles de la solución cft: tiempo de ciclo kf: número de estaciones |
Fuente: Elaboración propia.

Figura 3‑17. Diagrama de secuencia de SPT() para ProductionBalance
Fuente: Elaboración propia.
A manera de ejemplo, considere 5 trabajos que deben procesarse en una línea de ensamble según la información se la sección 1.3.1.
Lo primero es instalar e importar la librería:
# instalar la libreria
pip install pyOSCUD
from pyOSCUD import ProductionBalance
Ahora, se define la información necesaria para resolver el problema:
Información de entrada
n=5
J=['A','B','C','D','E']
p={'A':4,'B':2,'C':3,'D':5,'E':2}
R=(('A','C'),('B','E'),('C','D'),('E','D'))
Kmax=5
ct=6
ko=3
B1 = ProductionBalance(n=n,J=J,p=p,ko=ko,ct=ct,R=R)
Ahora se resuelve el problema aplicando una secuencia dada:
B1.optimizationModel('EjemploO','Min K')
res,cf,kf = B1.solve()
B1.visualize_Graph(res)
B1.showModel("SBLP1.txt")
B1.performance(res,cf,kf)
Los resultados obtenidos se muestran en la Figura 3‑18.


Figura 3‑18. Ejemplo de Resultados para ProductionBalance()
Fuente: Elaboración propia.
Problema de Control básico de una Estación con Física de Planta
En este problema se considera una línea de producción tipo flujo con el fin de analizar el impacto de las tasas de producción, los tiempos de espera, y la utilización de las estaciones de trabajo mediante la Física de Planta. Para esto se desarrolló una clase llamada ProductionLine.
Estructura de la clase ProductionLine
Como argumentos de entrada esta clase tiene los establecidos en la Tabla 3‑12, indicando el tipo de obligatorio u opcional, la descripción y un ejemplo de ingreso. Cabe resaltar que un problema sencillo solo requiere dos argumentos obligatorios (M, p,).
Tabla 3‑12. Argumentos de entrada para ProductionLine
| Parámetro | Tipo | Descripción | Ejemplo |
|---|---|---|---|
| M | Obligatorio | Lista de Trabajos | M=['A','B','C','D','E'] |
| p | Obligatorio | Tiempos de Procesamiento | p={'A':4,'B':2,'C':3,'D':5,'E':2} |
| m | Opcional, default 1 | Número de máquinas por estación. | M={'A':1,'B':1,'C':2,'D':1,'E':1} |
| name | Opcional, default None | Si es Verdadero (True), presenta el detalle del programa para la solución, default False | True |
Fuente: Elaboración propia.
Los principales métodos para obtener una solución del problema y para calcular el desempeño son presentados en la Tabla 3‑10 indicando la función, los argumentos de entrada, la descripción y la salida generada. Los métodos describen los planteamientos de (Hopp & Spearman, 2011) para el cálculo de las medidas de desempeño Throughput (TH) y Cycle Time (CT) para dado un nivel de trabajo en proceso (w). El mejor caso (best) hace referencia a una línea sin variabilidad, es decir tiempos determinísticos. El peor caso (worst) representa el caso de máxima variabilidad en el cual se tiene el menor desempeño posible. El PWC (Practical Worst Case) o peor desempeño practico es un intermedio de los dos anteriores, asumiendo aleatoriedad máxima con tiempos distribuidos de manera exponencial. Los métodos df_scenarios, plot_scenarios_CT y plot_scenarios_TH se emplean para calcular los valores dado un nivel de WIP en w, y visualizar el desempeño para comparar un proceso.
Tabla 3‑13. Principales métodos para una solución de ProductionLine
| Función | Argumentos de entrada | Descripción | Salida |
|---|---|---|---|
| init() | All | Define los argumentos de entrada, y solicita la información relevante a: M: Conjunto de maquinas p: tiempos de procesamiento También calcula el desempeño de: : tasa cuello de botella : tiempo de ciclo crítico : trabajo en proceso crítico |
Problema de línea de producción |
| CT_best() | w: nivel de trabajo en proceso | Calcula el mínimo tiempo de ciclo dado un valor de w. Es el caso de una línea sin variabilidad. | if else |
| TH_best() | w: nivel de trabajo en proceso | Calcula el máximo throughput dado un valor de w. Es el caso de una línea sin variabilidad | if else |
| CT_worst() | w: nivel de trabajo en proceso | Calcula el peor tiempo de ciclo dado un valor de w. Es el caso de una línea con máxima variabilidad. | |
| TH_worst() | w: nivel de trabajo en proceso | Calcula el mínimo throughput dado un valor de w. Es el caso de una línea con máxima variabilidad | |
| CT_PWC() | w: nivel de trabajo en proceso | Calcula el peor tiempo de ciclo dado un valor de w en el caso práctico con peor desempeño (Practical Worst-Case Performance). Es el caso de una línea máxima aleatoriedad, asumiendo distribuciones de tipo exponencial para los tiempos. | |
| TH_PWC() | w: nivel de trabajo en proceso | Calcula el peor throughput dado un valor de w en el caso práctico con peor desempeño (Practical Worst-Case Performance). Es el caso de una línea con máxima aleatoriedad, asumiendo distribuciones de tipo exponencial para los tiempos. | |
| df_scenarios() | ProductionLine: objeto que representa la línea de producción max_wip: máximo valor de WIP para calcular |
Realiza los cálculos de CT y TH para los métodos descritos en esta tabla | DataFrame con los resultados. |
| plot_scenarios_TH() | ProductionLine: objeto que representa la línea de producción df: data frame del método df_scnearios() max_wip: máximo valor de WIP para calcular |
Realiza el gráfico de desempeño de la línea de producción de manera teórica con el cual se puede evaluar el desempeño de una línea de producción | Gráfico de TH en función de WIP para el caso: TH_best, TH_worst, y TH_PWC. |
| plot_scenarios_CT() | ProductionLine: objeto que representa la línea de producción df: data frame del método df_scnearios() max_wip: máximo valor de WIP para calcular |
Realiza el gráfico de desempeño de la línea de producción de manera teórica con el cual se puede evaluar el desempeño de una línea de producción | Gráfico de CT en función de WIP para el caso: CT_best, CT_worst, y CT_PWC. |
| plot_production_line() | ProductionLine: objeto que representa la línea de producción | Realiza el gráfico de la línea de producción en serie con los datos de la tasa, tiempo y numero de máquinas. Identifica la estación cuello de botella en color rojo. | Gráfico de la línea de producción. |
Fuente: Elaboración propia.
A manera de ejemplo, se tiene el caso de la fábrica de monedas dado por (Hopp & Spearman, 2011).
Lo primero es instalar e importar la librería:
# isntalar la libreria
pip install pyOSCUD
from pyOSCUD import ProductionLine
Ahora, se define la información necesaria para resolver el problema:
# m: numero de maquinas
m = 4
# p: lista de tiempos de procesamiento
p = [2,2,2,2]
m1 = [1,2,1,1]
M=["M1","M2","M3","M4"]
# start: tiempo de inicio
p ={M[i]:p[i] for i in range(m)}
m1 ={M[i]:m1[i] for i in range(m)}
# Create a Single Machine instance
PL=ProductionLine(M=M,p=p,m=m1,name="FM")
Ahora se resuelve el problema aplicando una secuencia dada:
df=PL.df_scenarios(PL,20)
PL.plot_scenarios_TH(PL,df,12)
PL.plot_scenarios_CT(PL,df,12)
Los resultados obtenidos se presentan en la Figura 3‑19.

Figura 3‑19. Ejemplo de Resultados para ProductionLine
Fuente: Elaboración propia.
Gráficas de Comparación
La librería propuesta permite crear con los métodos plot_scenarios_TH() y plot_scenarios_CT() las gráficas de comparación útiles para evaluar el desempeño de un sistema. En la Figura 3‑20 (a) se observa el throughput (TH) en función de WIP, en verde el mejor caso posible sin variabilidad, el rojo el peor caso con mayor variabilidad, y en azul el Peor Caso práctico con tiempo exponenciales. Un desempeño ubicado entre el PWC y el Best Case se determina como bueno o esbelto (Good o Lean) identificando que el sistema está funcionando con parámetros adecuados. Por otro lado, si el desempeño está bajo el PWC y el Worst Case se determina como malo (Bad – fat), lo cual identifica que el sistema actual no tiene unos parámetros adecuados y se puede establecer estrategias para incrementar el TH con el mismo WIP o disminuir el WIP con el mismo TH.

(a) (b)
Figura 3‑20. Ejemplo de Graficas de Comparación Teóricas (a) Throughput TH, (b) Tiempo de Ciclo CT
Fuente: Elaboración propia.
De manera similar en la Figura 3‑20 (b) se observa el tiempo de ciclo (CT) en función de WIP, en verde el mejor caso posible sin variabilidad, el rojo el peor caso con mayor variabilidad, y en azul el Peor Caso práctico con tiempo exponenciales. El análisis del sistema actual es similar al anterior, en el caso de encontrase en la zona Bad las estrategias posibles pueden ser disminuir el CT con el mismo WIP o aumentar el WIP con el mismo CT.
Estas gráficas son comparaciones en estado estable del sistema, generalmente cuando se tienen datos de varios periodos y se pueden validar mediante estrategias de simulación.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyoscud-0.1.1.tar.gz.
File metadata
- Download URL: pyoscud-0.1.1.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88587acb283741c2825889fc623978891837184eddf412e8be4d33f493453a55
|
|
| MD5 |
2619a7b4a4b9d005fbadb55f8e7bccd1
|
|
| BLAKE2b-256 |
dbd2ccb64aa4658cfba5d5a93d5731c4f4f30c9a3ea7c5a217c9c85f8160bc0a
|
File details
Details for the file pyOSCUD-0.1.1-py3-none-any.whl.
File metadata
- Download URL: pyOSCUD-0.1.1-py3-none-any.whl
- Upload date:
- Size: 557.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc2a29a634416303d49d2cd999ad6d6c8fb2e55e27848774d77f1e4d0e45585d
|
|
| MD5 |
79a51312b49247a6af80643d53a34b94
|
|
| BLAKE2b-256 |
8bcab2d2010e6e2623ea8033b2887dc6bdf6b70f57aecaca68b19b20ee14ea7f
|