-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuzzyrules.d
executable file
·60 lines (58 loc) · 1.3 KB
/
fuzzyrules.d
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
module fuzzyD.rules;
import fuzzyD.type;
import fuzzyD.set;
struct rule {
alias fuzzy delegate(double) outf;
outf o;
fuzzy i;
string oname;
};
/**
* WENN ... DANN ...
* WENN in-fuzzyset (member ...) DANN out-fuzzyset (member)
* bei WENN ... UND ... DANN ...
* WENN wird zu in-fuzzyset = fuzzysetA und fuzzysetB
**/
version (foo) {
class fuzzyRules {
import std.stdio;
rule[] ruleset;
// empfangt die fuzzyMembers
void addrule (T) (fuzzy infuzzy, T outfuzzy) {
// zB abstand:niedrig, bremskraft:hoch
rule r;
r.i = &infuzzy;
r.o = &outfuzzy.getValue;
r.oname = outfuzzy.getName;
ruleset ~= r;
}
fuzzyset[] calculate (double value) {
fuzzyset[] result;
// als resultat erhält man ein fuzzyset:
// scharfe eingangsgröße wird jetzt angegeben
// die entspricht je regel
// einem infuzzy.member wert
// dieser enspricht dem wert des outfuzzy.members;
foreach (r; ruleset) {
fuzzyset res;
res.member = r.oname;
res.value = r.i(value);
result ~= res;
}
return result;
}
double gravity (fuzzyset[] fset, double[string] ovalue) {
float up = 0;
float down =0;
//float x =0;
foreach (r; fset) {
up += (r.value*float(ovalue[r.member]));
down += r.value;
}
if (down <= 0) return 0;
assert (down > 0, "Division by Zero!");
//x = up/down;
return (up/down);
}
};
}