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

在cplex(Java)中向目标函数添加二次惩罚项,java,optimization,cplex,objective-function,Java,Optimization,Cplex,Objective Function,我正在为一个也包含电池的家庭能源系统开发一个优化工具。所有值都是正确的,解决方案是有意义的。问题是这个解包含非常强的波动。这意味着决策变量通常为0或最大值。为了避免这种情况,我想添加一个二次约束,惩罚两个值的差(类似于导数)。应该是这样的: IloCplex model = new IloCplex(); ... IloLQNumExpr expr = model.lqNumExpr(); expr.addTerm(x, a, a); expr.addTerm(x, b, b); expr.a

我正在为一个也包含电池的家庭能源系统开发一个优化工具。所有值都是正确的,解决方案是有意义的。问题是这个解包含非常强的波动。这意味着决策变量通常为0或最大值。为了避免这种情况,我想添加一个二次约束,惩罚两个值的差(类似于导数)。应该是这样的:

IloCplex model = new IloCplex();
...
IloLQNumExpr expr = model.lqNumExpr();

expr.addTerm(x, a, a);
expr.addTerm(x, b, b);
expr.addTerm(-2 * x, a, b);
((x[t]-x[t-1])/步长)^2

其中x是感兴趣的决策变量。例如,
power\u g\u 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]);

        } 
IloLQNumExpr expr=model.lqNumExpr();
for(int t=0;t
我希望这在某种程度上是可以理解的,并且有人能够判断这在CPLEX中是否是可能的

如果这是不可能的,我会非常高兴的提示如何“平滑”的解决方案在CPLEX

致以亲切的问候


L.

问题的解决方法如下:

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

        } 
似乎不可能添加像
x*((a-b)^2)
这样的表达式。相反,解决方案是将上述内容写成
x*a*a-2x*a*b+x*b*b
。其中x是惩罚因子,a&b是决策变量。通过这种方式,可以在cplex中向目标函数添加术语。在代码中,它看起来像这样:

IloCplex model = new IloCplex();
...
IloLQNumExpr expr = model.lqNumExpr();

expr.addTerm(x, a, a);
expr.addTerm(x, b, b);
expr.addTerm(-2 * x, a, b);

在我的例子中,a和b在两个连续的时间步s.t中是相同的变量。随时间的变化保持较小。

是的,您可以向目标添加二次项。请参阅CPLEX附带的
QPex1.java
示例。这就是你要问的吗?你应该试试看它是否能给你想要的平滑效果。另一个想法是尝试使用检查备选最佳解决方案。谢谢您的回答。问题的解决方案是将(x2-x1)^2重写为x2x2-2x2x1+x1x1。但是QPex1.java的提示也非常有用。很高兴能提供帮助。顺便说一句,如果你想获得一些声誉积分,请随意提供一个更详细的问题(这是完全合法的,鼓励回答并“接受”你自己的答案)。