Antecedentes:
Hay alrededor de 60 estudiantes en el internado para el que trabajo. El consejero nos pidió a mi colega y a mí que ideáramos una mejor manera de preparar los asientos para la cena que a mano. Le gustaría tareas para el resto del año escolar. También nos pidió que intentemos resolver algunos de los problemas sobre los que ha tenido noticias de estudiantes y profesores.
Restricciones:
- La mayoría de los estudiantes no son de los EE. UU., Por lo tanto, cuando están rodeados de personas de la misma nacionalidad (es decir, en la mesa), hablan el idioma en el que hablan con fluidez, en lugar de practicar inglés,
- Las quejas se hacen cuando los estudiantes se han sentado en una mesa determinada "demasiadas" veces en general,
- o si se sientan en la misma mesa más de dos veces seguidas,
- y algunos de los estudiantes no se llevan bien, por lo que no pueden sentarse juntos.
Entrada:
En tiempo de ejecución, el programa se suministra con:
- Un conjunto de personas,
- Un conjunto de mesas, y
- Cada mesa tiene un número diferente de asientos (se permite la repetición)
El tamaño de ambos conjuntos y el tamaño de cada tabla no cambian entre cada asignación.
Pruebas:
Estoy usando 18 personas de diferentes nacionalidades y 4 mesas de tamaño 3 a 6, inclusive. Elegí números que pensé que tenían sentido para ese conjunto de datos:
- No más de 3 personas de la misma nacionalidad pueden sentarse juntas a la vez
- Ninguna persona puede sentarse en una mesa más de 4 veces.
Resultados:
Ejecuté el generador unas 15 veces sin cambiar los datos de entrada. Cada vez, viene con entre 6 y 12 "semanas" de tareas.
Preguntas:
(de menor a mayor importancia)
- ¿Por qué obtengo un número diferente de asignaciones generadas cada vez que ejecuto el programa? El conjunto de datos no cambia entre ejecuciones.
- ¿Cómo encuentro el ...
- número mínimo de personas de la misma nacionalidad que pueden sentarse en una mesa determinada,
- cantidad mínima de veces en general que se sientan en una mesa determinada, todo mientras
- maximizando el número de asignaciones generadas?
- ¿Cómo garantizo que estos son realmente los números correctos?
Editar:
Cada vez que genero una nueva asignación, llamo Collections.shuffle(List)
a la lista de personas para aleatorizar su orden. Luego paso la lista de tablas y personas a un método de seguimiento basado en la implementación de ocho reinas de kapilid en github para asignar personas a las tablas.
fuente
Respuestas:
Actualizar:
Me di cuenta de que no respondía directamente a tus preguntas. Supongo que ayuda leer todas las preguntas antes de disparar una respuesta ...
No especifica qué algoritmo está utilizando para generar los arreglos de asientos. Presumiblemente, hay algún elemento de variabilidad / aleatoriedad para crear diferentes asignaciones para la duración del término. Es probable que esa aleatoriedad sea la razón por la que obtiene resultados diferentes en cada ejecución. Lo marcaría como en
working as designed
lugar de un error.a. No especificas el algoritmo, por lo que realmente no lo sabemos. Tampoco sabemos los recuentos de cada nacionalidad. Por lógica simple, 0 o 1 sería el mínimo absoluto en una tabla, pero sospecho que no es muy útil para usted. En última instancia, depende del número de cada nacionalidad y cómo pueblan las otras tablas.
si. Ejecute su programa, arroje los resultados en una base de datos u hoja de cálculo y haga que cuente por usted. O modifique el programa para realizar un seguimiento de esas cosas.
C. La respuesta aquí dependerá de la cantidad de cada nacionalidad y de las otras restricciones que haya proporcionado. El tamaño de la tabla también lo afectará. La respuesta a esta porción es realmente solo una multiplicación del número de permutaciones potenciales. Afortunadamente (para mí) este es un sitio sobre programación, no sobre estadísticas.
Tienes dos problemas con los que lidiar aquí. Primero es validar que sus restricciones reflejan con precisión la realidad de la situación. Hable con el consejero para verificar que sus limitaciones sean correctas. El segundo es verificar que sus resultados cumplan sus limitaciones. Escriba algunos métodos que verifiquen las tablas de asientos devueltas para las restricciones que proporcionó. Y / o inspeccione manualmente los gráficos para verificar que estén bien.
Esta pregunta SO tiene una pregunta similar y sugiere que esto es equivalente al problema del embalaje del contenedor o el problema de la mochila
Los invitados de SO Question Seat basados en parámetros priorizados parecen abordar exactamente lo que está buscando.
Esta pregunta SO analiza los problemas que el autor tuvo para resolver este problema utilizando el algoritmo bin-pack Sugeriría leer las respuestas para obtener una mejor idea de cómo solucionarlas .
Y para la referencia obligatoria de xkcd, aquí hay un enlace de sus foros sobre la optimización del plan de asientos y el uso de un algoritmo genético modificado para resolver el problema.
Si este es un escenario real, la mejor de las suertes. Y si esto es solo tarea, entonces tienes material más que suficiente para avanzar.
fuente