Ejemplo n.º 1
0
        /// <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 }));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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 });
        }
Ejemplo n.º 4
0
    // 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);
    }
Ejemplo n.º 5
0
    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);
    }
Ejemplo n.º 6
0
        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
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
    // 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"));
    }