| 概述 | 组 | 树 | 图形 | 不推荐 | 索引 | 概念 |
| 语义 |
| 状态函数和转换距离 |
| 状态函数上的约束 |
某些调度问题包括对状态可能随时间而变的资源的推理。 资源的状态可能因计划活动或外部事件而改变,计划表中的某些活动可能需要资源状态的特定条件为真才能执行。 例如,烤箱的温度可能会因为执行将烤箱温度设置为v值的活动而发生变化,而某些烹饪活动可能要求在执行过程中将烤箱温度保持在v' 的温度水平上。 在某些应用中,两个状态之间的转换不是瞬时的,资源从状态v转换到状态v' 需要一定的转换时间。
CP 优化器引入了状态函数的概念,这是一个描述环境中给定特征演变的函数。 这一特征的可能演变受制于问题的区间变量。 状态函数与累积函数(参见 "累积函数 "一节)的主要区别在于,区间变量对累积函数的影响是递增的(增大或减小函数值),而对状态函数的影响是绝对的(要求函数值等于某一特定状态或一组可能状态)。
非正式地说,状态函数是一组不重叠的区间,在这些区间中,该函数保持特定的非负整数状态。 在这些时间间隔之间,函数的状态并不确定,通常是因为两个状态之间正在进行转换(见状态函数和转换距离)。 例如,一个烤箱有 3 个可能的温度等级,分别用 0、1 和 2 来标识,我们可以得出这样的结果:
[start=0, end=100): state=0, [start=150, end=250): state=1, [start=250, end=300): state=1, [start=320, end=420): state=2, [start=460, end=560): state=0, ...
有一组约束条件可用于限制状态函数的演变(见状态函数的约束条件)。 有了这些限制条件,我们就有可能指定
此外,还可以补充alwaysEqual和alwaysConstant约束,规定给定的固定或可变区间的起点和/或终点应与维持所需状态的状态函数区间的起点和/或终点同步。 这就是起点和终点对齐的概念,对于模拟并行批次特别有用。 例如,在上述烤箱示例中,对于需要烤箱温度水平 1 并指定起点和终点一致的所有区间变量,如果在区间 [150, 250) 期间执行,那么必须恰好在 150 开始并于 250 结束。 如图 6 所示,a1和a2是两个开始和结束对齐的区间变量,a3仅开始对齐,而a4则完全没有对齐。

涉及区间变量和状态函数的约束条件不能用于 CP 优化器的逻辑约束条件(参见操作符!)、 操作符||)。原因是任何涉及区间变量的逻辑约束都必须通过由presenceOf约束处理的区间上的存在布尔值来表示。 具有这种限制的约束条件有alwaysIn、alwaysNoState、alwaysConstant和alwaysEqual。
状态函数f是一个决策变量,其值是一组不重叠的区间,每个区间[si, ei) 关联一个非负整数值vi,代表函数在区间内的状态。

例如,在上面介绍的烤箱示例中,"
(200) = 1,s(
, 200) = 150,e(f, 200) = 250。
状态函数可以与转换距离相关联。 转换距离定义状态函数中两个连续状态必须相隔的最短距离。
更正式地说,如果M[v,v0] 表示状态v和状态v' 之间的转换距离矩阵,转换距离就意味着

转换距离矩阵 M 必须满足三角不等式。
例如,在烤箱的例子中,图 6 所示的状态函数与以下转换距离一致:

请注意,相同状态之间的转换距离可以不为零,本例中的状态 3 就是如此。
如果f是状态函数,a是区间变量,v、vmin、vmax为非负整数,"
为两个布尔值:
) 约束条件规定,无论何时出现a,状态函数f必须在区间a的起点和终点之间的任何地方定义,并且在该区间内恒定等于v。 如果algn_s为真,则表示区间a与f 起始对齐:区间a必须从f保持状态s 的区间开始。 如果algn_e为真,则表示区间a与f 末端对齐:区间a必须在f保持状态s 的区间末端结束。 更正式地表述:
) 约束条件规定,无论何时出现a,状态函数f必须在区间a的起点和终点之间的任何地方定义,并在该区间内保持不变。 更正式的说法是:'
v
Z+,alwaysEqual(f,, a, v,
)
),e(
))∩D(
) = '
.
t
[s(
),e(
))∩D(
), '
(t) '
[vmin, vmax]。在图 6 中,状态 1 有两个相邻区间:第一个区间为 [150,250],第二个区间为 [250,300}。 原因有两个:250 是终点对齐区间a1的终点,也是起点对齐区间a2 的起点。 因此,根据条件 (b) 或 (c),区间 [150,300] 必须一分为二(即使状态函数的值没有变化)。 还要注意的是,由于条件(a)的存在,区间a4不能与 250 重叠,尽管事实上a4既不是起点对齐,也不是终点对齐。 要允许a4与 250 重叠,就必须使用alwaysIn约束,而不是alwaysEqual--区别在于,即使允许的状态范围是单一的,alwaysIn也不会强制执行条件 (a)(然而,alwaysIn也允许间隔与状态转换重叠)。