Programación Matemática para Economistas
3.- Problemas de asignación.
Supongamos que hemos de asignar n personas a n tareas y que ninguna de ellas
puede atender más de una tarea a la vez. El coste de asignar la persona i a la tarea j viene
dado por cij. Se desea determinar la asignación de personas a tareas de manera que se
minimice el coste de dicha asignación.
Sea xij variable de decisión del problema. Esta variable tomará el valor 1 si el agente
i es asignado a la tarea j y 0 en caso contrario. Además, dado que a cada agente sólo se le
puede asignar una tarea y viceversa, se cumple:
n
n
i =1
j =1
∑ xij = 1; ∑ xij = 1 i , j = 1, 2,, ...,n
Por tanto, el problema a resolver es:
n
Min
n
∑∑c
i = 1 j =1
n
s. a
∑x
i =1
ij
n
∑x
j =1
ij
ij
x ij
=1
j = 1, 2, ..., n
= 1 i = 1, 2, ..., n
xij ∈ {0, 1 }
i , j = 1, 2, ..., n
Este problema es un caso particular del problema de transporte en el que ei = di = 1.
Para su resolución existen, sin embargo, algoritmos de resolución propios. Entre ellos está el
método húngaro, en el que se siguen los siguientes pasos:
Paso 1:
a) Elegimos el elemento más pequeño de cada columna (fila) y lo restamos a
todos los elementos de la misma.
b) En la matriz resultante elegimos el más pequeño de cada fila (columna) y lo
restamos al resto de elementos de la misma.
De esta forma, se obtiene una matriz con, al menos un elemento igual a cero en cada
fila y en cada columna.
Paso 2:
En la matriz resultante, elegir la fila con menos ceros. Encuadrar uno de ellos y
tachar todos los ceros pertenecientes a la fila y la columna del cero encuadrado.
R. Caballero, T. Gómez, M. González, M. Hernández, F. Miguel, J. Molina, M.M. Muñoz, L. Rey, F. Ruiz
Programación Matemática para Economistas
Hacer lo mismo para el resto de filas y columnas de la matriz.
Si cada fila o columna tiene un cero enmarcado, ya se tiene la solución óptima al
problema, que corresponde a la asignación de tareas a agentes que indiquen los ceros
enmarcados.
Paso 3:
a) Marcar (*) las filas que no tengan ningún cero enmarcado.
b) En la fila marcada, marcar las columnas correspondientes a los ceros
tachados en esa fila.
c) Para las columnas marcadas, marcar las filas correspondientes a ceros
encuadrados en las mismas.
d) Repetir b) y c) hasta que no se puedan marcar ninguna fila o columna.
Paso 4:
Tachar las filas no marcadas y las columnas marcadas. De la matriz que queda,
elegir el elemento más pequeño. Restar ese elemento a los de las columnas no tachadas y
sumarlo a los de las filas tachadas, sin modificar el resto de elementos de la matriz. Ir al
paso 2.
Ejemplo:
Una empresa se dedica a la producción y distribución de un bien. Dispone de un
almacén y cinco tiendas de venta al público. Diariamente debe abastecer de mercancía a
cada una de las tiendas. Para llevar a cabo la distribución tiene contratados los servicios de
cinco empresas de transporte que pueden abastecer una tienda al día. El coste diario del
abastecimiento a cada tienda viene dado por la siguiente tabla (en miles de unidades
monetarias):
Empresa 1
Empresa 2
Empresa 3
Empresa 4
Empresa 5
Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
8
6
5
12
5
9
3
7
6
3
15
2
7
3
4
8
9
8
7
6
3
9
6
3
4
Se desea saber qué asignación de empresas a tiendas es la que minimiza el coste total
de reparto.
R. Caballero, T. Gómez, M. González, M. Hernández, F. Miguel, J. Molina, M.M. Muñoz, L. Rey, F. Ruiz
Programación Matemática para Economistas
Solución:
Trabajaremos con una tabla que recoge, por filas, los costes de asignación de cada
agente a cada una de las tareas:
8
9
15
8
3
6
3
2
9
9
5
7
7
8
6
12
6
3
7
3
5
3
4
6
4
Restamos, por filas, a cada elemento el más pequeño de ellos.
3
6
13
2
0
1
0
0
3
6
0
4
5
2
3
7
3
1
1
0
0
0
2
0
1
Restamos, en cada columna, el elemento más pequeño de la misma:
3
6
13
2
0
1
0
0
3
6
0
4
5
2
3
7
3
1
1
0
0
0
2
0
1
Obtenemos la misma tabla que antes, dado que en la tabla anterior teníamos un cero
en cada fila. Enmarcamos los ceros:
3
6
13
2
[0]
1
0
[0]
3
6
[0]
4
5
2
3
7
3
1
1
0
0
0
2
[0]
1
Marcamos la fila 2 dado que no tiene ningún cero enmarcado, las columnas 2 y 5 por
tener ceros tachados en la fila 2 y las filas 3 y 4 puesto que tienen ceros enmarcados en las
R. Caballero, T. Gómez, M. González, M. Hernández, F. Miguel, J. Molina, M.M. Muñoz, L. Rey, F. Ruiz
Programación Matemática para Economistas
columnas 2 y 5, respectivamente. Tachamos las filas 1 y 5 (no marcadas) y las columnas 2 y
5 (marcadas):
3
6
13
2
[0]
4
5
2
3
1
0
[0]
3
6
*
[0]
7
3
1
1
0
0
0
2
*
*
*
[0]
1
*
El elemento más pequeño de la tabla resultante es 1, valor que hemos de restar a los
elementos de las columnas no tachadas y lo sumamos a las filas tachadas. El resto de
elementos mantienen sus valores. La tabla resultante es:
3
5
12
1
[0]
2
[0]
0
3
7
[0]
3
4
1
3
7
2
[0]
0
0
1
0
2
[0]
2
en la que tenemos un cero encuadrado en cada fila. Hemos llegado a la solución óptima, que
asigna: la tienda 1 a la empresa 5, la tienda 2 a la empresa 2, la empresa 1 a la tienda 3, la
tienda 4 para la empresa 3 y la tienda 5 a la empresa 4.
R. Caballero, T. Gómez, M. González, M. Hernández, F. Miguel, J. Molina, M.M. Muñoz, L. Rey, F. Ruiz