首页 > 解决方案 > 是否可以在 CPLEX 中的特定时刻评估累积函数?

问题描述

我正在尝试添加整个时间累积容量使用的最小化标准。容量使用是使用 cumul 函数建模的,该函数由 pulse() 函数的总和组成,其中每个计划的时间间隔都会对已用容量做出贡献。最大/最小容量边界也会随着时间而变化,所以我想我也可以用累积函数对它们进行建模(在指定时间对 step() 函数求和)。

我想加入与使用量超过最大容量的比例成比例的惩罚的一小部分(也随时间变化)。我的问题是这些累积函数的评估是使用 height_at_start(interval, function) 或 height_at_end(interval, function) 调用进行的,但是这些最小/最大边界或惩罚值也可以有效地改变,与间隔无关。我在文档中看到提供了一个名为“get_value()”的函数,但是,这似乎只能在 CpoStepFunctions 上调用,其中 stepheight 不能由决策变量定义。是否有可能在特定时间评估此类累积函数?

CPLEX python 文档

亲切的问候,贾斯珀

标签: cplexconstraint-programmingdocplex

解决方案


最大/最小容量边界也会随着时间而变化,所以我想我也可以用累积函数对它们进行建模(在指定时间对 step() 函数求和)。

对于最小-最大容量配置文件,您应该使用一些 always_in 约束。它们的形式为:</p>

always_in(F, StartTime, EndTime, LevelMin, LevelMax) 

其中 F 是您的累积函数。

它表示在(已知)时间窗口 [StartTime,EndTime)上,函数的级别必须始终介于 LevelMin(当然可以为 0)和 LevelMax 之间。因此,您可以为 LevelMin/LevelMax 相同的每个时间窗口发布此类约束之一。

是否有可能在特定时间评估此类累积函数?

没有直接的表达式来评估这种类型的值。对其建模的常用方法是使用辅助(技术)累积函数。

让:

F = sum([pulse(A[i],Q[i]) for i in …])

成为您的原始累积函数(您在其上发布最小和最大级别)。

如果想得到F在某个时刻t_j (j=0,1,2,…,n-1)的水平,可以创建一些固定区间变量TIME[j] (start=t_i, end=t_i+1 )。

您将创建一个技术累积函数:

G = F - sum([pulse(TIME[j],0,M) for j in range(n)])

其中 M 是一个很大的数(大于 F 的最大级别)。

这个想法是,如果您在间隔 TIME[j] 上发布 G=0 的约束,那么 TIME[j] 在 G 中的贡献的高度必然等于 F 在 TIME[j] 处的值。所以你添加约束:</p>

[ always_in(G,TIME[j],0,0) for j in range(n) ]

并且在时间 t_j 的 F 值由下式给出:</p>

-height_at_start(TIME[j],G)

推荐阅读