一种确定分时度假请求的快速算法

时间:2014-11-05 18:04:06

标签: algorithm linear-programming

我正在编写一个程序来模拟特定分时度假的成员如何申请他们的公寓。公寓仅适用于全年的某些“活动”,每个活动的持续时间不同(以天计算)。每个活动都有许多公寓,根据费用(每天的积分)分成几组。

我们可能还有一些公寓已经出租的情况,因此有些事件可能无法承认某种公寓类型。

现在我希望会员根据这个策略申请公寓:

  • 最大化总活动天数是首要任务。
  • 最大限度地减少花费的点数是第二优先(因此用户要求他/她能够负担得起的最好的公寓,并且仍然有尽可能多的天数。)
  • 所请求公寓的总费用不能超过该用户的可用积分总额。
  • 显然,如果特定事件中没有特定类型的公寓,则用户不应该请求特定的公寓/事件组合。

我想知道问题是否与此处描述的问题类似:

http://en.wikipedia.org/wiki/Hungarian_algorithm

因为它(我想)可以将其构建为矩阵问题,其中每个条目都有与之相关的成本。

然而,区别在于,对于我的问题,我被允许在几个事件中使用相同的公寓 - 一旦用于一个事件,它就不会“花费”。此外,每个条目的成本并不是真正的一维,因为每个事件/公寓组合都有一些与之相关的天数一些点 - 两者都应该最大化(但是优先考虑天数。)

作为一个例子,假设有三种公寓类型,每天花费75,100和125点,以及三个事件,持续时间为2天,10天和4天。让我们进一步说,许多公寓都被采用,因此可用性矩阵如下所示:

                  cost
             75    100   125
       2    True False True
 days  10   False False True
       4    True False True

我们还说用户有1250分可用。在这种情况下,解决方案是用户要求使用125点公寓进行为期10天的活动,而不是其他任何事情。

执行此操作的蛮力方式可能是递归算法:

  • 设n是您当前正在尝试的事件数
  • 查找事件和公寓的所有组合,并计算最大化天数的组合,然后计算花费的点数(这将包括n个事件的所有排列,但也包括3个公寓类型的方式数量)分配给n个事件)。
  • 设n = n-1

我认为,当事件数量增加时,这将很快变得势不可挡,所以我想知道是否有任何算法能够以更便宜的方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您可以访问http://en.wikipedia.org/wiki/Integer_programming的库,则可以尝试将其丢弃。

即使您只为每项活动选择了一项费用,因此您只是尝试选择涵盖尽可能多的总天数而不超出预算的事件组合,我认为这会减少到http://en.wikipedia.org/wiki/Knapsack_problem 。这意味着不可能通过最坏情况多项式时间算法(如匈牙利算法)精确求解。