-
Notifications
You must be signed in to change notification settings - Fork 0
/
nn_fuzzy_set.cpp
259 lines (246 loc) · 6.17 KB
/
nn_fuzzy_set.cpp
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
/*
* nn_fuzzy_set.cpp
* open nn
*
* Created by Sidhartha Mani on 09/09/11.
* Copyright 2011 Amrita School Of Engineering. All rights reserved.
*
*/
#include "nn_fuzzy_set.h"
bool nn_fuzzy_set::complement(int type = NN_COMPLEMENT_NORMAL, int parameter = 1) {
switch (type)
{
case NN_COMPLEMENT_NORMAL: // perform complement by the normal complement method like in crisp sets
reset_position();
while(!end_of_set()) {
set_membership(1 - get_membership());
next_member();
}
return true;
case NN_COMPLEMENT_SUGENOCLASS: // perform complement by the sugeno class of operators
reset_position();
while(!end_of_set()) {
set_membership((1 - get_membership()) / (1 + (parameter * get_membership())));
next_member();
}
return true;
default:
return NULL;
}
}
nn_fuzzy_set nn_fuzzy_set::t_norm(nn_fuzzy_set op2,int type = NN_TNORM_MINIMUM) {
nn_fuzzy_set result;
reset_position();
op2.reset_position();
if (nn_size() != op2.nn_size()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
switch (type) {
case NN_TNORM_MINIMUM:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
if (get_membership() > op2.get_membership()) {
result.add_new(get_member(), op2.get_membership());
}
else {
result.add_new(get_member(), get_membership());
}
next_member();
op2.next_member();
}
break;
case NN_TNORM_PRODUCT:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
result.add_new(get_member(), get_membership() * op2.get_membership());
next_member();
op2.next_member();
}
break;
case NN_TNORM_EINSTEIN_PRODUCT:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
result.add_new(get_member(), (get_membership() * op2.get_membership()) / (2 - ((get_membership() + op2.get_membership()) - get_membership() * op2.get_membership())));
next_member();
op2.next_member();
}
break;
case NN_TNORM_DRASTIC_PRODUCT:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
if (op2.get_membership() == 1) {
result.add_new(get_member(), get_membership());
}
else if (get_membership() == 1) {
result.add_new(get_member(), op2.get_membership());
}
else {
result.add_new(get_member(), 0.0);
}
next_member();
op2.next_member();
}
break;
default:
break;
}
return result;
}
nn_fuzzy_set nn_fuzzy_set::s_norm(nn_fuzzy_set op2,int type = NN_SNORM_MAXIMUM) {
nn_fuzzy_set result;
reset_position();
op2.reset_position();
if (nn_size() != op2.nn_size()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
switch (type) {
case NN_SNORM_MAXIMUM:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
if (get_membership() < op2.get_membership()) {
result.add_new(get_member(), op2.get_membership());
}
else {
result.add_new(get_member(), get_membership());
}
next_member();
op2.next_member();
}
break;
case NN_SNORM_SUM:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
result.add_new(get_member(), get_membership() + op2.get_membership() - (get_membership() * op2.get_membership()));
next_member();
op2.next_member();
}
break;
case NN_SNORM_EINSTEIN_SUM:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
result.add_new(get_member(), get_membership() + op2.get_membership() / (1 + (get_membership() * op2.get_membership())));
next_member();
op2.next_member();
}
break;
case NN_SNORM_DRASTIC_SUM:
while (!end_of_set()) {
if (get_member() != op2.get_member()) {
nn_incompatibleFuzzySetsException ex;
throw ex;
}
if (op2.get_membership() == 0) {
result.add_new(get_member(), get_membership());
}
else if (get_membership() == 0) {
result.add_new(get_member(), op2.get_membership());
}
else {
result.add_new(get_member(), 1.0);
}
next_member();
op2.next_member();
}
break;
default:
break;
}
return result;
}
nn_fuzzy_set nn_fuzzy_set::support() {
nn_fuzzy_set result;
reset_position();
while (!end_of_set()) {
if(get_membership() > 0)
result.add_new(get_member(),get_membership());
next_member();
}
return result;
}
nn_fuzzy_set nn_fuzzy_set::core() {
nn_fuzzy_set result;
reset_position();
while (!end_of_set()) {
if(get_membership() == 1)
result.add_new(get_member(),get_membership());
next_member();
}
return result;
}
bool nn_fuzzy_set::normal_set() {
reset_position();
while (!end_of_set()) {
if(get_membership() == 1)
return true;
next_member();
}
return false;
}
nn_fuzzy_set nn_fuzzy_set::crossover() {
nn_fuzzy_set result;
reset_position();
while (!end_of_set()) {
if(get_membership() == 0.5)
result.add_new(get_member(),get_membership());
next_member();
}
return result;
}
nn_fuzzy_set nn_fuzzy_set::alpha_cut(double alpha) {
nn_fuzzy_set result;
reset_position();
while (!end_of_set()) {
if(get_membership() >= alpha)
result.add_new(get_member(),get_membership());
next_member();
}
return result;
}
nn_fuzzy_set nn_fuzzy_set::strong_alpha_cut(double alpha) {
nn_fuzzy_set result;
reset_position();
while (!end_of_set()) {
if(get_membership() > alpha)
result.add_new(get_member(),get_membership());
next_member();
}
return result;
}
bool is_convex(double lambda) {
//still not sure of what it exactly means!!
return true;
}
/*bool is_symmetric(double point_of_symmetry) {
reset_position();
map<double,double>:: bidirectional_iterator itx;
itx = set.find(point_of_symmetry);
while (!end_of_set()) {
}
}*/
nn_incompatibleFuzzySetsException::nn_incompatibleFuzzySetsException() {
stmt = new char[100];
stmt = "The Two or more Fuzzy sets are not compatible for the operator chosen";
}