-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuzzycontroller.cpp
45 lines (37 loc) · 1.54 KB
/
fuzzycontroller.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
#include "fuzzycontroller.h"
#include <iostream>
FuzzyController::FuzzyController(){
}
void FuzzyController::addRule(Rule rule){
rules_list.push_back(rule);
}
float FuzzyController::getOut(){
float out = 0.0;
std::list<RuleOutput> unique_rules_outputs_list;
for (std::list<Rule>::iterator it=rules_list.begin(); it != rules_list.end(); ++it){
if(isObjectUnique(unique_rules_outputs_list, *it)){
unique_rules_outputs_list.push_back(RuleOutput(it->calculate_input(), it->getOutValue(), *it->getOutMembership()));
}
}
int32_t weights_sum = 0;
for (std::list<RuleOutput>::iterator it=unique_rules_outputs_list.begin(); it != unique_rules_outputs_list.end(); ++it){
weights_sum += it->input_membership_value;
out += it->input_membership_value * it->out_value;
}
out /= weights_sum;
return out;
}
uint8_t FuzzyController::isObjectUnique(std::list<RuleOutput> &unique_list, Rule object){
for (std::list<RuleOutput>::iterator it=unique_list.begin(); it != unique_list.end(); ++it){
if(it->out_membership == object.getOutMembership()){
it->input_membership_value = std::max(it->input_membership_value, object.calculate_input()); //updateing max input;
return false;
}
}
return true;
}
FuzzyController::RuleOutput::RuleOutput(int32_t input_membership_value, int32_t out_value, Membership &out_membership){
this->input_membership_value = input_membership_value;
this->out_value = out_value;
this->out_membership = &out_membership;
}