跳至主内容
框架 无框架

CP Optimizer 中的区间变量序列
上一页 下一页
间隔序列变量
无重叠约束
同序和同共次序约束
获取下一个/上一个时间间隔类型的表达式
获取下一个/上一个区间界限的表达式
间隔序列变量

区间序列变量是在一组区间变量A 上定义的。 非正式地说,区间序列变量的值代表了A 的区间变量的总排序。 注意,排序时不考虑任何不存在的区间变量。

更正式地说,一组区间变量'A上的'区间序列变量''p代表一个决策变量,其可能的值是'A的所有区间的排列组合。 假设 "k_A_underscore.png是一组固定区间,n表示 "k_A_underscore.png的基数。 A permutation π of k_A_underscore.png is a function π : k_A_underscore.pngrarr2.png { perp.png } cup.png [1, n] such that if we denote length(π) = |{a_underscore.pngisin.pngk_A_underscore.png, x(a_underscore.png)}| the number of present intervals:

sequence2.png

请注意,序列本身并不对区间端点的相对位置施加任何限制。 例如,在序列 p 中,区间变量 a 可排在区间变量 b 之前,而不影响 ab 的开始/结束点之间的相对位置(a 仍然可固定为在 b 结束之后开始)。 这是因为可以使用不同的语义来定义序列如何约束区间的位置。 我们稍后将了解 noOverlap 约束如何实现其中一个可能的语义。

以下是可对序列变量使用的约束:

  • first(p, a)表示如果区间a出现,它将是序列p 的第一个区间。
  • last(p, a)表示如果区间a出现,它将是序列p 的最后一个区间。
  • before(p, a, b)表示如果区间ab都存在,则在序列p 中,a会出现在b之前。
  • prev(p, a, b)表示,如果区间 "a和 "b都存在,则 "a将位于序列 "p中 "b"之前。 换句话说,它将出现在b之前,序列中的ab之间不会出现其他间隔。

表 3 列出了这些基本约束的形式语义。

interval_sequence1.png

序列变量还允许将固定整数类型与序列中的每个区间变量关联起来。 其中,"noOverlap约束(见下文)和 "下一个类型/上一页整数表达式(见下文)都使用了这些整数。 T(p, a)表示序列变量p 中区间变量a的固定整数类型。

涉及区间变量和区间序列变量的约束条件不能用于 CP 优化器的逻辑约束条件(参见操作符!)操作符||)。原因是任何涉及区间变量的逻辑约束都必须通过由presenceOf约束处理的区间上的存在布尔值来捕捉。 具有这种限制的约束条件是序列的排序约束条件(前、后、前、前)和noOverlap约束条件。

无重叠约束

区间序列变量p上的noOverlap约束说明,序列定义了一个不重叠的区间链,且区间链中的任何区间都必须在区间链中下一个区间开始之前结束。 此约束通常可用于对分离式资源建模。

更正式地说,序列p的排列值 π 满足noOverlap约束的条件定义为

no_overlap.png

图 4 展示了序列变量和使用序列变量的无重叠约束条件。

sequence.png

如果指定了转换距离矩阵M,则它定义了序列中两个连续区间之间的最小距离。 该约束条件有两个版本:一个版本强制规定序列中每个区间与其下一个区间之间的转换距离(Next),另一个版本强制规定序列中每个区间与其所有后继区间之间的转换距离(After)。

更正式地说,如果T(p,a)表示序列变量p 中区间a的整数类型:

no_overlap2.png

请注意,如果过渡矩阵M满足三角不等式,那么 "no_overlap_next.png和 "no_overlap_after.png两个版本的约束语义是相同的。 如果M不满足三角不等式,则约束条件 "no_overlap_after.png比 "no_overlap_next.png更强。

同序和同共次序约束

sameSequencesameCommonSubsequence约束是对一对序列变量 "p1.png和 "p2.png的二元约束。 These constraints state that the relative position of some related subsets of interval variables is the same in both sequences: typically, if a is before b in sequence p1.png then the interval related to a is before the interval related to b in sequence p2.png. 以下是这些约束比较有用的用例的示例:

  • 先进/先出和无旁路约束。 在某些物理系统中(如单线铁路上的火车或者传送带上的物品),无法进行绕过,并且物品必须以相同顺序在系统管理的给定部分中进入和离开。 如果进入和退出系统的部分或结点由两个相关区间变量进行建模,那么这些约束可通过针对进入和退出区间序列的 sameSequence 约束(或 sameCommonSubsequence 约束,如果项目不依照相同路径)进行建模。 此类约束的经典示例为置换流水车间调度问题。
  • 用于通过不确定性进行调度的基于场景的方法。 在存在不确定性的情况下(例如,不确定的活动持续时间),人们可能有兴趣在优化一些稳健性或统计标准(例如预期完工时间)的单项资源上构建活动序列。 场景是用于定义环境中不确定性的特定实现的子模型。 由于必须查找用于优化一些针对所有场景的条件的稳健序列,因此跨所有场景的给定单项资源的不同序列与 sameSequence 约束相链接。

在两个序列变量 "p1.png(定义在一组区间变量 "A1.png上)和 "p2.png(定义在一组区间变量 "A2.png上)上定义了一个约束条件 "相同的通用子序列p1p2B1B2.png"),两个区间变量数组 "B1.png和 "B2.png"大小相同,且 "B1inA1.png. 该约束条件规定,"p1.png和 "p2.png定义的子序列只考虑当前区间对("B1iB2i.png),与区间 "B1i.png和 "B2i.png之间的映射模完全相同。

例如,假设序列变量 "p1.png定义在区间变量 "{a,b,c,d,e,f}上,序列变量 "p2.png定义在区间变量 "{u,v,w,x,y,z}上,并带有约束条件 "相同的通用子序列" (p1.png, 'p2.png, '[a,c,d,e,f],[u,w,v,x,y]) 。 假设在解题过程中,区间变量dy不存在,而其他区间变量都存在。 pi1.png"=(c,f,a,e,b)和 "pi2.png"=(w,v,u,x)这对排列组合满足sameCommonSubsequence"约束。 事实上,如果只考虑成对的存在区间,"B1B2.png映射 "[a,c,e]"和 "[u,w,x]pi1.png"在 "{a,c,e}"上的后序是 "(c,a,e)","pi2.png"在 "{u,w,x}"上的后序是 "(w,u,x),可以看出这两个后序的映射模数相同。

更具体地说,让n表示两个区间变量数组 "B1.png和 "B2.png"的大小。 排序变量 "p1.png和 "p2.png的排列组合 "pi1.png和 "pi2.png"满足约束条件 "相同的通用子序列"(pi1pi2B1B2.png)的条件定义为

sameSeq1.png

在两个大小相同的序列变量 "p1.png(定义在一组区间变量 "A1.png上)和 "p2.png"(定义在一组区间变量 "A2.png上)上定义了一个约束条件sameSequence(p1p2B1B2.png),两个区间变量数组 "B1.png和 "B2.png"是集合 "A1.png和 "A2.png的排序。 该约束条件规定,序列 "p1.png和 "p2.png通过区间 "B1i.png和 "B2i.png之间的映射而完全相同。 sameSequence约束比sameCommonSubsequence约束更强;它还要求数组 "B1.png和 "B2.png包含其相对序列变量的所有定义区间,并且映射区间变量 "B1i.png和 "B2i.png的存在状态相同。

更正式一些,假设 n 表示两个序列变量的大小。 The condition for permutations pi1.png and pi2.png of the sequence variables p1.png and p2.png to satisfy constraint 相同序列(pi1pi2B1B2.png) is defined as:

sameSeq2.png

when parameters B1.png and B2.png are omitted in the definition of the above constraints, we assume B1.png and B2.png are the definition intervals of p1.png and p2.png, following the order of definition of interval variables in the sequence.

获取下一个/上一个时间间隔类型的表达式

有两个整数表达式可用于获取下一个区间的类型(即 "下一个区间")。 前一个)到序列p 中的给定区间变量a。 当区间a不存在或为最后一个区间时(相应地,当区间 b 存在时)。 序列的第一个)区间,可以为这些整数表达式提供特定值。

更正式地说,设 π 是固定序列变量p 的置换值,"a_underscore.png是固定序列变量p 中固定区间变量a的值。

如果 "a_underscore.png存在,且不是 π 中的最后一个区间,我们将 "next_func.png表示 π 中紧邻 "a_underscore.png的唯一区间。

next_func2.png

如果 "a_underscore.png存在,且不是 π 中的第一个区间,那么我们将 "prev_func.png表示在 π 中 "a_underscore.png之前的唯一区间。

prev_func2.png

获取下一个/上一个区间界限的表达式

整数表达式 "startOfNext、"endOfNext、"lengthOfNext、"sizeOfNext"、"startOfPrev"、"endOfPrev"、"lengthOfPrev"和 "sizeOfPrev提供了对下一区间(即 "下一区间")不同属性的访问。 前一个)到序列p 中的给定区间变量a。 当区间a不存在或为最后一个区间时(相应地,当区间 b 存在时)。 序列的第一个)区间,可以为这些整数表达式提供特定值。

下表给出了这些表达式的语义。

nextprev_table.png

上一页 下一页