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