void Update() { distanciaCentro = Vector3.Distance(centro.position, playerPosition.position); if (tiempoRest > 0) { tiempoRest -= Time.deltaTime; } // Creación del sistema WriteLine("Gestión de la velocidad de los enemigos", true); FuzzySystem system = new FuzzySystem("Gestión de la velocidad de los enemigos"); WriteLine("1) Agregar las variables", true); // Agregar la variable lingüística "Proximidad" (de 0 a 95 m) WriteLine("Agregar la variable Proximidad"); LinguisticVariable proximidad = new LinguisticVariable("Proximidad", 0, 95); proximidad.AddValue(new LinguisticValue("Cerca", new LeftFuzzySet(0, 95, 0, 30))); proximidad.AddValue(new LinguisticValue("Media", new TrapezoidalFuzzySet(0, 95, 0, 30, 20, 50))); proximidad.AddValue(new LinguisticValue("Lejos", new RightFuzzySet(0, 95, 40, 65))); system.addInputVariable(proximidad); // Agregar la variable lingüística "Tiempo" (de 0 a 200 s) WriteLine("Agregar la variable Tiempo"); LinguisticVariable tiempo = new LinguisticVariable("Tiempo", 0, 200); tiempo.AddValue(new LinguisticValue("Muy Poco", new LeftFuzzySet(0, 200, 40, 60))); tiempo.AddValue(new LinguisticValue("Poco", new TrapezoidalFuzzySet(0, 200, 40, 60, 90, 110))); tiempo.AddValue(new LinguisticValue("Mitad", new TrapezoidalFuzzySet(0, 200, 90, 110, 140, 160))); tiempo.AddValue(new LinguisticValue("Mucho", new RightFuzzySet(0, 200, 140, 160))); system.addInputVariable(tiempo); // Agregar la variable lingüística "Velocidad" (de 500 a 5000) WriteLine("Agregar la variable Velocidad"); LinguisticVariable velocidad = new LinguisticVariable("Velocidad", 500, 5000); velocidad.AddValue(new LinguisticValue("Lenta", new LeftFuzzySet(500, 5000, 1000, 2000))); velocidad.AddValue(new LinguisticValue("Normal", new TrapezoidalFuzzySet(500, 5000, 1000, 2000, 3000, 4000))); velocidad.AddValue(new LinguisticValue("Rápida", new RightFuzzySet(500, 5000, 3000, 4000))); system.addOutputVariable(velocidad); WriteLine("2) Agregar las reglas", true); // Creación de las reglas en función de la matriz siguiente: // Cuanto mayor sea la Proximidad y menor sea el Tiempo, más Velocidad tendrán. // P \ T || L | M | C | // Muy Poco || N | R | R | // Poco || N | N | R | // Mitad || L | N | N | // Mucho || L | L | N | system.addFuzzyRule("IF Proximidad IS Lejos AND Tiempo IS Muy Poco THEN Velocidad IS Normal"); system.addFuzzyRule("IF Proximidad IS Lejos AND Tiempo IS Poco THEN Velocidad IS Normal"); system.addFuzzyRule("IF Proximidad IS Lejos AND Tiempo IS Mitad THEN Velocidad IS Lenta"); system.addFuzzyRule("IF Proximidad IS Lejos AND Tiempo IS Mucho THEN Velocidad IS Lenta"); system.addFuzzyRule("IF Proximidad IS Media AND Tiempo IS Muy Poco THEN Velocidad IS Rápida"); system.addFuzzyRule("IF Proximidad IS Media AND Tiempo IS Poco THEN Velocidad IS Normal"); system.addFuzzyRule("IF Proximidad IS Media AND Tiempo IS Mitad THEN Velocidad IS Normal"); system.addFuzzyRule("IF Proximidad IS Media AND Tiempo IS Mucho THEN Velocidad IS Lenta"); system.addFuzzyRule("IF Proximidad IS Cerca AND Tiempo IS Muy Poco THEN Velocidad IS Rápida"); system.addFuzzyRule("IF Proximidad IS Cerca AND Tiempo IS Poco THEN Velocidad IS Rápida"); system.addFuzzyRule("IF Proximidad IS Cerca AND Tiempo IS Mitad THEN Velocidad IS Normal"); system.addFuzzyRule("IF Proximidad IS Cerca AND Tiempo IS Mucho THEN Velocidad IS Normal"); WriteLine("12 reglas agregadas \n"); WriteLine("3) Resolución de casos prácticos", true); WriteLine("Caso 1:", true); WriteLine("T = 30 (Muy Poco)"); WriteLine("P = 800 (Cerca)"); system.SetInputVariable(tiempo, tiempoRest); system.SetInputVariable(proximidad, distanciaCentro); WriteLine("Resultado: " + system.Solve() + "\n"); enemyVelocity = system.Solve(); system.ResetCase(); //// Caso práctico 2: Tiempo de 180s, proximidad a la meta de 280m //system.ResetCase(); //WriteLine("Caso 2:", true); //WriteLine("T = 180 (Mucho)"); //WriteLine("P = 280 (Lejos)"); //system.SetInputVariable(tiempo, 180); //system.SetInputVariable(proximidad, 280); //WriteLine("Resultado: " + system.Solve() + "\n"); //// Caso práctico 3: Tiempo de 70s, proximidad a la meta de 530m //system.ResetCase(); //WriteLine("Caso 3:", true); //WriteLine("T = 70 (Poco)"); //WriteLine("P = 530 (Media)"); //system.SetInputVariable(tiempo, 70); //system.SetInputVariable(proximidad, 530); //WriteLine("Resultado: " + system.Solve() + "\n"); //// Caso práctico 4: Tiempo de 120s, proximidad a la meta de 120m //system.ResetCase(); //WriteLine("Caso 4:", true); //WriteLine("T = 120 (Mitad)"); //WriteLine("P = 120 (Lejos)"); //system.SetInputVariable(tiempo, 120); //system.SetInputVariable(proximidad, 120); //WriteLine("Resultado: " + system.Solve() + "\n"); //// Caso práctico 5 : Tiempo de 10s, proximidad a la meta de 450m //system.ResetCase(); //WriteLine("Caso 5:", true); //WriteLine("T = 10 (Muy Poco)"); //WriteLine("P = 450 (Media)"); //system.SetInputVariable(tiempo, 10); //system.SetInputVariable(proximidad, 450); //WriteLine("Resultado: " + system.Solve() + "\n"); }
private void SetRules() { //Lo siento mucho, pero son muchas reglas con 3 valores lingüisticos system.addFuzzyRule("IF Velocidad IS Muchisima THEN Damage IS Mucho"); system.addFuzzyRule("IF Velocidad IS Mucha THEN Damage IS Mucho"); system.addFuzzyRule("IF Velocidad IS Poca THEN Damage IS Poco"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Poca AND Peso IS Poco THEN Damage IS Poco"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Poca AND Peso IS Medio THEN Damage IS Normal"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Poca AND Peso IS Mucho THEN Damage IS Mucho"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Media AND Peso IS Poco THEN Damage IS Poco"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Media AND Peso IS Medio THEN Damage IS Poco"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Media AND Peso IS Mucho THEN Damage IS Normal"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Mucha AND Peso IS Poco THEN Damage IS Poco"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Mucha AND Peso IS Medio THEN Damage IS Poco"); system.addFuzzyRule("IF Velocidad IS Media AND Distancia IS Mucha AND Peso IS Mucho THEN Damage IS Poco"); }
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) { ; } }