2011-05-24 20 views
10

¿Algún algoritmo de optimización/clasificación de habitaciones bien conocido para hoteles?Algoritmo de optimización/clasificación de habitaciones de hotel

El problema es redistribuir las habitaciones para maximizar la ocupación. Digamos que tengo 10 habitaciones, fecha de inicio y fecha de finalización para cada reserva. Algunas salas no pueden asignarse mientras que otras pueden (marcar).

Cualquier sugerencia en la dirección correcta sería genial. Gracias.

+0

¿Está bien poner varias reservas en una habitación para aumentar la utilización? –

+0

@Anders, no lo creo :) – JohnIdol

Respuesta

1

¿Desea buscar Drools-Planer: http://www.jboss.org/drools.

+0

Básicamente es el problema * pas * en Drools Planner. En lugar de "camas" de hospital, tienes 'habitaciones'. Y en lugar de 'PatientAdmissions', tienes' GuestReservations'. Solo copie y péguelo. –

+0

Gracias. Voy a verificar esto también. – synclabs

7

Si usted tiene un conjunto de reservas y un número fijo de habitaciones, entonces la pregunta no es cómo maximizar la utilización sino para verificar si las reservas pueden ser efectivamente realizadas en absoluto o no. La utilización obviamente sigue siendo la misma si todas las reservas se realizan.

Otro posible caso de uso es que tiene un conjunto de reservas que usted sabe que se pueden realizar, y luego intenta insertar una nueva reserva, es decir, un nuevo cliente desea hacer una nueva reserva y desea verificar si es posible que reubique algunas de las reservas para crear espacio para la nueva.

En ambos casos, la pregunta real es cómo comprobar si se puede realizar un determinado conjunto de reservas.

Para las reservas inamovibles esto es trivial, por lo que asume que se pueden realizar y que desea comprobar si las reservas reubicables se pueden realizar también.

El primer control es calcular por cada noche el número de reservas por esa noche; si en alguna noche el número de reservas excede el número de habitaciones disponibles una vez que se tienen en cuenta las reservas fijas, no se pueden realizar las reservas mediante ningún truco; su hotel está sobrevendido para esa noche.

lo contrario se puede entonces utilizar un algoritmo voraz a intento una solución: proceso de las reservas en el orden de sus fechas de inicio y reservar cada reserva a una primera habitación (por ejemplo, con el fin sala numérica) que está disponible. Si esto le da una solución, entonces se ha dado cuenta de las reservas y listo.

Si eso no funciona, entonces puede usar GRAPH COLORING para resolver el problema, y ​​esta es la solución universal. Construya un gráfico donde cada reserva es un nodo y dos nodos (reservas) están conectados solo si se solapan en el tiempo. Incluir las reservas fijas (no reubicables) en el gráfico. Luego, intente hacer una coloración completa del gráfico con N colores (N = número total de habitaciones en su hotel) una vez que haya precoloreado las reservas fijas con los números de las habitaciones a las que pertenecen.

Puede gestionar también reservas solo parcialmente flexibles de esta manera, agregando un enlace desde la reserva r a un nodo especial precoloreado para la sala n si y solo si la reserva NO se puede realizar en la sala n (p. Ej.)

Este mismo algoritmo de coloreo gráfico se usa con éxito, p. en compiladores para la asignación de registros.

Por supuesto, la pregunta es cómo implementar la coloración gráfica de manera eficiente; para eso hay implementaciones ya hechas.

¡Buena suerte!

+0

En este momento, el sistema está utilizando solo un algoritmo codicioso. Implementaré un nuevo algoritmo con coloreado gráfico. Gracias. – synclabs

+0

Hola. Intento resolver el mismo problema, y ​​me pregunto: ¿en qué casos el algoritmo codicioso (como se describió anteriormente en la respuesta) no funciona? Estoy probando algunos escenarios pero no puedo encontrar un ejemplo en el que no funcione ... ¡Gracias! – YuviDroid

+1

@YuviDroid, digamos que tiene dos salas R1 y R2 y consideramos cinco días 1-5 (puede pensar en ellos desde el 1 de enero al 5 de enero). Usted tiene una reserva de habitación fija para los días 3-5 para la habitación R2, y luego tiene dos reservas reubicables, # 1 para los días 1-2 y # 2 para los días 1-5. Si un algoritmo codicioso corrige la reserva # 1 a la habitación R1, la reserva R2 ya no se puede realizar, aunque hay una solución donde # 2 va a R1 y # 1 a R2. –

1

Retroceder funciona bastante bien para tales problemas, en mi experiencia.Solo comience asignando la primera reserva a un tipo de habitación. Continúe asignando reservas hasta que uno quede sin asignar. Luego retroceda donde cometió un error y cambie las decisiones anteriores en consecuencia.

De esta forma, encontrará una/todas las soluciones posibles, o probará que no existen.

La ventaja es que puede probar la inviabilidad. Además, retroceder le permite encontrar la "causa" de la inviabilidad.

Véase p. http://en.wikipedia.org/wiki/Backtracking

+0

Gracias. Lo comprobaré también. – synclabs

1

Es posible modelar el problema con programación matemática o programar restricción, usando el de las muchas herramientas listas disponible (pruebe CPLEX o Gurobi para MP y GECODE o cp optimizador para CP, solo para nombrar algunos) para modelar y resolver estas clases de problemas. Por lo general, tienen API que se pueden llamar desde la mayoría de los lenguajes de programación.

supongo que esta respuesta llega después de un tiempo muy largo, pero espero que todavía puede ayudar a alguien más :-)