Este documento describe un problema de planificación de proyectos para una consultoría con 6 departamentos. Se deben planificar 6 proyectos asignando horas de cada departamento a cada proyecto, contratando o despidiendo empleados, con el objetivo de maximizar los beneficios netos. Se modela como un problema de programación lineal entera-mixta y se resuelve usando AMPL y Gurobi, obteniendo la asignación óptima de horas por departamento y proyecto, así como el número de contrataciones y despidos en cada departamento.
1. Planificaci´on de una consultoria
Problema individual. Optimizaci´on
Laboratorio de Modelizaci´on
Grado en Matem´aticas
Adil Ziani
adil.ziani@um.es
27/02/2017
1
2. 1. 7.30 Planificaci´on de una consultoria
1.1. Enunciado
Una consultor´ıa que consta de 6 departamentos tiene que planificar c´omo acometer 6 proyec-
tos que tendr´a que ejecutar durante un a˜no. Los departamentos est´an jerarquizados, de modo
que el departamento 1 es el principal (y al que est´an destinados los empleados m´as preparados)
y el departamento 6 corresponde al nivel m´as bajo. Igualmente, los proyectos tambi´en tienen su
complejidad. En principio cada departamento deber´ıa ejecutar el proyecto de mismo ´ındice, pero
se permite, con cierto l´ımite, que los departamentos apoyen proyectos de menor complejidad,
aunque esto supone que sus empleados sean infrautilizados. En la siguiente tabla se resumen las
caracter´ısticas de cada proyecto y de cada departamento, as´ı como de la viabilidad de que cada
departamento participe en cada proyecto.
Donde,
C1: Salario base anual por empleado
2
3. C2: Salario empleado por hora
C3: Horas de trabajo anuales por empleado
C4: Coste de hora extra
C5: M´aximo de horas extra anuales por empleado
C6: N´umero de empleados actuales
C7: Coste fijo de contratar a un empleado adicional
C8: Coste fijo de despedir a un empleado actual
Obtener la pol´ıtica de contrataci´on de cada departamento y el n´umero de horas que cada de-
partamento asigna a cada proyecto con el objetivo de que el beneficio neto final sea m´aximo.
1.2. Respuesta
Tenemos una consoltor´ıa con 6 departamentos, que quiere llevar en marcha 6 proyectos
durante el pr´oximo a˜no y queremos ver que plantilla de empleados formar y que hace cada de-
partamento con el fin de tener un beneficio neto lo m´aximo posible, todo ello sujeto a algunas
restricciones que iremos viendo.
Lo que queremos decidir se refleja en las variables de decisi´on:
Xi,j = n´umero de horas que el departamento i dedica al proyecto j, (en horario laboral).
Yi,j = n´umero de horas extra que el departamento i dedica al proyecto j.
Ci = n´umero de empleados que se contratan para el departamento i.
Di = n´umero de empleados que se despiden del departamento i.
xi = n´umero de empleados que habr´a en departamento i.(variable auxiliar)
El objetivo es maximizar el beneficio neto de la consultor´ıa, si observamos la tabla anterior,
cada proyecto genera un ingreso por hora y cada hora requiere un salario(base m´as cada hora
trabajada) para el empleado, ademas de gastos de contrataci´on y despedida, datos que se reflejan
en la tabla. Entonces la funci´on objetivo corresponde a ingresos − costes:
j∈ proye i∈ depart
(V [i, j] ∗ Ingresos[j] ∗ (X[i, j] + Y [i, j]) − C2[i] ∗ X[i, j] − C4[i] ∗ Y [i, j]) −
i∈depart
(C7[i] ∗ C[i] + C8[i] ∗ D[i] + C1[i] ∗ x[i])
donde Vi,j = 1 si el departamento i puede realizar el proyecto j y 0 en caso contrario.
Ahora queda ver las restricciones.
3
4. Hay restricciones sobre el n´umero m´aximo de horas que se puede dedicar a cada proyecto,
esto es:
∀j ∈ proy,
i∈depart
X[i, j] + Y [i, j] MaxHorasProy[j]
Hay restricciones sobre el n´umero m´aximo de horas que puede trabajar un departamento,
esto es:
∀i ∈ depart,
j∈proy
X[i, j] C3[i] ∗ x[i]
Hay restricciones sobre n´umero de horas extra m´aximas que puede hacer cada empleado,
seg´un el departamento al que pertenece, esto es:
∀i ∈ depart,
j∈proy
Y [i, j] C5[i] ∗ x[i]
A˜nadimos una resticci´on que relaciona las variables C, D, x, pues los empleados que habr´a
en cada departamento son los que ya hab´ıa mas lo nuevos que se contraten menos los que
se despide, esto es:
∀i ∈ depart, x[i] = C6[i] + C[i] − D[i]
Y finalmente las restricciones de no negatividad de las variables, y la integridad en las
variables de contrataci´on y despedida.
Dicho problema de programaci´on lineal entera-mixta, lo hemos resuelto usando el el lenguaje
AMPL y solver GUROBI, y la soluci´on que devuelve es:
(a) N´umero horas que cada departamento dedica a cada pro-
yecto
(b) N´umero horas extra que cada departamento de-
dica a cada proyecto
4
5. (c) N´umero contrata-
dos en cada departa-
mento
(d) N´umero despedi-
dos de cada departa-
mento
Con un objetivo de 518300 unidades monetarias.
Observaci´on: Hemos supuesto que todos los empleados trabajan las mismas horas en cada de-
partamento al que pertenecen, y que por tanto se reparten el salario por hora equitativamente.
##################################################
En el anexo se incluye el c´odigo.
Anexo : C´odigo
Archivo .dat
data ;
set Proyectos := P1 P2 P3 P4 P5 P6 ;
set Departamentos := D1 D2 D3 D4 D5 D6;
param : Ingresos Maxhoras:=
P1 40 3500
P2 35 5800
P3 30 25000
P4 25 45000
P5 20 30000
P6 15 85000;
param V ( tr ) :
D1 D2 D3 D4 D5 D6:=
P1 1 0 0 0 0 0
P2 1 1 0 0 0 0
P3 1 1 1 0 0 0
P4 0 1 1 1 0 0
P5 0 0 1 1 1 0
P6 0 0 0 1 1 1;
5
6. param : C1 C2 C3 C4 C5 C6 C7 C8:=
D1 52000 18 1760 20 200 2 10000000 10000000
D2 41600 16 1760 18 200 3 10000000 10000000
D3 31200 14 1840 16 300 10 20000 6000
D4 20800 9 1880 15 500 15 10000 5000
D5 16640 8 1920 12 500 20 8000 4000
D6 12480 7 1920 9 500 35 6000 3000;
Archivo .mod
model ;
set Proyectos ;
set Departamentos ;
param Ingresos { Proyectos };
param Maxhoras { Proyectos };
param V {Departamentos , Proyectos };
param C1{Departamentos };
param C2{Departamentos };
param C3{Departamentos };
param C4{Departamentos };
param C5{Departamentos };
param C6{Departamentos };
param C7{Departamentos };
param C8{Departamentos };
var X{Departamentos , Proyectos } >=0, i n t e g e r ;
var C{Departamentos} >=0, i n t e g e r ;
var D{Departamentos} >=0, i n t e g e r ;
var x{Departamentos} >=0, i n t e g e r ;
var Y{Departamentos , Proyectos } >=0, i n t e g e r ;
maximize obj : sum{ j in Proyectos , i in Departamentos :V[ i , j ]==1}(( Ingresos [ j ] ) ∗(X[ i
, j ]+Y[ i , j ] ) − C2 [ i ]∗X[ i , j ]−C4 [ i ]∗Y[ i , j ] )−
sum{ i in Departamentos }(C7 [ i ]∗C[ i ] + C8 [ i ]∗D[ i ] + C1 [ i ]∗ x [ i ] ) ;
subject to MaxHorasProyectos{ j in Proyectos }: sum{ i in Departamentos : V[ i , j ]==1} (
X[ i , j ] + Y[ i , j ] ) <=Maxhoras [ j ] ;
subject to MaxHorasExtra{ i in Departamentos }: sum{ j in Proyectos : V[ i , j ]==1} Y[ i , j
] <=C5 [ i ]∗ x [ i ] ;
subject to MaxHorasDepartamento{ i in Departamentos }: sum{ j in Proyectos : V[ i , j
]==1} X[ i , j ] <= C3 [ i ]∗ x [ i ] ;
subject to FlujoContratacion { i in Departamentos }: x [ i ] = C6 [ i ]+C[ i ]−D[ i ] ;
6