C# 如何定义一个约束以防止资源分配给两个重叠的任务?
如何定义一个约束以防止资源分配给两个重叠的任务 我定义了5个资源:R1、R2、…、R5和3个任务:T1、T2、T3,它们有相应的开始和结束日期(s1、e1表示第一个任务的开始和结束日期,s2、e2表示第二个任务的开始和结束日期,依此类推)。如果任务T1和任务T2重叠,我的约束将阻止R1分配给任务T1和任务T2。R1可以分配给任意数量的任务,因此如果T1和T3不重叠,它们都可以由R1执行C# 如何定义一个约束以防止资源分配给两个重叠的任务?,c#,constraint-programming,ms-solver-foundation,C#,Constraint Programming,Ms Solver Foundation,如何定义一个约束以防止资源分配给两个重叠的任务 我定义了5个资源:R1、R2、…、R5和3个任务:T1、T2、T3,它们有相应的开始和结束日期(s1、e1表示第一个任务的开始和结束日期,s2、e2表示第二个任务的开始和结束日期,依此类推)。如果任务T1和任务T2重叠,我的约束将阻止R1分配给任务T1和任务T2。R1可以分配给任意数量的任务,因此如果T1和T3不重叠,它们都可以由R1执行 我计划用C和微软解决这个问题,当然这并不重要。我的问题是,我不知道如何将这个问题表述为约束。有很多方法可以表述
我计划用C和微软解决这个问题,当然这并不重要。我的问题是,我不知道如何将这个问题表述为约束。有很多方法可以表述这些约束来处理重叠和冲突 这里有一个非常普遍和标准的做法 创建冲突矩阵的预处理 首先,创建一个大小为T^2的冲突矩阵(从技术上讲,下面的三角形就足够了),其中T是任务数。如果Tj和Tk重叠,则将标记为1,否则标记为0(表示没有冲突) 例如,这可能是您的冲突矩阵:
T1 | T2 | T3
T1 -- | 1 | 0
T2 1 | -- | 1
T3 0 | 1 | --
为了创建此矩阵,您必须对每对任务j
和k
(sj,ej)和(sk,ek)进行O(T^2)比较。
请注意,在调用解算器之前,可以脱机计算一次
配方
如果资源i被分配给任务j,则设X_Ri_Tj=1
现在,您可以编写“重叠预防约束”。对于矩阵中的每个冲突,将有R个约束
作为一个具体的例子,从上面的矩阵中,假设我们想要编写约束,以防止将相同的资源分配给任务T2和T3(因为它们是重叠的)。
你可以这样写:
Xr1t2 + Xr1t3 <= 1
Xr2t2 + Xr2t3 <= 1
Xr3t2 + Xr3t3 <= 1
... for each resource R
Xr1t2+Xr1t3