MarcEricMartel d79d1123d1 PERCEPTRONIC
2023-05-03 10:51:31 -04:00

91 lines
3.7 KiB
C#

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; }
/// <summary>
/// Constructeur de la classe. Crée un perceptron pour une réponse(caractère) qu'on veut identifier le pattern(modèle)
/// </summary>
/// <param name="reponse">La classe que défini le perceptron</param>
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();
}
/// <summary>
/// Faire l'apprentissage sur un ensemble de coordonnées. Ces coordonnées sont les coordonnées de tous les caractères analysés.
/// </summary>
/// <param name="lstCoord">La liste de coordonnées pour les caractères à analysés.</param>
/// <returns>Les paramètres de la console</returns>
public string Entrainement(List<Squelette> 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")} %"; ;
}
/// <summary>
/// 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é.
/// </summary>
/// <param name="vecteurSyn">Les poids synaptiques du perceptron</param>
/// <param name="entree">Le vecteur de bit correspondant aux couleurs du caractère</param>
/// <returns>Vrai ou faux</returns>
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;
}
/// <summary>
/// Interroge la neuronnes pour un ensembles des coordonnées(d'un caractère).
/// </summary>
/// <param name="squel"></param>
/// <returns></returns>
public bool TesterNeurone(Squelette squel) => ValeurEstime(_poidsSyn, squel.Points) == CstApplication.VRAI ? true : false;
}
}