/**
* Линейная комбинация целевой функции и функции штрафов.
* Функция штрафов представляет из себя сумму квадратов функций ограничений
* или их срезок.
* Для классов наследников необходимо определить метод getDeriative (т. к.
* это возможно только аналитически).
*/
public abstract class LCFunction extends Function {
/**
* Целевая функция
*/
private Function goal;
/**
* Ограничения-равенства
*/
private Function[] equalities;
/**
* Ограничения неравенства
*/
private Function[] inequalities;
/**
* Параметр штрафа
*/
private double r;
/**
* Конструктор
* @param goal целевая функция
* @param equalities ограничения-равенства
* @param inequalities ограничения-неравенства
*/
public LCFunction(Function goal, Function[] equalities, Function[] inequalities) {
this.goal = goal;
this.equalities = equalities;
this.inequalities = inequalities;
}
/**
* Возвращает значение штрафной функции
* @param x точка
* @param r параметр штрафа
*/
public double getPenalty(double[] x, double r) {
double res = 0;
// сумма квадратов значений ограничений-равенств
for (int i = 0; i < equalities.length; ++i) {
double tmp = equalities[i].getValue(x);
res += tmp * tmp;
}
// сумма квадратов срезки ограничений-неравенств
for (int i = 0; i < inequalities.length; ++i) {
double tmp = inequalities[i].getValue(x);
if (tmp > 0) {
res += tmp * tmp;
}
}
return (r / 2) * res;
}
/**
* Возвращает параметр штрафа
* @return параметр штрафа
*/
public double getR() {
return r;
}
/**
* Устанавливает параметр штрафа
* @param r параметр штрафа
*/
public void setR(double r) {
this.r = r;
}
public double getValue(double[] x) {
return goal.getValue(x) + getPenalty(x, r);
}
}