Ejemplo simple de una planeación de personal mediante programación lineal: Planteamiento, formulación y solución. Ing. Leonardo Gabriel Hernández Landa.
Una fábrica tiene que programar a sus trabajadores en turnos para tener una producción continua, dado que resulta caro parar y volver a arrancar el proceso de producción. Los trabajadores tienen una jornada laboral de 8 horas, un turno inicia cada 4 horas y tienen requerimientos mínimos para cubrir el personal por turno. El tomador de decisiones tiene que hacer el programa de arribos de los trabajadores tomando en cuenta la demanda en cada turno, minimizando el numero de empleados a ocupar por día. Turno
Demanda de trabajadores
0 – 4 Horas
10
4 – 8 Horas
20
8 – 12 Horas
80
12 – 16 Horas
65
16 – 20 Horas
55
20 – 0 Horas
20
Table 1: Demanda de personal por turno
Formulación Como podemos deducir deducir cada trabajador trabajador puede cubrir 2 turnos dado que su jornada jornada es de 8 horas y los turnos son de 4 horas, así que para cubrir la demanda de trabajadores debemos tomar en cuenta los que entran en el turno en proceso mas los trabajadores que entraron el turno anterior. Entonces empecemos a definir nuestro problema. Como tenemos 6 turnos podemos declararlos d eclararlos como los indices por los cuales nos guiaremos es decir i = Conjunto de turnos a programar. Definimos ahora que la suma de todos los empleados de los turnos será los que minimizaremos, entonces nuestras variables las definiremos como x i
= Número de empleados que entraran en el turno i.
Como parámetros tenemos las demandas de cada turno d i = Número mínimo de trabajadores requeridos para el turno i.
Entonces Entonces la función función objetivo se definirá definirá como la suma de todos los trabajadores trabajadores que ingresan en cada turno 6
∑ x
z =
Minimizar
i
i=1
y cada restricción se formará formará tomando en cuenta los requerimientos de la demanda de los los turnos de la siguiente manera x i x i−1≥ d i ∀ i =2,..6 . y la restricción que nos hará el ciclo será x 1 x6 =d 1
y nuestra restricción de no negatividad será x i ≥0 Entonces Tenemos Tenemos nuestro modelo completo de la siguiente manera 6
Minimizar
∑ x
z =
i
i= 1
s.t x i x i −1≥ d i
∀ i = 2,3..6 .
x 1 x6 =d 1 x i ≥0
El modelo desarrollado quedaría de la siguiente manera. min
z= x1 x 2 x 3 x 4 x 5 x 6
s.t. x 1 x 2= 20 x 2 x 3=80 x 3 x 4= 65 x 4 x5= 55 x 5 x 6=20 x 6 x 1=10 x 1, x 2, x 3, x 4, x5, x6 ≥0
Solución A continuación hacemos el Script para resolverlo en un Solver en Solver en computadora, en este caso usaremos General Algebraic Modeling System) System) como sistema de modelado y el código es el siguiente. GAMS(General GAMS( variables z; positive variables x1,x2,x3,x4,x5,x6; x1,x2,x3,x4,x5,x6 ; equations fo
Funcion Objetivo
eq1 restriccion para el turno 1 eq2 restriccion para el turno 2 eq3 restriccion para el turno 3 eq4 restriccion para el turno 4 eq5 restriccion para el turno 5 eq6 restriccion para el turno 6; fo..
z=e=x1+x2+x3+x4+x5+x6;
eq1.. x6+x1=g=10; eq2.. x1+x2=g=20; eq3.. x2+x3=g=80; eq4.. x3+x4=g=65; eq5.. x4+x5=g=55; eq6.. x5+x6=g=20;
model prog /all /all/; /; solve prog using MIP minimizing z;
Text 1: prog.gms Básicamente Básicamente lo que hacemos hacemos en este código es insertar el modelo extendido de acuerdo acuerdo al formato formato de GAMS, declarando nuestras variables libres, las positivas, el conjunto de ecuaciones la integración del modelo y se llama a resolver con programación entera mixta minimizando z minimizando z . GAMS nos arroja un archivo de salida con el mismo nombre que nuestra entrada pero con la extensión .lst, en esta nos detalla el proceso de solución y el valor de nuestras variables y restricciones.
S O L V E
S U M M A R Y
MODEL
prog
OBJECTIVE
z
TYPE
MIP
DIRECTION
MINIMIZE
SOLVER
CPLEX
FROM LINE
27
**** SOLVER STATUS
1 Normal Completion
**** MODEL STATUS
1 Optimal
**** OBJECTIVE VALUE
145.0000
RESOURCE USAGE, LIMIT
0.010
ITERATION COUNT, LIMIT
5
IBM ILOG CPLEX
1000.000 2000000000
May 24, 2010 23.4.3 LEX 17710.17719 LEI x86_64/Linux
Cplex 12.1.0, GAMS Link 34 LP status(1): optimal Optimal solution found. Objective :
145.000000
---- EQU fo
LOWER
LEVEL
UPPER
MARGINAL
.
.
.
1.0000 1.0000
---- EQU eq1
10.0000
10.0000
+INF
---- EQU eq2
20.0000
60.0000
+INF
---- EQU eq3
80.0000
80.0000
+INF
1.0000
---- EQU eq4
65.0000
65.0000
+INF
EPS
---- EQU eq5
55.0000
55.0000
+INF
1.0000
---- EQU eq6
20.0000
20.0000
+INF
EPS
LEVEL
UPPER
MARGINAL
fo
.
Funcion Objetivo
eq1
restriccion para el turno 1
eq2
restriccion para el turno 2
eq3
restriccion para el turno 3
eq4
restriccion para el turno 4
eq5
restriccion para el turno 5
eq6
restriccion para el turno 6 LOWER
---- VAR z
-INF
145.0000
+INF
.
---- VAR x1
.
10.0000
+INF
.
---- VAR x2
.
50.0000
+INF
.
---- VAR x3
.
30.0000
+INF
.
---- VAR x4
.
35.0000
+INF
.
---- VAR x5
.
20.0000
+INF
.
---- VAR x6
.
+INF
EPS
**** REPORT SUMMARY :
0
. NONOPT
0 INFEASIBLE 0
UNBOUNDED
EXECUTION TIME
=
0.001 SECONDS
2 Mb
LEX234-234 May 21, 2010
Text 2: prog.lst Como no se especificó que solver utilizará GAMS este elige a CPLEX por defecto y resuelve el problema mediante el método de ramificación y acotamiento. La solución la arroja en un tiempo de 0.001 segundos, dado que es un problema muy pequeño y fácil de resolver computacionalmente. Finalmente Finalmente debemos interpretar interpretar los resultados, resultados, la solución solución indica los trabajadores trabajadores que deberán deberán entrar entrar para cada turno, véase la tabla siguiente:
Turno
Demanda
Ingreso
Total de trabajadores
0 – 4 Horas
10
10
10
4 – 8 Horas
20
50
60
8 – 12 Horas
80
30
80
12 – 16 Horas
65
35
65
16 – 20 Horas
55
20
55
20 – 0 Horas
20
0
20
Table 2: Tabla de soluciones El total de trabajadores que tendremos será de 145 que es el optimo encontrado, encontrado, si nos damos cuenta no podemos ajustar al 100% los requerimientos dado que tendremos un exceso de trabajadores en el segundo horario, horario, esto es debido a que si quisiéramos quisiéramos ajustar ajustar perfectament perfectamentee el problema problema se vuelve infactible es decir, se quedaría corto el personal para el tercer turno y no se cumpliría con el mínimo.