Program.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using FuzzyLogicPCL;
  2. using FuzzyLogicPCL.FuzzySets;
  3. using System;
  4. namespace FuzzyLogicApp
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. // Création du système
  11. WriteLine("Gestion du zoom GPS", true);
  12. FuzzySystem system = new FuzzySystem("Gestion du zoom GPS");
  13. WriteLine("1) Ajout des variables", true);
  14. // Ajout de la variable linguistique "Distance" (de 0 à 500 000 m)
  15. WriteLine("Ajout de la variable Distance");
  16. LinguisticVariable distance = new LinguisticVariable("Distance", 0, 500000);
  17. distance.AddValue(new LinguisticValue("Faible", new LeftFuzzySet(0, 500000, 30, 50)));
  18. distance.AddValue(new LinguisticValue("Moyenne", new TrapezoidalFuzzySet(0, 500000, 40, 50, 100, 150)));
  19. distance.AddValue(new LinguisticValue("Grande", new RightFuzzySet(0, 500000, 100, 150)));
  20. system.addInputVariable(distance);
  21. // Ajout de la variable linguistique "Vitesse" (de 0 à 200)
  22. WriteLine("Ajout de la variable Vitesse");
  23. LinguisticVariable vitesse = new LinguisticVariable("Vitesse", 0, 200);
  24. vitesse.AddValue(new LinguisticValue("Lente", new LeftFuzzySet(0, 200, 20, 30)));
  25. vitesse.AddValue(new LinguisticValue("PeuRapide", new TrapezoidalFuzzySet(0, 200, 20, 30, 70, 80)));
  26. vitesse.AddValue(new LinguisticValue("Rapide", new TrapezoidalFuzzySet(0, 200, 70, 80, 90, 110)));
  27. vitesse.AddValue(new LinguisticValue("TresRapide", new RightFuzzySet(0, 200, 90, 110)));
  28. system.addInputVariable(vitesse);
  29. // Ajout de la variable linguistique "Zoom" (de 1 à 5)
  30. WriteLine("Ajout de la variable Zoom");
  31. LinguisticVariable zoom = new LinguisticVariable("Zoom", 0, 5);
  32. zoom.AddValue(new LinguisticValue("Petit", new LeftFuzzySet(0, 5, 1, 2)));
  33. zoom.AddValue(new LinguisticValue("Normal", new TrapezoidalFuzzySet(0, 5, 1, 2, 3, 4)));
  34. zoom.AddValue(new LinguisticValue("Gros", new RightFuzzySet(0, 5, 3, 4)));
  35. system.addOutputVariable(zoom);
  36. WriteLine("2) Ajout des règles", true);
  37. // Création des règles selon la matrice suivante :
  38. // Plus le zoom est petit, plus on voit loin (mais moins détaillé)
  39. // V \ D || F | M | G |
  40. // Lent || N | P | P |
  41. // Peu Ra || N | N | P |
  42. // Rapide || G | N | P |
  43. // Très R || G | G | P |
  44. system.addFuzzyRule("IF Distance IS Grande THEN Zoom IS Petit");
  45. system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS Lente THEN Zoom IS Normal");
  46. system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS PeuRapide THEN Zoom IS Normal");
  47. system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS Rapide THEN Zoom IS Gros");
  48. system.addFuzzyRule("IF Distance IS Faible AND Vitesse IS TresRapide THEN Zoom IS Gros");
  49. system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS Lente THEN Zoom IS Petit");
  50. system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS PeuRapide THEN Zoom IS Normal");
  51. system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS Rapide THEN Zoom IS Normal");
  52. system.addFuzzyRule("IF Distance IS Moyenne AND Vitesse IS TresRapide THEN Zoom IS Gros");
  53. WriteLine("9 règles ajoutées \n");
  54. WriteLine("3) Résolution de cas pratiques", true);
  55. // Cas pratique 1 : vitesse de 35 kms/h, et prochain changement de direction à 70m
  56. WriteLine("Cas 1 :", true);
  57. WriteLine("V = 35 (peu rapide)");
  58. WriteLine("D = 70 (moyenne)");
  59. system.SetInputVariable(vitesse, 35);
  60. system.SetInputVariable(distance, 70);
  61. WriteLine("Attendu : zoom normal, centroïde à 2.5");
  62. WriteLine("Résultat : " + system.Solve() + "\n");
  63. // Cas pratique 2 : vitesse de 25 kms/h, et prochain changement de direction à 70m
  64. system.ResetCase();
  65. WriteLine("Cas 2 :", true);
  66. WriteLine("V = 25 (50% lente, 50% peu rapide)");
  67. WriteLine("D = 70 (moyenne)");
  68. system.SetInputVariable(vitesse, 25);
  69. system.SetInputVariable(distance, 70);
  70. WriteLine("Attendu : zoom normal à 50% + zoom petit à 50%");
  71. WriteLine("Résultat : " + system.Solve() + "\n");
  72. // Cas pratique 3 : vitesse de 72.5 kms/h, et prochain changement de direction à 40m
  73. system.ResetCase();
  74. WriteLine("Cas 3 :", true);
  75. WriteLine("V = 72.5 (75% peu rapide + 25% rapide)");
  76. WriteLine("D = 40 (50% faible)");
  77. system.SetInputVariable(vitesse, 72.5);
  78. system.SetInputVariable(distance, 40);
  79. WriteLine("Attendu : zoom normal à 50% + zoom gros à 25%");
  80. WriteLine("Résultat : " + system.Solve() + "\n");
  81. // Cas pratique 4 : vitesse de 100 kms/h, et prochain changement de direction à 110m
  82. system.ResetCase();
  83. WriteLine("Cas 4 :", true);
  84. WriteLine("V = 100 (50% rapide + 50% très rapide)");
  85. WriteLine("D = 110 (80% moyenne, 20% grande)");
  86. system.SetInputVariable(vitesse, 100);
  87. system.SetInputVariable(distance, 110);
  88. WriteLine("Attendu : zoom petit à 20% + zoom normal à 50% + zoom gros à 50%");
  89. WriteLine("Résultat : " + system.Solve() + "\n");
  90. // Cas pratique 5 : vitesse de 45 kms/h, et prochain changement de direction à 160m
  91. system.ResetCase();
  92. WriteLine("Cas 5 :", true);
  93. WriteLine("V = 45 (100% peu rapide)");
  94. WriteLine("D = 160 (100% grande)");
  95. system.SetInputVariable(vitesse, 45);
  96. system.SetInputVariable(distance, 160);
  97. WriteLine("Attendu : zoom petit à 100%");
  98. WriteLine("Résultat : " + system.Solve() + "\n");
  99. while (true) ;
  100. }
  101. /// <summary>
  102. /// Aide pour l'écriture de messages en console (et ajouts d'*)
  103. /// </summary>
  104. /// <param name="msg">Message à afficher</param>
  105. /// <param name="stars">Besoin d'astérisques ?</param>
  106. private static void WriteLine(string msg, bool stars = false)
  107. {
  108. if (stars)
  109. {
  110. msg = "*** " + msg + " ";
  111. while (msg.Length < 45)
  112. {
  113. msg += "*";
  114. }
  115. }
  116. Console.WriteLine(msg);
  117. }
  118. }
  119. }