我正在寻找用于为资源分配预留的算法。这可能是与可用房间相匹配的酒店预订 - 与可用会议室相匹配的会议预订 - 与桌子相匹配的餐厅预订。
他们有什么共同点:
到目前为止,我主要研究了遗传算法的方法来解决这个问题,但是我无法将问题编码到染色体上。
对此算法的任何想法都是受欢迎的,也是只能找到“好”解决方案而不是最佳解决方案的算法。
答案 0 :(得分: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
答案 1 :(得分:4)
查看禁忌搜索和模拟退火作为遗传算法的替代品。
这与Drools Planner(java,开源)中的PAS示例非常类似,该示例涉及将患者安排到具有各种约束的病床。 请参阅the slide和下一张幻灯片。
答案 2 :(得分:0)
使用稀疏矩阵。
在酒店房间预订的情况下
所有的 (1,2,3) 都可以表示为一个列表或 3 个哈希表。
示例:
x = room 10
y = date 2021/4/3
z = time from 10am till 9pm
然后添加用于插入、删除、碰撞等保留逻辑的所有方法。
可以证明,使用这种结构,您可以通过遍历矩阵轻松管理任何预订。