【问题标题】:Is it possible to evaluate a cumul function at a specific moment in time in CPLEX?是否可以在 CPLEX 中的特定时刻评估累积函数?
【发布时间】:2021-02-15 10:38:49
【问题描述】:

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

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

CPLEX python documentation

亲切的问候, 碧玉

【问题讨论】:

    标签: cplex constraint-programming docplex


    【解决方案1】:

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

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

    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 …])
    

    成为您最初的 cumul 函数(您在其上发布最低和最高级别)。

    如果想得到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] 的值.所以你添加约束:

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

    而 t_j 时刻 F 的值由下式给出:

    -height_at_start(TIME[j],G)
    

    【讨论】:

    • 嗨@Philippe,感谢您的详细回答。我根据条件时间间隔论文中介绍的工作启动了该模型,发现它们非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多