跳至主内容
框架 无框架

CP Optimizer 中的状态函数
上一页 下一页
语义
状态函数和转换距离
状态函数上的约束
语义

某些调度问题包括对状态可能随时间而变的资源的推理。 资源的状态可能因计划活动或外部事件而改变,计划表中的某些活动可能需要资源状态的特定条件为真才能执行。 例如,烤箱的温度可能会因为执行将烤箱温度设置为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)内的任何地方都应保持恒定(无论其值如何)、
  • 需要定义函数状态的区间不能与给定的固定或可变区间重叠alwaysNoState),以及
  • 在给定的固定或可变区间内,函数的状态(如果已定义)必须保持在给定的状态范围[VminVmax] 内alwaysIn)。

此外,还可以补充alwaysEqualalwaysConstant约束,规定给定的固定或可变区间的起点和/或终点应与维持所需状态的状态函数区间的起点和/或终点同步。 这就是起点和终点对齐的概念,对于模拟并行批次特别有用。 例如,在上述烤箱示例中,对于需要烤箱温度水平 1 并指定起点和终点一致的所有区间变量,如果在区间 [150, 250) 期间执行,那么必须恰好在 150 开始并于 250 结束。 如图 6 所示,a1a2是两个开始和结束对齐的区间变量,a3仅开始对齐,而a4则完全没有对齐。

state.png

涉及区间变量和状态函数的约束条件不能用于 CP 优化器的逻辑约束条件(参见操作符!)操作符||)。原因是任何涉及区间变量的逻辑约束都必须通过由presenceOf约束处理的区间上的存在布尔值来表示。 具有这种限制的约束条件有alwaysInalwaysNoStatealwaysConstantalwaysEqual

状态函数和转换距离

状态函数f是一个决策变量,其值是一组不重叠的区间,每个区间[si, ei) 关联一个非负整数值vi,代表函数在区间内的状态。

state_func1.png

例如,在上面介绍的烤箱示例中,"f_underscore.png(200) = 1,s(f_underscore.png, 200) = 150,e(f, 200) = 250。

状态函数可以与转换距离相关联。 转换距离定义状态函数中两个连续状态必须相隔的最短距离。

更正式地说,如果M[v,v0] 表示状态v和状态v' 之间的转换距离矩阵,转换距离就意味着

state_func2.png

转换距离矩阵 M 必须满足三角不等式。

例如,在烤箱的例子中,图 6 所示的状态函数与以下转换距离一致:

state_func3.png

请注意,相同状态之间的转换距离可以不为零,本例中的状态 3 就是如此。

状态函数上的约束

如果f是状态函数,a是区间变量,vvminvmax为非负整数,"align_se.png为两个布尔值:

  • alwaysEqual(f,a, v,align_se.png) 约束条件规定,无论何时出现a,状态函数f必须在区间a的起点和终点之间的任何地方定义,并且在该区间内恒定等于v。 如果algn_s为真,则表示区间af 起始对齐:区间a必须从f保持状态s 的区间开始。 如果algn_e为真,则表示区间af 末端对齐:区间a必须在f保持状态s 的区间末端结束。 更正式地表述:
state_func4.png
  • alwaysConstant(f,a,align_se.png) 约束条件规定,无论何时出现a,状态函数f必须在区间a的起点和终点之间的任何地方定义,并在该区间内保持不变。 更正式的说法是:'exist.pngvisin.pngZ+,alwaysEqual(f,, a, v,align_se.png)
  • alwaysNoState(f,a)约束条件规定,只要有a,状态函数f就不能在区间a 的起点和终点之间提供任何有效状态。 因此,任何在此函数上使用alwaysEqualalwaysConstant约束条件的区间都不能与区间a 重合。 更正式地说,该约束意味着[s(a_underscore.png),e(a_underscore.png))∩D(f_underscore.png) = 'empty.png.
  • alwaysIn(f,a, vmin, vmax)约束规定,只要有a,在区间a的起点和终点之间的任何地方,函数f 的状态(如果已定义)都必须属于[vmin, vmax] 范围。 形式为: 'forall.pngtisin.png[s(a_underscore.png),e(a_underscore.png))∩D(f_underscore.png), 'f_underscore.png(t) 'isin.png[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也允许间隔与状态转换重叠)。

上一页 下一页