Sunteți pe pagina 1din 5

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 cada trabajador puede cubrir 2 turnos dado que su 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 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 la función objetivo se definirá como la suma de todos los trabajadores que ingresan en cada
turno
6
Minimizar z =∑ x i
i=1

y cada restricción se formará tomando en cuenta los requerimientos de la demanda de 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 nuestro modelo completo de la siguiente manera


6
Minimizar z =∑ x 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 computadora, en este caso usaremos
GAMS(General Algebraic Modeling System) como sistema de modelado y el código es el siguiente.

variables
z;

positive variables
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/;

solve prog using MIP minimizing z;

Text 1: prog.gms

Básicamente lo que hacemos en este código es insertar el modelo extendido de acuerdo al 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.

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 1000.000


ITERATION COUNT, LIMIT 5 2000000000

IBM ILOG CPLEX 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

LOWER LEVEL UPPER MARGINAL

---- EQU fo . . . 1.0000


---- EQU eq1 10.0000 10.0000 +INF 1.0000
---- 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

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 LEVEL UPPER MARGINAL

---- 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 debemos interpretar los resultados, la solución indica los trabajadores que deberán 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, si nos damos cuenta
no podemos ajustar al 100% los requerimientos dado que tendremos un exceso de trabajadores en el
segundo horario, esto es debido a que si quisiéramos ajustar perfectamente el 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.

S-ar putea să vă placă și