Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何定义一个约束以防止资源分配给两个重叠的任务?_C#_Constraint Programming_Ms Solver Foundation - Fatal编程技术网

C# 如何定义一个约束以防止资源分配给两个重叠的任务?

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和微软解决这个问题,当然这并不重要。我的问题是,我不知道如何将这个问题表述为约束。有很多方法可以表述

如何定义一个约束以防止资源分配给两个重叠的任务

我定义了5个资源:R1、R2、…、R5和3个任务:T1、T2、T3,它们有相应的开始和结束日期(s1、e1表示第一个任务的开始和结束日期,s2、e2表示第二个任务的开始和结束日期,依此类推)。如果任务T1和任务T2重叠,我的约束将阻止R1分配给任务T1和任务T2。R1可以分配给任意数量的任务,因此如果T1和T3不重叠,它们都可以由R1执行


我计划用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