Planteamiento del problemaalgoritmo de programación de citas (N personas con N ranuras libres-ocupado, de satisfacción de restricciones)
Tenemos un empleador que quiere entrevistar N personas, y por lo tanto hace que N intervalos de entrevista. Cada persona tiene un horario libre para esas máquinas tragamonedas. Proporcione un algoritmo que planifique las N personas en N ranuras, si es posible, y devuelva una bandera/error/etc., si es imposible. ¿Cuál es la complejidad de tiempo de ejecución más rápida posible?
Mis enfoques hasta ahora
Naive: hay N! formas de programar N personas. Examine todos ellos, para cada permutación, verifique si es factible. O (n!)
Backtracking:
- Busque cualquier ranuras de tiempo de la entrevista que sólo puede tener 1 persona. Programe la persona, quítelos de la lista de candidatos y elimine la ranura.
- Busque cualquier candidato que solo entre en 1 casilla. Programe la persona, quítelos de la lista de candidatos y elimine la ranura.
- Repite 1 & 2 hasta que no haya más combinaciones como esa.
- Elija una persona, planifíquelas al azar en una de sus ranuras disponibles. Recuerde esta operación.
- Repite 1, 2, 3 hasta que tengamos un cronograma o hay un conflicto no resuelto. Si tenemos un horario, devuélvalo. Si hay un conflicto irresoluble, retroceda.
Este es el O (n!) Peor caso, creo - que no es mejor.
Puede haber un D.P. solución también, pero aún no lo veo.
Otros pensamientos
El problema se puede representar en una matriz NxN, donde las filas son "slots", las columnas son "personas", y los valores son "1" de forma gratuita y "0" para ocupado. Luego, estamos buscando una matriz de identidad intercambiada por filas y columnas dentro de esta matriz. Los pasos 1 & 2 están buscando una fila o una columna con solo un "1". (Si el rango de la matriz es = N, I eso significa que hay una solución. Pero no ocurre lo contrario) Otra forma de verlo es tratar la matriz como una matriz de borde grafica sin peso. Entonces, los nodos representan cada uno 1 candidato y 1 espacio. Estamos buscando un conjunto de bordes para que cada nodo en el gráfico tenga un borde saliente y un borde entrante. O bien, con 2 nodos, sería un gráfico bipartito.
Ejemplo de una matriz:
1 1 1 1
0 1 1 0
1 0 0 1
1 0 0 1
Este es no problema determinista que no tiene solución en tiempo polinomial. Podría probar el algoritmo codicioso pero no calcula toda la combinación. – Ankit