LCFunction

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
* Линейная комбинация целевой функции и функции штрафов.
* Функция штрафов представляет из себя сумму квадратов функций ограничений
* или их срезок.
* Для классов наследников необходимо определить метод 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);
}
}