【问题标题】:Hotel room optimization/sorting algorithm酒店房间优化/排序算法
【发布时间】:2011-09-01 03:15:15
【问题描述】:

有没有众所周知的酒店房间优化/排序算法?

问题是重新分配房间以最大限度地提高入住率。假设我有 10 间客房,每次预订的开始日期和结束日期。有些房间不能重新分配,而其他房间可以(标记)。

任何关于正确方向的提示都会很棒。谢谢。

【问题讨论】:

  • 是否可以将多个预订放在一个房间中以提高利用率?

标签: algorithm genetic-algorithm mathematical-optimization


【解决方案1】:

您要搜索 Drools-Planer:http://www.jboss.org/drools

【讨论】:

  • 这基本上是 Drools Planner 中的 pas 问题。而不是医院Beds 你得到了Rooms。而不是PatientAdmissions,你有GuestReservations。复制粘贴即可。
  • 谢谢。我也会检查一下。
【解决方案2】:

如果您有一组预订和固定数量的房间,那么问题不是如何最大限度地提高利用率,而是验证预订是否可以真正实现。如果所有预留都实现,利用率显然保持不变。

另一个可能的用例是您有一组您知道可以实现的预订,然后您尝试适应新的预订,即新客户想要进行新的预订并且您想检查您是否可以重新定位一些预订,为新预订腾出空间。

在这两种情况下,实际的问题是如何检查是否可以实现一组给定的保留。

对于不可重定位的保留,这是微不足道的,因此假设它们可以实现并且您想检查可重定位的保留是否也可以实现。

第一个检查是计算每晚每晚的预订数量;如果任何一晚的预订数量超过了可用房间数量,一旦计入固定预订,您将无法通过任何手段实现预订;当晚您的酒店超额预订。

否则,您可以使用贪心算法尝试解决方案:按预订开始日期的顺序处理预订,并将每个预订预订到第一个可用的房间(例如按房间数字顺序) .如果这给了你一个解决方案,那么你已经意识到了保留并且你已经完成了。

如果这不起作用,那么您可以使用 GRAPH COLORING 来解决问题,这就是通用的解决方案。构建一个图,其中每个预留都是一个节点,两个节点(预留)连接当且仅当它们在时间上重叠。 包括图表中的固定(不可重定位)预留。然后尝试使用 N 种颜色(N = 您酒店中的房间总数)对图表进行完整的着色,一旦您使用与它们相关的房间号对固定预订进行预着色。

您也可以以这种方式仅处理部分灵活的预订,当且仅当无法在房间 n 中实现预订(例如较低的房间等级)时,添加从预订 r 到房间 n 的特殊 n 预着色节点的链接.

成功地使用了相同的图形着色算法,例如在编译器中用于寄存器分配。

当然,问题是如何有效地实现图形着色;为此有现成的实现。

祝你好运!

【讨论】:

  • 目前,系统仅使用贪心算法。我将使用图形着色实现新算法。谢谢。
  • 嘿。我正在尝试解决同样的问题,我想知道:在哪些情况下贪心算法(如上面的答案所述)不起作用?我正在尝试一些场景,但找不到不起作用的示例。谢谢!
  • @YuviDroid,假设您有两个房间 R1 和 R2,我们考虑第 1-5 天(您可以将它们视为 1 月 1 日至 1 月 5 日)。房间 R2 有一个第 3-5 天的固定房间预订,然后您有两个可重新定位的预订,#1 用于第 1-2 天,#2 用于第 1-5 天。如果贪心算法将预订 #1 固定到房间 R1,则预订 R2 将无法再实现,即使存在 #2 到 R1 和 #1 到 R2 的解决方案。
  • @antti.huima 哦,我明白了,谢谢!我没有考虑固定房间预订。只有可重定位的预订,您仍然可以设法打破贪心算法吗?
  • @YuviDroid 如果所有预订都是完全可重定位的,即所有房间都被认为是相等的并且彼此“同构”,那么贪心算法总是实现一个解决方案(如果存在)。只需确保您首先按照最早开始日期的顺序映射预订,否则您可能会遇到我上面提到的相同问题,除了“不可重新定位”房间现在改为已映射到房间的预订顺序。
【解决方案3】:

根据我的经验,回溯对于此类问题非常有效。只需将第一个预订分配给房间类型即可。继续分配保留,直到有一个保留未分配。然后回溯你出错的地方,并相应地改变之前的决定。

这样,您将找到一个/所有可行的解决方案,或者您将证明不存在任何解决方案。

优点是可以证明不可行。此外,回溯可以让您找到不可行的“原因”。

参见例如http://en.wikipedia.org/wiki/Backtracking

【讨论】:

  • 谢谢。也会检查的。
【解决方案4】:

可以使用数学编程约束编程,使用许多现成的工具(尝试cplexgurobi 用于 MP 和 gecodecp 优化器 用于 CP,仅举几例)用于建模和解决这些类别的问题。它们通常具有可以从大多数编程语言调用的 API。

我想这个答案在很长一段时间后才出现,但我希望它仍然可以帮助其他人:-)

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2013-09-06
    • 2013-12-09
    • 1970-01-01
    • 2016-02-23
    • 2021-07-01
    相关资源
    最近更新 更多