No soy un teórico de la informática, pero creo que este problema del mundo real pertenece aquí.
El problema
Mi compañía tiene varias unidades en todo el país.
Ofrecimos a los empleados la posibilidad de trabajar en otra unidad. Pero hay una condición: el número total de trabajadores en una unidad no puede cambiar.
Eso significa: permitiremos que un empleado abandone su unidad si alguien quiere su lugar.
Ejemplo de datos de solicitud (ficticios):
Name Origin Destination
Maria 1 -> 2
Marcos 2 -> 3
Jones 3 -> 4
Terry 4 -> 5
Joe 5 -> 6
Rodrigo 6 -> 1
Barbara 6 -> 1
Marylin 1 -> 4
Brown 4 -> 6
Benjamin 1 -> 3
Lucas 4 -> 1
Lo anterior, trazado:
¿Ves cómo tenemos que elegir entre las opciones rojo, azul o negro?
El verdadero problema es un poco más complejo, porque tenemos 27 unidades y 751 solicitudes. Por favor, eche un vistazo a la visualización
La meta
Habiendo recogido todas las solicitudes, ¿cómo satisfacer la mayoría de ellas?
Aplicación de la teoría (?)
Teniendo el gráfico , deje que cada unidad sea un vértice V y una solicitud sea un borde dirigido E , un intercambio exitoso tomará la forma de un ciclo dirigido.
Cada ciclo debe usar solo una vez ( un trabajador no puede abandonar su unidad dos veces ), pero puede visitar V varias veces ( una unidad puede tener muchos trabajadores que quieran irse ).
La pregunta
Si este problema se expresa como
"¿Cómo encontrar los ciclos que, juntos, involucran el mayor número de aristas no compartidas en un gráfico dirigido"?
¿Satisfaceremos a la mayoría de los solicitantes?
Siendo cierto, ¿hay un algoritmo para encontrar ese conjunto óptimo de ciclos?
¿Este enfoque de greddy resolverá el problema?
- Encuentra el ciclo dirigido más grande en ;
- Quite sus bordes de ;
- Repita 1 hasta que no haya un ciclo dirigido en ;
¿Me puedes ayudar?
¿Conoces otra forma de describir el problema original (haciendo felices a la mayoría de los solicitantes)?
Editar : se cambió el departamento a la unidad, para describir mejor el problema.
Respuestas:
OK, leí el código de TradeMaximizer y creo que resuelve el siguiente problema más general.
Solución:
Encuentre una coincidencia perfecta de costo mínimo en el gráfico bipartito.
(De hecho, TradeMaximizer itera sobre todas las soluciones óptimas, de acuerdo con los dos criterios anteriores, para optimizar heurísticamente otras cosas, como la duración del ciclo más grande. Los ciclos grandes aumentan la posibilidad de que un "acuerdo" no funcione porque uno la persona cambia de opinión.)
PD: El autor, Chris Okasaki, confirmó que esto es lo que hace el código, en la publicación del blog .
fuente
Debido a que todos los costos y capacidades están limitados por constantes, un simple algoritmo de cancelación de ciclo encontrará la circulación requerida en el tiempo polinómico. Esto es casi lo mismo que el algoritmo codicioso obvio:
Este no es el algoritmo más rápido conocido.
fuente
Este enfoque codicioso no siempre dará la mejor solución.
fuente
Probablemente haya una forma / formulación de la teoría de grafos para resolver esto, pero este problema me suena más como un problema de permutación donde algunas de las permutaciones son rechazadas y otras son válidas. las permutaciones son empleados y los puestos son "puestos" en la empresa. una permutación se rechaza si no cumple con los requisitos de "persona [x] quiere posición [y]". La distinción de unidades / departamentos / límites de la organización es aparentemente algo superflua para la solución en este caso.
Este tipo de problema de permutación con restricciones se puede convertir fácilmente en una instancia de problema SAT (satisfacción). las asignaciones de variables booleanas representan empleados, y las cláusulas de restricción representan las restricciones de "persona [x] quiere posición [y]". hay ejemplos clásicos cercanos de esto, uno generalmente llamado el problema de la "mesa de la cena" en el que tiene asientos e invitados y no todos los invitados quieren sentarse uno al lado del otro (o de manera muy similar, algunos invitados quieren sentarse al lado de otros invitados).
y, por supuesto, hay solucionadores de SAT sofisticados para instancias bastante grandes que involucran aproximadamente hasta cientos de variables y cláusulas, en PC, y si el problema no es "difícil", en miles.
ver, por ejemplo, [1] para una referencia profesional y [2] para un ejercicio de clase. También hay cierta similitud estructural con lo que se conoce como "problemas de casilleros", que se estudian bien en los círculos SAT, donde las palomas se asignan a los casilleros y usted tiene más o menos agujeros que las palomas. en ese caso, sin embargo, las palomas generalmente se consideran intercambiables. en otras palabras, el problema de la mesa de la cena es como el problema del palomar con restricciones más fuertes y los invitados / palomas tienen las preferencias requeridas.
tenga en cuenta que, por supuesto, tenga en cuenta que para este tipo de problemas, dependiendo de las restricciones, la respuesta puede ser "no existe tal solución limitada".
[1] el algoritmo de la mesa, por crato
[2] CS402 princeton HW SAT
[3] Problema de satisfacción, wikipedia
fuente