Добавить квадратный штрафной член к целевой функции в cplex (Java) - PullRequest
0 голосов
/ 04 сентября 2018

Я разрабатываю инструмент оптимизации для бытовой энергосистемы, который также содержит батарею. Все значения верны, и решение имеет смысл. Проблема в том, что решение содержит очень сильные колебания. Это означает, что переменная решения часто либо 0, либо максимальное значение. Чтобы избежать этого, я хотел бы добавить квадратичное ограничение, которое штрафует разницу двух значений (что-то вроде производной). Должно выглядеть примерно так:

((x [t] - x [t-1]) / размер шага) ^ 2

Где х - это переменная решения, представляющая интерес. Например. 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.

С уважением,

Л.

1 Ответ

0 голосов
/ 13 сентября 2018

Проблема была решена следующим образом:

Невозможно добавить выражение типа 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. изменение во времени оставалось небольшим.

...