在Cplex(Java)的目标函数中添加二次惩罚项

时间:2018-09-04 15:34:39

标签: java optimization cplex objective-function

我正在为还包含电池的家用能源系统开发优化工具。所有值都是正确的,解决方案很有意义。问题在于解决方案包含非常强烈的波动。这意味着决策变量通常为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。

1 个答案:

答案 0 :(得分:0)

问题已解决,如下所示:

似乎无法添加类似GenreType Instance Record的表达式。相反,解决方案是将以上内容写为GenreType-Instance-Record。其中x是惩罚因子,a和b是决策变量。这样,可以将项添加到cplex的目标函数中。在代码中,它看起来像这样:

x * ((a - b) ^ 2)

在我的情况下,a和b在连续两个时间步s.t中是相同的变量。随着时间的变化保持很小。