我正在为还包含电池的家用能源系统开发优化工具。所有值都是正确的,解决方案很有意义。问题在于解决方案包含非常强烈的波动。这意味着决策变量通常为0或最大值。为了避免这种情况,我想添加一个二次约束来惩罚两个值的差异(类似于导数)。应该看起来像这样:
(((x [t]-x [t-1])/ stepsize)^ 2
其中x是感兴趣的决策变量。例如。 power_g_h[t]
。
到目前为止,我的目标函数定义如下:
IloLQNumExpr expr = model.lqNumExpr();
for (int t = 0; t < timesteps; t++) {
expr.addTerm(problem.getCosts().getElectricityCosts(t), power_g_h[t]);
expr.addTerm(problem.getCosts().getElectricityCosts(t), power_g_b[t]);
expr.addTerm(problem.getCosts().getElectricityCosts(t), power_g_bev[t]);
expr.addTerm(problem.getCosts().getFeedCompensation(), power_pv_g[t]);
}
我希望这在某种程度上是可以理解的,并且有人能够告诉您在CPLEX中是否甚至可以做到这一点。
如果这不可能,那么我将很高兴获得有关如何“平滑” CPLEX中的解决方案的提示。
以诚挚的问候,
L。
答案 0 :(得分:0)
问题已解决,如下所示:
似乎无法添加类似GenreType Instance Record
的表达式。相反,解决方案是将以上内容写为GenreType-Instance-Record
。其中x是惩罚因子,a和b是决策变量。这样,可以将项添加到cplex的目标函数中。在代码中,它看起来像这样:
x * ((a - b) ^ 2)
在我的情况下,a和b在连续两个时间步s.t中是相同的变量。随着时间的变化保持很小。