using JeuHoy_WPF; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; namespace JeuHoy_WPF_Natif.Model { public class Perceptron { private double _cstApprentissage; private double[] _poidsSyn; private string _reponse = "?"; public string Reponse { get => _reponse; } /// /// Constructeur de la classe. Crée un perceptron pour une réponse(caractère) qu'on veut identifier le pattern(modèle) /// /// La classe que défini le perceptron public Perceptron(string reponse) { Random _rand = new Random(); _reponse = reponse; _cstApprentissage = CstApplication.CONSTANTEAPPRENTISSAGE; _poidsSyn = new double[CstApplication.SKELETONCOUNT * 2]; for (int x = 0; x < CstApplication.SKELETONCOUNT - 1; ++x) _poidsSyn[x] = _rand.NextDouble(); } /// /// Faire l'apprentissage sur un ensemble de coordonnées. Ces coordonnées sont les coordonnées de tous les caractères analysés. /// /// La liste de coordonnées pour les caractères à analysés. /// Les paramètres de la console public string Entrainement(List lstCoord) { int iNbItérations = 0, iNbErreurs = 0; double dSum = 0, dPourSucc = 0; do { iNbErreurs = 0; foreach (Squelette coord in lstCoord) { dSum = _poidsSyn[0]; for (int j = 1; j < _poidsSyn.Length; ++j) dSum += _poidsSyn[j] * coord.Points[j - 1]; int iRes = (dSum >= 0) ? 1 : 0; int iErr = (_reponse == coord.Reponse ? 1 : 0) - iRes; if (iErr != 0) { _poidsSyn[0] = _cstApprentissage; for (int j = 1; j < _poidsSyn.Length; ++j) _poidsSyn[j] += _cstApprentissage * iErr * coord.Points[j - 1]; ++iNbErreurs; } } dPourSucc = (double)(lstCoord.Count - iNbErreurs) / (double)lstCoord.Count * 100.0; ++iNbItérations; } while (dPourSucc < CstApplication.POURCENTCONVERGENCE && iNbItérations < CstApplication.MAXITERATION); return $"Perceptron: {_reponse}; Itérations: {iNbItérations} Taux Réussite: {dPourSucc.ToString("0.00")} %"; ; } /// /// Calcul la valeur(vrai ou faux) pour un les coordonnées d'un caractère. Permet au perceptron d'évaluer la valeur de vérité. /// /// Les poids synaptiques du perceptron /// Le vecteur de bit correspondant aux couleurs du caractère /// Vrai ou faux public int ValeurEstime(double[] vecteurSyn, double[] entree) { double dSum = vecteurSyn[0]; for (int j = 1; j < vecteurSyn.Length; ++j) dSum += vecteurSyn[j] * entree[j - 1]; return (dSum >= 0) ? CstApplication.VRAI : CstApplication.FAUX; } /// /// Interroge la neuronnes pour un ensembles des coordonnées(d'un caractère). /// /// /// public bool TesterNeurone(Squelette squel) => ValeurEstime(_poidsSyn, squel.Points) == CstApplication.VRAI ? true : false; } }