/** * Линейная комбинация целевой функции и функции штрафов. * Функция штрафов представляет из себя сумму квадратов функций ограничений * или их срезок. * Для классов наследников необходимо определить метод 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); } }