2009-01-09 10 views
5

Un número de estudiantes quiere entrar en secciones para una clase, algunos ya están registrados en una sección pero quieren cambiar la sección, para que todos entren en la lista de espera. Un estudiante puede ingresar a una nueva sección solo si alguien abandona esa sección. Ningún alumno está dispuesto a dejar una sección en la que ya se encuentra, a menos que pueda estar seguro de ingresar en la sección que está esperando. La lista de espera para cada sección se entrega primero en primer lugar.El problema de las "Listas de espera"

Obtenga tantos estudiantes en las secciones que desee como pueda.

El problema establecido puede pasar rápidamente a un escenario de bloqueo. Mi pregunta es; ¿hay soluciones conocidas para este problema?


Una solución trivial sería tomar cada sección a su vez y forzar el primer estudiante de la lista de espera en la sección a continuación, compruebe si alguien terminan abandonando cuando las cosas se resuelven (O (n) o más en el número de sección). Esto funcionaría para algunos casos, pero creo que podría haber mejores opciones que impliquen forzar a más de un estudiante a una sección (O (n) o más en el recuento de estudiantes) y/u operar en más de una sección a la vez (O (malo) :-)

+0

Haha O (malo) <- encantador. –

+0

Marcado como 'tarea'. Puede que esta no sea tu tarea, pero podría ser la de alguien en algún momento, ya que tuve esta misma pregunta en la universidad hace unos años. –

+0

cambiado a no-mi-tarea para reflejar mejor la realidad – BCS

Respuesta

2

Bueno, esto solo se reduce a encontrar ciclos en el gráfico dirigido de las clases ¿no? cada enlace es un estudiante que quiere ir de un nodo a otro, y cada vez que encuentras un ciclo, lo borras, porque esos estudiantes pueden resolver sus necesidades entre ellos. Has terminado cuando estás fuera de ciclos.

+0

No exactamente debido al requisito de que un alumno ingrese en una nueva clase si abandona una anterior y el aspecto de cola de la lista de espera. ¿Dónde debe el punto de borde de/second/person en la lista? – BCS

+0

oh sí, leí la pregunta demasiado rápido. oh segundo pensamiento, probablemente no lo entiendo. ¿Por qué no puedes simplemente abandonar el ciclo, a menos que estés diciendo que "abandonar un ciclo requiere que el primer cuentagotas esté en un limbo sin clase hasta que se resuelva el ciclo, y esa no es una opción"? – Jimmy

+0

El problema es que los ciclos son muy grandes y cada estudiante debe aparecer dos veces en el ciclo. Si x, y, y z quieren intercambiar, solo puede hacerlo si x, y, y z son los primeros en la lista de espera. Si a está antes de y en la lista 2, debe mover ao encontrar un bucle que incluya x, y, z y a. – jmucchiello

1

Esto es en realidad un problema de gráfico. Puede pensar en cada una de estas dependencias de lista de espera como bordes en un gráfico dirigido. Si este gráfico tiene un ciclo, entonces tiene una de las situaciones que describió. Una vez que haya identificado un ciclo, puede elegir cualquier punto para "romper" el ciclo "sobreabasteciendo" una de las clases, y sabrá que las cosas se resolverán correctamente porque había un ciclo en el gráfico.

+0

Ver mi comentario a Jimmy – BCS

2

Ok, vamos a intentarlo. Tenemos 8 estudiantes (1..8) y 4 secciones. Cada estudiante está en una sección y cada sección tiene espacio para 2 estudiantes. La mayoría de los estudiantes quieren cambiar pero no todos.

En la tabla a continuación, vemos a los estudiantes su sección actual, su sección requerida y la posición en la cola (si la hay).

+------+-----+-----+-----+ 
| stud | now | req | que | 
+------+-----+-----+-----+ 
| 1 | A | D | 2 | 
| 2 | A | D | 1 | 
| 3 | B | B | - | 
| 4 | B | A | 2 | 
| 5 | C | A | 1 | 
| 6 | C | C | - | 
| 7 | D | C | 1 | 
| 8 | D | B | 1 | 
+------+-----+-----+-----+ 

Podemos presentar esta información en un gráfico:

+-----+   +-----+   +-----+ 
| C |---[5]--->1| A |2<---[4]---| B | 
+-----+   +-----+   +-----+ 
    1    | |    1 
^    | |    ^
    |    [1] [2]    | 
    |    | |    | 
    [7]    | |    [8] 
    |    V V    | 
    |    2 1    | 
    |    +-----+    | 
    \--------------| D |--------------/ 
        +-----+ 

tratamos de encontrar una sección con una vacante, pero no encontramos ninguna. Entonces, como todas las secciones están llenas, necesitamos un truco sucio. Así que vamos a tomar una sección aleatoria con una cola no vacía. En este caso, la sección A y supongamos que tiene una posición extra. Esto significa que el estudiante 5 puede ingresar a la sección A, dejando una vacante en la sección C que toma el estudiante 7. Esto deja una vacante en la sección D que toma el estudiante 2. Ahora tenemos una vacante en la sección A. Pero supusimos que esa sección A tiene una posición extra, por lo que podemos eliminar esta suposición y obtener un gráfico más simple.

Si la ruta nunca volvió a la sección A, deshaga los movimientos y marque A como punto de inicio no válido. Vuelve a intentar con otra sección. Si no quedan secciones válidas, hemos terminado.

En este momento tenemos la siguiente situación:

+-----+   +-----+   +-----+ 
| C |   | A |1<---[4]---| B | 
+-----+   +-----+   +-----+ 
        |     1 
        |     ^
        [1]     | 
        |     | 
        |     [8] 
        V     | 
        1     | 
        +-----+    | 
        | D |--------------/ 
        +-----+ 

Repetimos el truco con otra sección al azar, y esto resuelve el gráfico.

Si comienza con varios estudiantes actualmente no asignados, agrega una sección ficticia adicional como punto de partida. Por supuesto, esto significa que debe haber vacantes en cualquier sección o que el problema no se puede resolver.

Tenga en cuenta que debido al orden en la cola, es posible que no haya solución.

+0

Buena respuesta. pero todavía no estoy seguro de que siempre funcione. Para mostrar que es más probable que se muestre que si existe alguna solución, entonces puede reducir el problema agregando UN alumno a alguna sección. Es posible que pueda encontrar un caso donde obtener la reducción de hormigas que necesita forzar en 2 o más estudiantes. – BCS

+0

Puedo imaginar que hay situaciones que solo pueden resolverse reorganizando las colas. El objetivo es maximizar la felicidad colectiva, no la felicidad individual, por lo que el orden de cola puede ignorarse si no hay otras soluciones. –

+0

Si la cola se interpreta como bordes pesados, entonces el problema se puede convertir en encontrar el menor peso por ciclo de borde y girarlo. OTOH puedes construir un caso en el que encuentre una solución que mueva la cantidad ideal de personas pero salte la cola y no me puedo convencer de que tampoco será menos que ideal en algunos casos. – BCS

Cuestiones relacionadas