/// <summary> /// Returns the mouse speed given the hand movement variation. /// </summary> /// <param name="value">variation of movement</param> /// <returns></returns> public double Get(float value) { //create fuzzy engine fuzzyEngine = new FuzzyEngineFactory().Default(); // movement fuzzy sets var variation = new LinguisticVariable("Variation"); var litle = variation.MembershipFunctions.AddTrapezoid("Litle", 0, 0, 40, 80); var medium = variation.MembershipFunctions.AddTriangle("Medium", 30, 90, 110); var big = variation.MembershipFunctions.AddTrapezoid("Big", 75, 110, 400, 400); // speed fuzzy sets var speed = new LinguisticVariable("Speed"); var slow = speed.MembershipFunctions.AddTrapezoid("slow", 0, 0, 5, 10); var normal = speed.MembershipFunctions.AddTrapezoid("normal", 10, 20, 30, 40); var fast = speed.MembershipFunctions.AddTriangle("fast", 20, 70, 70); //fuzzy rules var rule1 = Rule.If(variation.Is(litle)).Then(speed.Is(slow)); var rule2 = Rule.If(variation.Is(medium)).Then(speed.Is(normal)); var rule3 = Rule.If(variation.Is(big)).Then(speed.Is(fast)); // add rules fuzzyEngine.Rules.Add(rule1, rule2, rule3); //defuzify and return results return(fuzzyEngine.Defuzzify(new { variation = (int)value })); }
public FuzzyChaseState(Monster pawn) : base(pawn) { engine_chaseSpeed = new FuzzyEngineFactory().Default(); engine_playerEscape = new FuzzyEngineFactory().Default(); distanceToPlayer = new LinguisticVariable("distanceToPlayer"); var near = distanceToPlayer.MembershipFunctions.AddTrapezoid("Near", 0, 10, 25, 40); var mid = distanceToPlayer.MembershipFunctions.AddTrapezoid("Mid", 25, 40, 55, 70); var far = distanceToPlayer.MembershipFunctions.AddTrapezoid("Far", 55, 70, 85, 100); var veryfar = distanceToPlayer.MembershipFunctions.AddTrapezoid("VeryFar", 55, 90, 120, 160); chaseSpeed = new LinguisticVariable("chaseSpeed"); var slow = chaseSpeed.MembershipFunctions.AddTrapezoid("Slow", 0.5, 0.7, 0.9, 1.2); var normal = chaseSpeed.MembershipFunctions.AddTrapezoid("Normal", 0.8, 1.4, 1.8, 2.2); var fast = chaseSpeed.MembershipFunctions.AddTrapezoid("Fast", 1.4, 2, 2.5, 4); lostPlayer = new LinguisticVariable("lostPlayer"); var lost = lostPlayer.MembershipFunctions.AddRectangle("Lost", 0, 1); var notLost = lostPlayer.MembershipFunctions.AddRectangle("NotLost", -1, 0); var chaseSpeed_rule1 = Rule.If(distanceToPlayer.Is(far)).Then(chaseSpeed.Is(fast)); var chaseSpeed_rule2 = Rule.If(distanceToPlayer.Is(mid)).Then(chaseSpeed.Is(normal)); var chaseSpeed_rule3 = Rule.If(distanceToPlayer.Is(near)).Then(chaseSpeed.Is(slow)); var lostPlayer_rule1 = Rule.If(distanceToPlayer.Is(veryfar)).Then(lostPlayer.Is(lost)); var lostPlayer_rule2 = Rule.If(distanceToPlayer.Is(far).Or(distanceToPlayer.Is(mid)).Or(distanceToPlayer.Is(near))).Then(lostPlayer.Is(notLost)); engine_chaseSpeed.Rules.Add(chaseSpeed_rule1, chaseSpeed_rule2, chaseSpeed_rule3); engine_playerEscape.Rules.Add(lostPlayer_rule1, lostPlayer_rule2); }
public void Test1() { LinguisticVariable water = new LinguisticVariable("Water"); var cold = water.MembershipFunctions.AddTrapezoid("Cold", 0, 0, 20, 40); var warm = water.MembershipFunctions.AddTriangle("Warm", 30, 50, 70); var hot = water.MembershipFunctions.AddTrapezoid("Hot", 50, 80, 100, 100); LinguisticVariable power = new LinguisticVariable("Power"); var low = power.MembershipFunctions.AddTriangle("Low", 0, 25, 50); var high = power.MembershipFunctions.AddTriangle("High", 25, 50, 75); IFuzzyEngine fuzzyEngine = new FuzzyEngineFactory().Default(); fuzzyEngine.Rules.If(water.Is(cold).Or(water.Is(warm))).Then(power.Is(high)); fuzzyEngine.Rules.If(water.Is(hot)).Then(power.Is(low)); var result = fuzzyEngine.Defuzzify(new { water = 60 }); }
// Start is called before the first frame update void Start() { var speed = new LinguisticVariable("Speed"); var slow = speed.MembershipFunctions.AddTrapezoid("Slow", 0, 0, 30, 50); var average = speed.MembershipFunctions.AddTrapezoid("Average", 30, 50, 80, 90); var fast = speed.MembershipFunctions.AddTrapezoid("Fast", 80, 90, 200, 200); var reactionTime = new LinguisticVariable("ReactionTime"); var bad = reactionTime.MembershipFunctions.AddTrapezoid("Bad", 0.5, 0.6, 3, 3); var mediocre = reactionTime.MembershipFunctions.AddTrapezoid("Mediocre", 0.3, 0.35f, 0.5f, 0.6); var good = reactionTime.MembershipFunctions.AddTrapezoid("Good", 0, 0, .3f, 0.35f); var speedVariability = new LinguisticVariable("Variability"); var low = speedVariability.MembershipFunctions.AddTrapezoid("Low", 0, 0, 2, 3); var medium = speedVariability.MembershipFunctions.AddTriangle("Medium", 2, 3, 5); var high = speedVariability.MembershipFunctions.AddTrapezoid("High", 3, 5, 10, 10); var distance = new LinguisticVariable("Distance"); var close = distance.MembershipFunctions.AddTrapezoid("Close", 2, 2, 20, 30); var near = distance.MembershipFunctions.AddTriangle("Near", 30, 65, 100); var far = distance.MembershipFunctions.AddRectangle("Far", 100, 150); var rule1 = Rule.If(speed.Is(slow)).Then(distance.Is(close)); var rule2 = Rule.If(speed.Is(average)).Then(distance.Is(near)); var rule3 = Rule.If(speed.Is(fast)).Then(distance.Is(far)); var rule4 = Rule.If(reactionTime.Is(good)).Then(distance.Is(close)); var rule5 = Rule.If(reactionTime.Is(mediocre)).Then(distance.Is(near)); var rule6 = Rule.If(reactionTime.Is(bad)).Then(distance.Is(far)); var rule7 = Rule.If(speedVariability.Is(low)).Then(distance.Is(close)); var rule8 = Rule.If(speedVariability.Is(medium)).Then(distance.Is(near)); var rule9 = Rule.If(speedVariability.Is(high)).Then(distance.Is(far)); engine = new FuzzyEngineFactory().Default(); engine.Rules.Add(rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8, rule9); }
void Start() { rbody = GetComponent <Rigidbody>(); // Here we need to setup the Fuzzy Inference System distance = new LinguisticVariable("distance"); var veryFarRightDis = distance.MembershipFunctions.AddTrapezoid("veryfarright", -100, -99, -69, -63); var farRightDis = distance.MembershipFunctions.AddTrapezoid("farright", -69, -63, -39, -33); var rightDis = distance.MembershipFunctions.AddTrapezoid("right", -39, -33, -9, -1); var noneDis = distance.MembershipFunctions.AddTrapezoid("none", -5, -0.5, 0.5, 5); var leftDis = distance.MembershipFunctions.AddTrapezoid("left", 1, 9, 33, 39); var farLeftDis = distance.MembershipFunctions.AddTrapezoid("farleft", 33, 39, 63, 69); var veryFarLeftDis = distance.MembershipFunctions.AddTrapezoid("veryfarleft", 63, 69, 99, 100); direction = new LinguisticVariable("distance"); var veryFarRightDir = direction.MembershipFunctions.AddTrapezoid("veryfarright", -100, -99, -69, -63); var farRightDir = direction.MembershipFunctions.AddTrapezoid("farright", -69, -63, -39, -33); var rightDir = direction.MembershipFunctions.AddTrapezoid("right", -39, -33, -9, -1); var noneDir = direction.MembershipFunctions.AddTrapezoid("none", -5, -0.5, 0.5, 5); var leftDir = direction.MembershipFunctions.AddTrapezoid("left", 1, 9, 33, 39); var farLeftDir = direction.MembershipFunctions.AddTrapezoid("farleft", 33, 39, 63, 69); var VeryFarLeftDir = direction.MembershipFunctions.AddTrapezoid("veryfarleft", 63, 69, 99, 100); speed = new LinguisticVariable("speed"); var veryFast = speed.MembershipFunctions.AddTrapezoid("Veryfast", -30, -28, -22, -20); var Fast = speed.MembershipFunctions.AddTrapezoid("fast", -22, -20, -12, -10); var slow = speed.MembershipFunctions.AddTrapezoid("slow", -12, -10, 2, 0); engine = new FuzzyEngineFactory().Default(); var rule1 = Rule.If(distance.Is(veryFarRightDis)).Then(direction.Is(VeryFarLeftDir)); var rule2 = Rule.If(distance.Is(farRightDis)).Then(direction.Is(farLeftDir)); var rule3 = Rule.If(distance.Is(rightDis)).Then(direction.Is(leftDir)); var rule4 = Rule.If(distance.Is(noneDis)).Then(direction.Is(noneDir)); var rule5 = Rule.If(distance.Is(leftDis)).Then(direction.Is(rightDir)); var rule6 = Rule.If(distance.Is(farLeftDis)).Then(direction.Is(farRightDir)); var rule7 = Rule.If(distance.Is(veryFarLeftDis)).Then(direction.Is(veryFarRightDir)); var speedrule1 = Rule.If(distance.Is(veryFarRightDis)).Then(speed.Is(veryFast)); var speedrule2 = Rule.If(distance.Is(veryFarLeftDis)).Then(speed.Is(veryFast)); var speedrule3 = Rule.If(distance.Is(farRightDis)).Then(speed.Is(Fast)); var speedrule4 = Rule.If(distance.Is(farLeftDis)).Then(speed.Is(Fast)); var speedrule5 = Rule.If(distance.Is(rightDis)).Then(speed.Is(slow)); var speedrule6 = Rule.If(distance.Is(leftDis)).Then(speed.Is(slow)); engine.Rules.Add(rule1, rule2, rule3, rule4, rule5, rule6, rule7, speedrule1, speedrule2, speedrule3, speedrule4, speedrule5, speedrule6); }
public void FuzzyEngine_InvalidInputs_Success() { //Arrange LinguisticVariable water = new LinguisticVariable("Water"); var cold = water.MembershipFunctions.AddTrapezoid("Cold", 0, 0, 20, 40); var warm = water.MembershipFunctions.AddTriangle("Warm", 30, 50, 70); var hot = water.MembershipFunctions.AddTrapezoid("Hot", 50, 80, 100, 100); LinguisticVariable power = new LinguisticVariable("Power"); var low = power.MembershipFunctions.AddTriangle("Low", 0, 25, 50); var high = power.MembershipFunctions.AddTriangle("High", 25, 50, 75); IFuzzyEngine fuzzyEngine = new FuzzyEngine(new CoGDefuzzification()); fuzzyEngine.Rules.If(water.Is(hot)).Then(power.Is(high)); //Act var result = fuzzyEngine.Defuzzify(new { water = "invalid input" }); //Assert }
public static double CalcularPoliza(double inputEnfermedadesActuales, double inputEnfermedadesHistoricas, double inputEstiloDeVida, double inputOcupacion) { LinguisticVariable enfermedadesActuales = new LinguisticVariable("EnfermedadesActuales"); var sano = enfermedadesActuales.MembershipFunctions.AddTrapezoid("Sano", 0, 0, 20, 40); var regular = enfermedadesActuales.MembershipFunctions.AddTriangle("Regular", 30, 50, 70); var malo = enfermedadesActuales.MembershipFunctions.AddTrapezoid("Malo", 60, 80, 100, 100); LinguisticVariable enfermedadesHistoricas = new LinguisticVariable("EnfermedadesHistoricas"); var bajas = enfermedadesHistoricas.MembershipFunctions.AddTrapezoid("Bajas", 0, 0, 20, 40); var normales = enfermedadesHistoricas.MembershipFunctions.AddTriangle("Normales", 30, 50, 70); var altas = enfermedadesHistoricas.MembershipFunctions.AddTrapezoid("Altas", 60, 80, 100, 100); LinguisticVariable estiloVida = new LinguisticVariable("EstiloVida"); var tranquilo = estiloVida.MembershipFunctions.AddTrapezoid("Tranquilo", 0, 0, 20, 40); var moderado = estiloVida.MembershipFunctions.AddTriangle("Moderado", 30, 50, 70); var reisgozo = estiloVida.MembershipFunctions.AddTrapezoid("Riesgozo", 60, 80, 100, 100); LinguisticVariable ocupacion = new LinguisticVariable("Ocupacion"); var ocupacionNormal = ocupacion.MembershipFunctions.AddTrapezoid("Normal", 0, 0, 20, 40); var ocupacionBajoRiezgo = ocupacion.MembershipFunctions.AddTriangle("Riesgoza", 30, 50, 70); var ocupacionAltoRiezgo = ocupacion.MembershipFunctions.AddTrapezoid("AltoRiezgo", 60, 80, 100, 100); LinguisticVariable estadoAseguramiento = new LinguisticVariable("EstadoAseguramiento"); var coberturaTotal = estadoAseguramiento.MembershipFunctions.AddTrapezoid("Total", 0, 0, 17.5, 30); var coberturaModerada = estadoAseguramiento.MembershipFunctions.AddTriangle("Moderada", 20, 37.5, 55); var coberturaBaja = estadoAseguramiento.MembershipFunctions.AddTriangle("Baja", 45, 62.5, 80); var coberturaNula = estadoAseguramiento.MembershipFunctions.AddTrapezoid("Nula", 70, 87.5, 100, 100); IFuzzyEngine fuzzyEngine = new FuzzyEngineFactory().Create(new CoGDefuzzification()); fuzzyEngine.Rules .If(enfermedadesActuales.Is(malo).Or(enfermedadesHistoricas.Is(altas))) .If(estiloVida.Is(reisgozo).Or(ocupacion.Is(ocupacionAltoRiezgo))) .Then(estadoAseguramiento.Is(coberturaNula)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(malo).Or(enfermedadesHistoricas.Is(altas))) .If(estiloVida.Is(reisgozo).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaNula)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(malo).Or(enfermedadesHistoricas.Is(altas))) .If(estiloVida.Is(moderado).And(ocupacion.Is(ocupacionAltoRiezgo))) .Then(estadoAseguramiento.Is(coberturaNula)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(malo).Or(enfermedadesHistoricas.Is(altas))) .If(estiloVida.Is(moderado).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaBaja)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(malo).Or(enfermedadesHistoricas.Is(altas))) .If(estiloVida.Is(moderado).And(ocupacion.Is(ocupacionNormal))) .Then(estadoAseguramiento.Is(coberturaBaja)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(malo).Or(enfermedadesHistoricas.Is(altas))) .If(estiloVida.Is(tranquilo).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaBaja)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(malo).Or(enfermedadesHistoricas.Is(altas))) .If(estiloVida.Is(tranquilo).And(ocupacion.Is(ocupacionNormal))) .Then(estadoAseguramiento.Is(coberturaModerada)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(regular).Or(enfermedadesHistoricas.Is(normales)).And(estiloVida.Is(reisgozo)).And(ocupacion.Is(ocupacionAltoRiezgo))) .Then(estadoAseguramiento.Is(coberturaNula)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(regular).Or(enfermedadesHistoricas.Is(normales)).And(estiloVida.Is(moderado)).And(ocupacion.Is(ocupacionAltoRiezgo))) .Then(estadoAseguramiento.Is(coberturaBaja)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(regular).Or(enfermedadesHistoricas.Is(normales)).And(estiloVida.Is(reisgozo)).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaBaja)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(regular).Or(enfermedadesHistoricas.Is(normales)).And(estiloVida.Is(moderado)).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaModerada)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(regular).Or(enfermedadesHistoricas.Is(normales)).And(estiloVida.Is(tranquilo)).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaModerada)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(regular).Or(enfermedadesHistoricas.Is(normales)).And(estiloVida.Is(moderado)).And(ocupacion.Is(ocupacionNormal))) .Then(estadoAseguramiento.Is(coberturaModerada)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(regular).Or(enfermedadesHistoricas.Is(normales)).And(estiloVida.Is(tranquilo)).And(ocupacion.Is(ocupacionNormal))) .Then(estadoAseguramiento.Is(coberturaTotal)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(sano).Or(enfermedadesHistoricas.Is(bajas)).And(estiloVida.Is(reisgozo)).And(ocupacion.Is(ocupacionAltoRiezgo))) .Then(estadoAseguramiento.Is(coberturaBaja)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(sano).Or(enfermedadesHistoricas.Is(bajas)).And(estiloVida.Is(moderado)).And(ocupacion.Is(ocupacionAltoRiezgo))) .Then(estadoAseguramiento.Is(coberturaModerada)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(sano).Or(enfermedadesHistoricas.Is(bajas)).And(estiloVida.Is(reisgozo)).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaModerada)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(sano).Or(enfermedadesHistoricas.Is(bajas)).And(estiloVida.Is(moderado)).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaTotal)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(sano).Or(enfermedadesHistoricas.Is(bajas)).And(estiloVida.Is(tranquilo)).And(ocupacion.Is(ocupacionBajoRiezgo))) .Then(estadoAseguramiento.Is(coberturaTotal)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(sano).Or(enfermedadesHistoricas.Is(bajas)).And(estiloVida.Is(moderado)).And(ocupacion.Is(ocupacionNormal))) .Then(estadoAseguramiento.Is(coberturaTotal)); fuzzyEngine.Rules .If(enfermedadesActuales.Is(sano).Or(enfermedadesHistoricas.Is(bajas))) .If(estiloVida.Is(tranquilo).And(ocupacion.Is(ocupacionNormal))) .Then(estadoAseguramiento.Is(coberturaTotal)); var result = fuzzyEngine.Defuzzify(new { enfermedadesActuales = inputEnfermedadesActuales, enfermedadesHistoricas = inputEnfermedadesHistoricas, estiloVida = inputEstiloDeVida, ocupacion = inputOcupacion }); return result; }
// Update is called once per frame void Update() { //get position of line and position and velocity of car here linePosX = line.GetPositionX(); carPosX = car.GetPositionX(); velocity = car.GetVelocityX(); //distance car is from the line double dist = carPosX - linePosX; //create new fuzzy variable measuring the car's distance from the line var carPosToLine = new LinguisticVariable("CarPosition"); //set up membership functions for car distance variable var carFarLeft = carPosToLine.MembershipFunctions.AddTrapezoid("FarLeft", -3.0, -3.0, -1.5, -0.75); var carLeft = carPosToLine.MembershipFunctions.AddTriangle("Left", -1.5, -0.75, 0.0); var carCentre = carPosToLine.MembershipFunctions.AddTriangle("Centre", -0.75, 0.0, 0.75); var carRight = carPosToLine.MembershipFunctions.AddTriangle("Right", 0.0, 0.75, 1.5); var carFarRight = carPosToLine.MembershipFunctions.AddTrapezoid("FarRight", 0.75, 1.5, 3.0, 3.0); //create new fuzzy variable measuring the car's velocity towards the line var carVel = new LinguisticVariable("CarVelocity"); //set up membership functions for car velocity variable var velFastLeft = carVel.MembershipFunctions.AddTrapezoid("FastLeft", -maxCarVel, -maxCarVel, -0.5 * maxCarVel, -0.25 * maxCarVel); var velLeft = carVel.MembershipFunctions.AddTriangle("Left", -0.5 * maxCarVel, -0.25 * maxCarVel, 0.0); var velStill = carVel.MembershipFunctions.AddTriangle("Still", -0.25 * maxCarVel, 0.0, 0.25 * maxCarVel); var velRight = carVel.MembershipFunctions.AddTriangle("Right", 0.0, 0.25 * maxCarVel, 0.5 * maxCarVel); var velFastRight = carVel.MembershipFunctions.AddTrapezoid("FastRight", 0.25 * maxCarVel, 0.5 * maxCarVel, maxCarVel, maxCarVel); //create new fuzzy output variable to be set as the steering of the car var carSteering = new LinguisticVariable("CarSteering"); //set up membership functions for car steering variable var steerHardLeft = carSteering.MembershipFunctions.AddTriangle("SteerHardLeft", -steeringValue, -steeringValue, -0.5 * steeringValue); var steerLeft = carSteering.MembershipFunctions.AddTriangle("SteerLeft", -steeringValue, -0.5 * steeringValue, 0.0); var noSteering = carSteering.MembershipFunctions.AddTriangle("NoSteering", -0.5 * steeringValue, 0.0, 0.5 * steeringValue); var steerRight = carSteering.MembershipFunctions.AddTriangle("SteerRight", 0.0, 0.5 * steeringValue, steeringValue); var steerHardRight = carSteering.MembershipFunctions.AddTriangle("SteerHardRight", 0.5 * steeringValue, steeringValue, steeringValue); //set up the fuzzy engine //default type is centroid/centre of gravity fuzzyEngine = new FuzzyEngineFactory().Default(); //set up a rule for every combination of the input variables //far left distance var rule1 = Rule.If(carPosToLine.Is(carFarLeft).And(carVel.Is(velFastLeft))).Then(carSteering.Is(steerHardRight)); var rule2 = Rule.If(carPosToLine.Is(carFarLeft).And(carVel.Is(velLeft))).Then(carSteering.Is(steerHardRight)); var rule3 = Rule.If(carPosToLine.Is(carFarLeft).And(carVel.Is(velStill))).Then(carSteering.Is(steerRight)); var rule4 = Rule.If(carPosToLine.Is(carFarLeft).And(carVel.Is(velRight))).Then(carSteering.Is(steerRight)); var rule5 = Rule.If(carPosToLine.Is(carFarLeft).And(carVel.Is(velFastRight))).Then(carSteering.Is(steerRight)); //left distance var rule6 = Rule.If(carPosToLine.Is(carLeft).And(carVel.Is(velFastLeft))).Then(carSteering.Is(steerHardRight)); var rule7 = Rule.If(carPosToLine.Is(carLeft).And(carVel.Is(velLeft))).Then(carSteering.Is(steerHardRight)); var rule8 = Rule.If(carPosToLine.Is(carLeft).And(carVel.Is(velStill))).Then(carSteering.Is(steerRight)); var rule9 = Rule.If(carPosToLine.Is(carLeft).And(carVel.Is(velRight))).Then(carSteering.Is(noSteering)); var rule10 = Rule.If(carPosToLine.Is(carLeft).And(carVel.Is(velFastRight))).Then(carSteering.Is(steerLeft)); //centre var rule11 = Rule.If(carPosToLine.Is(carCentre).And(carVel.Is(velFastLeft))).Then(carSteering.Is(steerHardRight)); var rule12 = Rule.If(carPosToLine.Is(carCentre).And(carVel.Is(velLeft))).Then(carSteering.Is(steerRight)); var rule13 = Rule.If(carPosToLine.Is(carCentre).And(carVel.Is(velStill))).Then(carSteering.Is(noSteering)); var rule14 = Rule.If(carPosToLine.Is(carCentre).And(carVel.Is(velRight))).Then(carSteering.Is(steerLeft)); var rule15 = Rule.If(carPosToLine.Is(carCentre).And(carVel.Is(velFastRight))).Then(carSteering.Is(steerHardLeft)); //right distance var rule16 = Rule.If(carPosToLine.Is(carRight).And(carVel.Is(velFastLeft))).Then(carSteering.Is(steerRight)); var rule17 = Rule.If(carPosToLine.Is(carRight).And(carVel.Is(velLeft))).Then(carSteering.Is(noSteering)); var rule18 = Rule.If(carPosToLine.Is(carRight).And(carVel.Is(velStill))).Then(carSteering.Is(steerLeft)); var rule19 = Rule.If(carPosToLine.Is(carRight).And(carVel.Is(velRight))).Then(carSteering.Is(steerHardLeft)); var rule20 = Rule.If(carPosToLine.Is(carRight).And(carVel.Is(velFastRight))).Then(carSteering.Is(steerHardLeft)); //far right distance var rule21 = Rule.If(carPosToLine.Is(carFarRight).And(carVel.Is(velFastLeft))).Then(carSteering.Is(steerLeft)); var rule22 = Rule.If(carPosToLine.Is(carFarRight).And(carVel.Is(velLeft))).Then(carSteering.Is(steerLeft)); var rule23 = Rule.If(carPosToLine.Is(carFarRight).And(carVel.Is(velStill))).Then(carSteering.Is(steerLeft)); var rule24 = Rule.If(carPosToLine.Is(carFarRight).And(carVel.Is(velRight))).Then(carSteering.Is(steerHardLeft)); var rule25 = Rule.If(carPosToLine.Is(carFarRight).And(carVel.Is(velFastRight))).Then(carSteering.Is(steerHardLeft)); //add these rules to the fuzzy engine fuzzyEngine.Rules.Add(rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8, rule9, rule10, rule11, rule12, rule13, rule14, rule15, rule16, rule17, rule18, rule19, rule20, rule21, rule22, rule23, rule24, rule25); //calculate and defuzzify steering output result = fuzzyEngine.Defuzzify(new { CarPosition = dist, CarVelocity = velocity }); //set cars steering as the output result car.SetSteering((float)result); //display the result for the car on the screen in the steering text variable float resultf = (float)result; steeringText.text = ("Steering: " + resultf.ToString("F3")); }