miniprojet/tests/examples/k_proches_voisins.cpp

91 lines
1.9 KiB
C++
Raw Normal View History

2019-12-09 10:38:58 +00:00
#include <map>
#include <math.hpp>
#include <stdexcept>
double distance(math::csignal v1, math::csignal v2, int n){
2019-12-09 16:05:36 +00:00
2019-12-09 10:38:58 +00:00
if (v1.size() != v2.size()) {
throw std::runtime_error("les deux vecteurs doivent être de même longueur");
};
2019-12-09 16:05:36 +00:00
2019-12-09 10:38:58 +00:00
int m = v1.size();
double d;
double di;
2019-12-09 16:05:36 +00:00
for (int i = 0 ; i<m ; ++i){
2019-12-09 10:38:58 +00:00
di = std::abs(v1[i] - v2[i]);
di = std::pow(di, n);
d = d + di;
};
d = std::pow(d, 1/n);
return d;
};
2019-12-09 16:05:36 +00:00
int argmax(vector<int> v){
int arg = 0;
int max = v[0];
int n = v.size();
for(int i = 1; i < n ; ++i){
if (v[i]>max){
arg = i;
max = v[i];
};
};
return arg
};
2019-12-09 10:38:58 +00:00
int main(math::csignal new_vect, map< math::csignal, std::string > dico, int k){
double d;
vector< std::pair<double , math::csignal> > k_min;
int avance = 0;
int arret = 0;
int droite = 0;
int gauche = 0;
int rejet = 0;
2019-12-09 16:05:36 +00:00
vector<int> vchoix;
2019-12-09 10:38:58 +00:00
for(auto& ref_vect : dico){
d = distance(new_vect, ref_vect.first );
if (k_min.size() < k ){
k_min.push_back({d, ref_vect.first});
} else if (d < k_min[k-1].first){
k_min.push_back({d, ref_vect.first});
sort(k_min.begin(), k_min.end());
k_min.pop_back();
};
2019-12-09 16:05:36 +00:00
2019-12-09 10:38:58 +00:00
} ;
for(auto i = k_min.begin(); i != k_min.end(); i++) {
if (dico[k_min[i].second].second == "avance"){
avance = avance + 1
2019-12-09 16:05:36 +00:00
} else if (dico[k_min[i].second].second == "arret"){
2019-12-09 10:38:58 +00:00
arret = arret + 1
2019-12-09 16:05:36 +00:00
} else if (dico[k_min[i].second].second == "droite"){
2019-12-09 10:38:58 +00:00
arret = droite + 1
2019-12-09 16:05:36 +00:00
} else if (dico[k_min[i].second].second == "gauche"){
2019-12-09 10:38:58 +00:00
arret = gauche + 1
2019-12-09 16:05:36 +00:00
} else if (dico[k_min[i].second].second == "rejet"){
2019-12-09 10:38:58 +00:00
arret = rejet + 1
2019-12-09 16:05:36 +00:00
}
};
vchoix.push_back(avance);
vchoix.push_back(arret);
vchoix.push_back(droite);
vchoix.push_back(gauche);
vchoix.push_back(rejet);
int nchoix = argmax(vchoix);
string choix ;
if (nchoix == 0){
choix = "avance"
} else if (nchoix == 1){
choix = "arret"
} else if (nchoix == 2){
choix = "droite"
} else if (nchoix == 3){
choix = "gauche"
} else if (nchoix == 4){
choix = "rejet"
}
2019-12-09 10:38:58 +00:00
};