2011-01-14 823 views
10

我正在寻找分配预留资源的算法。这可能是酒店预订与可用客房相匹配 - 会议预订与可用会议室相匹配 - 与餐桌相匹配的餐厅预订。预约分配算法

他们有什么共同之处:

  • 每个预约有一个特定的不可改变的开始和结束时间。
  • 每个预留在开始时间之前未绑定到特定资源。
  • 可以有可变数量的资源。
  • 每次有新的预约时,算法至少应该能够检查是否可以匹配资源。

到目前为止,我主要着眼于解决问题的遗传算法方法,但是我在编码问题时遇到了麻烦。

对此算法的任何想法都是值得欢迎的,也是只有找到一个“好”解决方案而不是最优解决方案的算法。

+1

这是一个在线问题(您一次只能收到一个请求),还是在所有预留之前? – EmeryBerger 2011-01-14 12:54:54

+0

这将是当时的一个要求。但是保留在开始时间之前不必与资源绑定。因此,在添加新预订时,会有捆绑预订并且不会捆绑预订。 – Lemmedaskeren 2011-01-14 12:58:51

回答

4

看看禁忌搜索模拟退火作为遗传算法的替代品。

这与Drools Planner(java,开放源代码)中的PAS示例非常相似,该示例将患者安排到各种约束条件下的医院病床中。 请参阅the slide和下一张幻灯片。

5

article包括各种时间操作来检查自由,重叠和相交时间段。您可以轻松地将此类与您的业务对象结合起来:

// ---------------------------------------------------------------------- 
public void TimeRangeSample() 
{ 
    // --- time range 1 --- 
    TimeRange timeRange1 = new TimeRange(
    new DateTime(2011, 2, 22, 14, 0, 0), 
    new DateTime(2011, 2, 22, 18, 0, 0)); 
    Console.WriteLine("TimeRange1: " + timeRange1); 
    // > TimeRange1: 22.02.2011 14:00:00 - 18:00:00 | 04:00:00 

    // --- time range 2 --- 
    TimeRange timeRange2 = new TimeRange(
    new DateTime(2011, 2, 22, 15, 0, 0), 
    new TimeSpan(2, 0, 0)); 
    Console.WriteLine("TimeRange2: " + timeRange2); 
    // > TimeRange2: 22.02.2011 15:00:00 - 17:00:00 | 02:00:00 

    // --- time range 3 --- 
    TimeRange timeRange3 = new TimeRange(
    new DateTime(2011, 2, 22, 16, 0, 0), 
    new DateTime(2011, 2, 22, 21, 0, 0)); 
    Console.WriteLine("TimeRange3: " + timeRange3); 
    // > TimeRange3: 22.02.2011 16:00:00 - 21:00:00 | 05:00:00 

    // --- relation --- 
    Console.WriteLine("TimeRange1.GetRelation(TimeRange2): " + 
        timeRange1.GetRelation(timeRange2)); 
    // > TimeRange1.GetRelation(TimeRange2): Enclosing 
    Console.WriteLine("TimeRange1.GetRelation(TimeRange3): " + 
        timeRange1.GetRelation(timeRange3)); 
    // > TimeRange1.GetRelation(TimeRange3): EndInside 
    Console.WriteLine("TimeRange3.GetRelation(TimeRange2): " + 
        timeRange3.GetRelation(timeRange2)); 
    // > TimeRange3.GetRelation(TimeRange2): StartInside 

    // --- intersection --- 
    Console.WriteLine("TimeRange1.GetIntersection(TimeRange2): " + 
        timeRange1.GetIntersection(timeRange2)); 
    // > TimeRange1.GetIntersection(TimeRange2): 
    //    22.02.2011 15:00:00 - 17:00:00 | 02:00:00 
    Console.WriteLine("TimeRange1.GetIntersection(TimeRange3): " + 
        timeRange1.GetIntersection(timeRange3)); 
    // > TimeRange1.GetIntersection(TimeRange3): 
    //    22.02.2011 16:00:00 - 18:00:00 | 02:00:00 
    Console.WriteLine("TimeRange3.GetIntersection(TimeRange2): " + 
        timeRange3.GetIntersection(timeRange2)); 
    // > TimeRange3.GetIntersection(TimeRange2): 
    //    22.02.2011 16:00:00 - 17:00:00 | 01:00:00 
} // TimeRangeSample