using FuzzyLogicPCL;
using FuzzyLogicPCL.FuzzySets;
using System;
namespace FuzzyLogicApp
{
class Program
{
static void Main(string[] args)
{
// Création du système
WriteLine("Gestion du zoom GPS", true);
FuzzySystem system = new FuzzySystem("Gestion du zoom GPS");
WriteLine("1) Ajout des variables", true);
// Ajout de la variable linguistique "Distance" (de 0 à 500 000 m)
WriteLine("Ajout de la variable Distance");
LinguisticVariable distance = new LinguisticVariable("Distance", 0, 500000);
distance.AddValue(new LinguisticValue("Faible", new LeftFuzzySet(0, 500000, 30, 50)));
distance.AddValue(new LinguisticValue("Moyenne", new TrapezoidalFuzzySet(0, 500000, 40, 50, 100, 150)));
distance.AddValue(new LinguisticValue("Grande", new RightFuzzySet(0, 500000, 100, 150)));
system.addInputVariable(distance);
// Ajout de la variable linguistique "Vitesse" (de 0 à 200)
WriteLine("Ajout de la variable Vitesse");
LinguisticVariable vitesse = new LinguisticVariable("Vitesse", 0, 200);
vitesse.AddValue(new LinguisticValue("Lente", new LeftFuzzySet(0, 200, 20, 30)));
vitesse.AddValue(new LinguisticValue("PeuRapide", new TrapezoidalFuzzySet(0, 200, 20, 30, 70, 80)));
vitesse.AddValue(new LinguisticValue("Rapide", new TrapezoidalFuzzySet(0, 200, 70, 80, 90, 110)));
vitesse.AddValue(new LinguisticValue("TresRapide", new RightFuzzySet(0, 200, 90, 110)));
system.addInputVariable(vitesse);
// Ajout de la variable linguistique "Zoom" (de 1 à 5)
WriteLine("Ajout de la variable Zoom");
LinguisticVariable zoom = new LinguisticVariable("Zoom", 0, 5);
zoom.AddValue(new LinguisticValue("Petit", new LeftFuzzySet(0, 5, 1, 2)));
zoom.AddValue(new LinguisticValue("Normal", new TrapezoidalFuzzySet(0, 5, 1, 2, 3, 4)));
zoom.AddValue(new LinguisticValue("Gros", new RightFuzzySet(0, 5, 3, 4)));
system.addOutputVariable(zoom);
WriteLine("2) Ajout des règles", true);
// Création des règles selon la matrice suivante :
// Plus le zoom est petit, plus on voit loin (mais moins détaillé)
// V \ D || F | M | G |
// Lent || N | P | P |
// Peu Ra || N | N | P |
// Rapide || G | N | P |
// Très R || G | G | P |
system.addFuzzyRule("IF Distance IS Grande THEN Zoom IS Petit");
system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS Lente THEN Zoom IS Normal");
system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS PeuRapide THEN Zoom IS Normal");
system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS Rapide THEN Zoom IS Gros");
system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS TresRapide THEN Zoom IS Gros");
system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS Lente THEN Zoom IS Petit");
system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS PeuRapide THEN Zoom IS Normal");
system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS Rapide THEN Zoom IS Normal");
system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS TresRapide THEN Zoom IS Gros");
WriteLine("9 règles ajoutées \n");
WriteLine("3) Résolution de cas pratiques", true);
// Cas pratique 1 : vitesse de 35 kms/h, et prochain changement de direction à 70m
WriteLine("Cas 1 :", true);
WriteLine("V = 35 (peu rapide)");
WriteLine("D = 70 (moyenne)");
system.SetInputVariable(vitesse, 35);
system.SetInputVariable(distance, 70);
WriteLine("Attendu : zoom normal, centroïde à 2.5");
WriteLine("Résultat : " + system.Solve() + "\n");
// Cas pratique 2 : vitesse de 25 kms/h, et prochain changement de direction à 70m
system.ResetCase();
WriteLine("Cas 2 :", true);
WriteLine("V = 25 (50% lente, 50% peu rapide)");
WriteLine("D = 70 (moyenne)");
system.SetInputVariable(vitesse, 25);
system.SetInputVariable(distance, 70);
WriteLine("Attendu : zoom normal à 50% + zoom petit à 50%");
WriteLine("Résultat : " + system.Solve() + "\n");
// Cas pratique 3 : vitesse de 72.5 kms/h, et prochain changement de direction à 40m
system.ResetCase();
WriteLine("Cas 3 :", true);
WriteLine("V = 72.5 (75% peu rapide + 25% rapide)");
WriteLine("D = 40 (50% faible)");
system.SetInputVariable(vitesse, 72.5);
system.SetInputVariable(distance, 40);
WriteLine("Attendu : zoom normal à 50% + zoom gros à 25%");
WriteLine("Résultat : " + system.Solve() + "\n");
// Cas pratique 4 : vitesse de 100 kms/h, et prochain changement de direction à 110m
system.ResetCase();
WriteLine("Cas 4 :", true);
WriteLine("V = 100 (50% rapide + 50% très rapide)");
WriteLine("D = 110 (80% moyenne, 20% grande)");
system.SetInputVariable(vitesse, 100);
system.SetInputVariable(distance, 110);
WriteLine("Attendu : zoom petit à 20% + zoom normal à 50% + zoom gros à 50%");
WriteLine("Résultat : " + system.Solve() + "\n");
// Cas pratique 5 : vitesse de 45 kms/h, et prochain changement de direction à 160m
system.ResetCase();
WriteLine("Cas 5 :", true);
WriteLine("V = 45 (100% peu rapide)");
WriteLine("D = 160 (100% grande)");
system.SetInputVariable(vitesse, 45);
system.SetInputVariable(distance, 160);
WriteLine("Attendu : zoom petit à 100%");
WriteLine("Résultat : " + system.Solve() + "\n");
while (true) ;
}
///
/// Aide pour l'écriture de messages en console (et ajouts d'*)
///
/// Message à afficher
/// Besoin d'astérisques ?
private static void WriteLine(string msg, bool stars = false)
{
if (stars)
{
msg = "*** " + msg + " ";
while (msg.Length < 45)
{
msg += "*";
}
}
Console.WriteLine(msg);
}
}
}