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 FuzzyRoamState(Monster pawn) : base(pawn)
        {
            engine_wallDetection   = new FuzzyEngineFactory().Default();
            engine_playerDetection = new FuzzyEngineFactory().Default();

            distanceToWall = new LinguisticVariable("distanceToWall");
            var farDistance  = distanceToWall.MembershipFunctions.AddTrapezoid("WallFar", 70, 70, 90, 120);
            var midDistance  = distanceToWall.MembershipFunctions.AddTrapezoid("WallMid", 50, 60, 70, 80);
            var nearDistance = distanceToWall.MembershipFunctions.AddTrapezoid("WallNear", 0, 20, 50, 70);

            turnStrength = new LinguisticVariable("turnStrength");
            var weak   = turnStrength.MembershipFunctions.AddTrapezoid("Weak", 1, 4, 8, 12);
            var medium = turnStrength.MembershipFunctions.AddTrapezoid("Medium", 6, 12, 18, 24);
            var strong = turnStrength.MembershipFunctions.AddTrapezoid("Strong", 15, 30, 60, 80);

            playerDetected = new LinguisticVariable("playerDetected");
            var detected    = playerDetected.MembershipFunctions.AddRectangle("Detected", 0, 1);
            var notDetected = playerDetected.MembershipFunctions.AddRectangle("NotDetected", -1, 0);

            playerDistance = new LinguisticVariable("playerDistance");
            var playerNear = playerDistance.MembershipFunctions.AddTrapezoid("PlayerNear", 0, 10, 25, 30);
            var playerMid  = playerDistance.MembershipFunctions.AddTrapezoid("PlayerMid", 20, 30, 40, 50);
            var playerFar  = playerDistance.MembershipFunctions.AddTrapezoid("PlayerFar", 40, 50, 60, 70);

            var wallDetection_rule1 = Rule.If(distanceToWall.Is(farDistance)).Then(turnStrength.Is(weak));
            var wallDetection_rule2 = Rule.If(distanceToWall.Is(midDistance)).Then(turnStrength.Is(medium));
            var wallDetection_rule3 = Rule.If(distanceToWall.Is(nearDistance)).Then(turnStrength.Is(strong));

            var playerDetection_rule1 = Rule.If(playerDistance.Is(playerNear).Or(playerDistance.Is(playerMid))).Then(playerDetected.Is(detected));
            var playerDetection_rule2 = Rule.If(playerDistance.Is(playerFar)).Then(playerDetected.Is(notDetected));

            engine_wallDetection.Rules.Add(wallDetection_rule1, wallDetection_rule2, wallDetection_rule3);
            engine_playerDetection.Rules.Add(playerDetection_rule1, playerDetection_rule2);
        }
Ejemplo n.º 4
0
    // Start is called before the first frame update
    void Start()
    {
        controller = GetComponent <CarController>();

        var acceleration = new LinguisticVariable("Acceleration");
        var accelerate   = acceleration.MembershipFunctions.AddTrapezoid("Accelerate", 1, 1.5, 2, 2);
        var coast        = acceleration.MembershipFunctions.AddTriangle("Coast", 0.5, 1, 1.5);
        var decelerate   = acceleration.MembershipFunctions.AddTrapezoid("Decelerate", 0, 0, 0.5, 1);

        var distance = new LinguisticVariable("Distance");
        var close    = distance.MembershipFunctions.AddTrapezoid("Close", 0, 0, 6, 10);
        var far      = distance.MembershipFunctions.AddTrapezoid("Far", 5, 20, 100, 100);

        var deltaToTargetDistance = new LinguisticVariable("DistanceDelta");
        var below   = deltaToTargetDistance.MembershipFunctions.AddTrapezoid("Below", 0, 0, 5, 10);
        var onPoint = deltaToTargetDistance.MembershipFunctions.AddTriangle("Middle", 5, 10, 15);
        var above   = deltaToTargetDistance.MembershipFunctions.AddTrapezoid("Above", 10, 15, 20, 20);

        var rule1 = Rule.If(deltaToTargetDistance.Is(below).Or(distance.Is(close))).Then(acceleration.Is(decelerate));
        var rule2 = Rule.If(deltaToTargetDistance.Is(above).And(distance.IsNot(close))).Then(acceleration.Is(accelerate));
        var rule3 = Rule.If(deltaToTargetDistance.Is(onPoint)).Then(acceleration.Is(coast));

        fuzzyEngine = new FuzzyEngineFactory().Default();

        fuzzyEngine.Rules.Add(rule1);
        fuzzyEngine.Rules.Add(rule2);

        StartCoroutine(AICycle());
    }
Ejemplo n.º 5
0
    void Start()
    {
        rigidbody = GetComponent <Rigidbody>();
        // Here we need to setup the Fuzzy Inference System
        distance = new LinguisticVariable("distance");
        var farRight = distance.MembershipFunctions.AddTrapezoid("farRight", -100, -100, -60, -45);
        var right    = distance.MembershipFunctions.AddTrapezoid("right", -50, -50, -7, -0.05f);
        var none     = distance.MembershipFunctions.AddTrapezoid("none", -7, -0.5, 0.5, 7);
        var left     = distance.MembershipFunctions.AddTrapezoid("left", 0.05f, 7, 50, 50);
        var farLeft  = distance.MembershipFunctions.AddTrapezoid("farLeft", 45, 60, 100, 100);

        direction = new LinguisticVariable("direction");
        var farRightD = direction.MembershipFunctions.AddTrapezoid("farRight", -100, -100, -60, -45);
        var rightD    = direction.MembershipFunctions.AddTrapezoid("right", -50, -50, -7, -0.05f);
        var noneD     = direction.MembershipFunctions.AddTrapezoid("none", -7, -0.5, 0.5, 7);
        var leftD     = direction.MembershipFunctions.AddTrapezoid("left", 0.05f, 7, 50, 50);
        var farLeftD  = direction.MembershipFunctions.AddTrapezoid("farLeft", 45, 60, 100, 100);

        engine = new FuzzyEngineFactory().Default();
        var rule0 = Rule.If(distance.Is(farRight)).Then(direction.Is(farLeftD));
        var rule1 = Rule.If(distance.Is(right)).Then(direction.Is(leftD));
        var rule2 = Rule.If(distance.Is(left)).Then(direction.Is(rightD));
        var rule3 = Rule.If(distance.Is(none)).Then(distance.Is(noneD));
        var rule4 = Rule.If(distance.Is(farLeft)).Then(direction.Is(farRightD));

        engine.Rules.Add(rule0, rule1, rule2, rule3, rule4);
    }
Ejemplo n.º 6
0
 public void SetUp()
 {
     _initialDataProviderMock = MockRepository.GenerateMock <IDataProvider>();
     _knowledgeManagerMock    = MockRepository.GenerateMock <IKnowledgeBaseManager>();
     _inferenceEngineMock     = MockRepository.GenerateMock <IInferenceEngine>();
     _fuzzyEngineMock         = MockRepository.GenerateMock <IFuzzyEngine>();
 }
Ejemplo n.º 7
0
 public FuzzyExpert(
     IDataProvider dataProvider,
     IKnowledgeBaseManager knowledgeBaseManager,
     IInferenceEngine inferenceEngine,
     IFuzzyEngine fuzzyEngine)
 {
     _initialDataProvider = dataProvider ?? throw new ArgumentNullException(nameof(dataProvider));
     _knowledgeManager    = knowledgeBaseManager ?? throw new ArgumentNullException(nameof(knowledgeBaseManager));
     _inferenceEngine     = inferenceEngine ?? throw new ArgumentNullException(nameof(inferenceEngine));
     _fuzzyEngine         = fuzzyEngine ?? throw new ArgumentNullException(nameof(fuzzyEngine));
 }
Ejemplo n.º 8
0
        public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            base.OnStateEnter(animator, stateInfo, layerIndex);

            _currentInterval    = 0;
            _currentMaxInterval = interval;

            _enemyCount = new LinguisticVariable("_enemyCount");
            _few        = _enemyCount.MembershipFunctions.AddTrapezoid("_few", 0, 0, 5, 12.5);
            _some       = _enemyCount.MembershipFunctions.AddTriangle("_some", 5, 12.5, 21.25);
            _many       = _enemyCount.MembershipFunctions.AddTrapezoid("_many", 12.5, 21.25, 25, 25);

            _enemyDistance = new LinguisticVariable("_enemyDistance");
            _close         = _enemyDistance.MembershipFunctions.AddTrapezoid("_close", 0, 0, 1, 10);
            _med           = _enemyDistance.MembershipFunctions.AddTriangle("_med", 1, 10, 17);
            _far           = _enemyDistance.MembershipFunctions.AddTrapezoid("_far", 10, 17, 20, 20);

            _power = new LinguisticVariable("_power");
            _light = _power.MembershipFunctions.AddTrapezoid("_light", 0, 0, 2, 5);
            _norm  = _power.MembershipFunctions.AddTriangle("_norm", 2, 5, 7.6);
            _heavy = _power.MembershipFunctions.AddTrapezoid("_heavy", 5, 7.6, 10, 10);

            _fuzzyEngine = new FuzzyEngineFactory().Default();

            var rule1 = Rule.If(_enemyDistance.Is(_close).And(_enemyCount.Is(_few))).Then(_power.Is(_norm));
            var rule2 = Rule.If(_enemyDistance.Is(_close).And(_enemyCount.Is(_some))).Then(_power.Is(_heavy));
            var rule3 = Rule.If(_enemyDistance.Is(_close).And(_enemyCount.Is(_many))).Then(_power.Is(_heavy));

            var rule4 = Rule.If(_enemyDistance.Is(_med).And(_enemyCount.Is(_few))).Then(_power.Is(_light));
            var rule5 = Rule.If(_enemyDistance.Is(_med).And(_enemyCount.Is(_some))).Then(_power.Is(_norm));
            var rule6 = Rule.If(_enemyDistance.Is(_med).And(_enemyCount.Is(_many))).Then(_power.Is(_heavy));

            var rule7 = Rule.If(_enemyDistance.Is(_far).And(_enemyCount.Is(_few))).Then(_power.Is(_light));
            var rule8 = Rule.If(_enemyDistance.Is(_far).And(_enemyCount.Is(_some))).Then(_power.Is(_light));
            var rule9 = Rule.If(_enemyDistance.Is(_far).And(_enemyCount.Is(_many))).Then(_power.Is(_norm));

            _fuzzyEngine.Rules.Add(
                rule1,
                rule2,
                rule3,
                rule4,
                rule5,
                rule6,
                rule7,
                rule8,
                rule9
                );
        }
Ejemplo n.º 9
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.º 10
0
    void Start()
    {
        myRigidbody = GetComponent <Rigidbody>();
        controller  = GetComponent <PDController>();

        var speed = new LinguisticVariable("Speed");
        //var slow = speed.MembershipFunctions.AddTrapezoid("Slow", 0, 0, 5, 10);
        //var average = speed.MembershipFunctions.AddTrapezoid("Average", 10, 15, 20, 25);
        //var fast = speed.MembershipFunctions.AddTrapezoid("Fast", 5, 15, 100, 100);

        var slow = speed.MembershipFunctions.AddTriangle("Slow", 0, 5, 10);
        var fast = speed.MembershipFunctions.AddTriangle("Fast", 7.5, 20, 50);

        var distance = new LinguisticVariable("Distance");

        /*
         * var low = distance.MembershipFunctions.AddTrapezoid("Low", 0, 0, 2.5, 5);
         * var medium = distance.MembershipFunctions.AddTrapezoid("Medium", 2.5, 5, 12.5, 20);
         * var high = distance.MembershipFunctions.AddTrapezoid("High", 12.5, 20, 38, 50);
         */

        var low  = distance.MembershipFunctions.AddTriangle("Low", 0, 10, 20);
        var high = distance.MembershipFunctions.AddTriangle("High", 10, 20, 55);

        var variability = new LinguisticVariable("Variability");
        var varH        = variability.MembershipFunctions.AddTrapezoid("VarH", 1.5, 2, 5, 20);
        var varL        = variability.MembershipFunctions.AddTrapezoid("VarL", 0, 0, 1.5, 2);

        fuzzyEngine = new FuzzyEngineFactory().Default();

        var rule1 = Rule.If(speed.Is(slow)).Then(distance.Is(low));
        //var rule2 = Rule.If(speed.Is(average)).Then(distance.Is(medium));
        var rule3 = Rule.If(speed.Is(fast)).Then(distance.Is(high));
        var rule4 = Rule.If(variability.Is(varL)).Then(distance.Is(low));
        var rule5 = Rule.If(variability.Is(varH)).Then(distance.Is(high));

        fuzzyEngine.Rules.Add(rule1);
        //fuzzyEngine.Rules.Add(rule2);
        fuzzyEngine.Rules.Add(rule3);
        fuzzyEngine.Rules.Add(rule4);
        fuzzyEngine.Rules.Add(rule5);

        StartCoroutine(CycleAI());
    }
Ejemplo n.º 11
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.º 12
0
        public FuzzySearchState(Monster pawn) : base(pawn)
        {
            engine_findPlayer    = new FuzzyEngineFactory().Default();
            engine_wallDetection = new FuzzyEngineFactory().Default();

            distanceToWall = new LinguisticVariable("distanceToWall");
            var farDistance  = distanceToWall.MembershipFunctions.AddTrapezoid("WallFar", 70, 70, 90, 120);
            var midDistance  = distanceToWall.MembershipFunctions.AddTrapezoid("WallMid", 50, 60, 70, 80);
            var nearDistance = distanceToWall.MembershipFunctions.AddTrapezoid("WallNear", 0, 20, 50, 70);

            turnStrength = new LinguisticVariable("turnStrength");
            var weakTurn   = turnStrength.MembershipFunctions.AddTrapezoid("Weak", 1, 4, 8, 12);
            var mediumTurn = turnStrength.MembershipFunctions.AddTrapezoid("Medium", 6, 12, 18, 24);
            var strongTurn = turnStrength.MembershipFunctions.AddTrapezoid("Strong", 15, 30, 60, 80);

            playerDist = new LinguisticVariable("playerDist");
            var near = playerDist.MembershipFunctions.AddTrapezoid("Near", 0, 10, 25, 40);
            var mid  = playerDist.MembershipFunctions.AddTrapezoid("Mid", 25, 40, 55, 70);
            var far  = playerDist.MembershipFunctions.AddTrapezoid("Far", 55, 70, 85, 100);

            chanceToFindPlayer = new LinguisticVariable("chanceToFindPlayer");
            var high   = chanceToFindPlayer.MembershipFunctions.AddRectangle("High", 6, 9);
            var medium = chanceToFindPlayer.MembershipFunctions.AddRectangle("Medium", 3, 6);
            var low    = chanceToFindPlayer.MembershipFunctions.AddRectangle("Low", 0, 3);

            var findPlayer_rule1 = Rule.If(playerDist.Is(near)).Then(chanceToFindPlayer.Is(high));
            var findPlayer_rule2 = Rule.If(playerDist.Is(mid)).Then(chanceToFindPlayer.Is(medium));
            var findPlayer_rule3 = Rule.If(playerDist.Is(far)).Then(chanceToFindPlayer.Is(low));

            var wallDetection_rule1 = Rule.If(distanceToWall.Is(farDistance)).Then(turnStrength.Is(weakTurn));
            var wallDetection_rule2 = Rule.If(distanceToWall.Is(midDistance)).Then(turnStrength.Is(mediumTurn));
            var wallDetection_rule3 = Rule.If(distanceToWall.Is(nearDistance)).Then(turnStrength.Is(strongTurn));

            engine_findPlayer.Rules.Add(findPlayer_rule1, findPlayer_rule2, findPlayer_rule3);
            engine_wallDetection.Rules.Add(wallDetection_rule1, wallDetection_rule2, wallDetection_rule3);
        }
Ejemplo n.º 13
0
        public MainWindow()
        {
            InitializeComponent();

            //Arrange
            var trackError = new LinguisticVariable("TrackError");
            var teNL       = trackError.MembershipFunctions.AddTriangle("TeNL", -1, -1, -.5);
            var teNM       = trackError.MembershipFunctions.AddTriangle("TeNM", -1, -.5, -.1);
            var teNS       = trackError.MembershipFunctions.AddTriangle("TeNS", -.5, -.1, 0);
            var teZ        = trackError.MembershipFunctions.AddTriangle("TeZ", -.1, 0, .1);
            var tePS       = trackError.MembershipFunctions.AddTriangle("TePS", 0, .1, .5);
            var tePM       = trackError.MembershipFunctions.AddTriangle("TePM", .1, .5, 1);
            var tePL       = trackError.MembershipFunctions.AddTriangle("TePL", .5, 1, 1);

            var estimatedTrackError = new LinguisticVariable("EstimatedTrackError");
            var eteNL = estimatedTrackError.MembershipFunctions.AddTriangle("EteNL", -1, -1, -.5);
            var eteNM = estimatedTrackError.MembershipFunctions.AddTriangle("EteNM", -1, -.5, -.3);
            var eteNS = estimatedTrackError.MembershipFunctions.AddTriangle("EteNS", -.5, -.3, 0);
            var eteZ  = estimatedTrackError.MembershipFunctions.AddTriangle("EteZ", -.3, 0, .3);
            var etePS = estimatedTrackError.MembershipFunctions.AddTriangle("EtePS", 0, .3, .5);
            var etePM = estimatedTrackError.MembershipFunctions.AddTriangle("EtePM", .3, .5, 1);
            var etePL = estimatedTrackError.MembershipFunctions.AddTriangle("EtePL", .5, 1, 1);

            var steering = new LinguisticVariable("Steering");
            var sNL      = steering.MembershipFunctions.AddTriangle("sNL", -1, -1, -.6);
            var sNM      = steering.MembershipFunctions.AddTriangle("sNM", -1, -.6, -.3);
            var sNS      = steering.MembershipFunctions.AddTriangle("sNS", -.6, -.3, 0);
            var sZ_      = steering.MembershipFunctions.AddTriangle("sZ", -.3, 0, .3);
            var sPS      = steering.MembershipFunctions.AddTriangle("sPS", 0, .3, .6);
            var sPM      = steering.MembershipFunctions.AddTriangle("sPM", .3, .6, 1);
            var sPL      = steering.MembershipFunctions.AddTriangle("sPL", .6, 1, 1);

            var speed = new LinguisticVariable("Speed");
            var spdZ  = speed.MembershipFunctions.AddTriangle("spdZ", 0, 0, .1);
            var spdS  = speed.MembershipFunctions.AddTriangle("spdS", 0, .1, .9);
            var spdM  = speed.MembershipFunctions.AddTriangle("spdM", .1, .9, 1);
            var spdL  = speed.MembershipFunctions.AddTriangle("spdL", .9, 1, 1);

            fuzzySteering = new FuzzyEngineFactory().Default(); fuzzySpeed = new FuzzyEngineFactory().Default();


            var teCols           = new[] { teNL, teNM, teNS, teZ, tePS, tePM, tePL };
            var eteRows          = new[] { eteNL, eteNM, eteNS, eteZ, etePS, etePM, etePL };
            var steerRulesMatrix = new[]
            {
                sPM, sPS, sZ_, sZ_, sNL, sNL, sNL,
                sPL, sPS, sPS, sPS, sPS, sZ_, sNL,
                sPL, sPM, sPS, sPS, sZ_, sZ_, sNL,
                sPL, sPM, sPS, sZ_, sNS, sNM, sNL,
                sPL, sZ_, sZ_, sNS, sNS, sNM, sNL,
                sPL, sZ_, sNS, sNS, sNS, sNS, sNL,
                sPL, sPL, sPL, sZ_, sZ_, sNS, sNM
            };
            var speedRulesMatrix = new[]
            {
                spdM, spdS, spdS, spdS, spdS, spdZ, spdZ,
                spdS, spdM, spdM, spdM, spdM, spdM, spdS,
                spdZ, spdS, spdL, spdL, spdL, spdM, spdS,
                spdS, spdM, spdL, spdL, spdL, spdM, spdS,
                spdS, spdM, spdL, spdL, spdL, spdS, spdZ,
                spdS, spdM, spdM, spdM, spdM, spdM, spdS,
                spdZ, spdZ, spdS, spdS, spdS, spdS, spdM
            };


            for (int i = 0; i < eteRows.Length; i++)
            {
                for (int j = 0; j < teCols.Length; j++)
                {
                    fuzzySteering.Rules.Add(
                        Rule.If($"Steering rule {i} {j} ({i * 7 + j})", trackError.Is(teCols[j]).And(estimatedTrackError.Is(eteRows[i]))).Then(
                            steering.Is(steerRulesMatrix[i * 7 + j])));
                    fuzzySpeed.Rules.Add(
                        Rule.If($"Speed rule {i} {j} ({i * 7 + j})", trackError.Is(teCols[j]).And(estimatedTrackError.Is(eteRows[i]))).Then(
                            speed.Is(speedRulesMatrix[i * 7 + j])));
                }
            }

            //fuzzySteering = new FuzzyEngineFactory().Default();

            //fuzzySteering.Rules.Add(new FuzzyRule[] {
            //    Rule.If(trackError.Is(tePM).And(estimatedTrackError.Is(eteNL))).Then(steering.Is(sNL)),
            //    Rule.If(trackError.Is(teNL).And(estimatedTrackError.Is(eteNM))).Then(steering.Is(sPL)),
            //    Rule.If(trackError.Is(teZ).And(estimatedTrackError.Is(eteNM))).Then(steering.Is(sPS)),
            //    Rule.If(trackError.Is(tePM).And(estimatedTrackError.Is(eteNM))).Then(steering.Is(sPS)),
            //    Rule.If(trackError.Is(tePL).And(estimatedTrackError.Is(eteNM))).Then(steering.Is(sNL)),
            //    Rule.If(trackError.Is(teNM).And(estimatedTrackError.Is(eteZ))).Then(steering.Is(sPL)),
            //    Rule.If(trackError.Is(tePM).And(estimatedTrackError.Is(eteZ))).Then(steering.Is(sNL)),
            //    Rule.If(trackError.Is(teNL).And(estimatedTrackError.Is(etePM))).Then(steering.Is(sPL)),
            //    Rule.If(trackError.Is(teNM).And(estimatedTrackError.Is(etePM))).Then(steering.Is(sNS)),
            //    Rule.If(trackError.Is(teZ).And(estimatedTrackError.Is(etePM))).Then(steering.Is(sNS)),
            //    Rule.If(trackError.Is(tePL).And(estimatedTrackError.Is(etePM))).Then(steering.Is(sNL)),
            //    Rule.If(trackError.Is(teNM).And(estimatedTrackError.Is(etePL))).Then(steering.Is(sPL)) });

            //fuzzySpeed = new FuzzyEngineFactory().Default();
            //fuzzySpeed.Rules.Add(new FuzzyRule[] {
            //    Rule.If(trackError.Is(tePL).And(estimatedTrackError.Is(eteNL))).Then(speed.Is(spdZ)),
            //    Rule.If(trackError.Is(teNL).And(estimatedTrackError.Is(eteZ))).Then(speed.Is(spdS)),
            //    Rule.If(trackError.Is(teZ).And(estimatedTrackError.Is(eteZ))).Then(speed.Is(spdL)),
            //    Rule.If(trackError.Is(tePL).And(estimatedTrackError.Is(eteZ))).Then(speed.Is(spdS)),
            //    Rule.If(trackError.Is(teNL).And(estimatedTrackError.Is(etePL))).Then(speed.Is(spdZ)),
            //    });
        }
Ejemplo n.º 14
0
    // Start is called before the first frame update
    void Start()
    {
        //  transform.position = new Vector3(569.0f, 6.04f, 254.0f);
        rb     = GetComponent <Rigidbody>();
        box    = GetComponent <BoxCollider>();
        player = GameObject.FindGameObjectWithTag("Player");
        water  = GameObject.Find("Water").GetComponent <Water>();

        turningEngine = new FuzzyEngineFactory().Default();
        speedEngine   = new FuzzyEngineFactory().Default();

        turningNeeded = new LinguisticVariable("turningNeeded");
        var veryFarPositive = turningNeeded.MembershipFunctions.AddTrapezoid("VeryFarPositive", 0, 0.2, 0.5, 0.65);
        var farPositive     = turningNeeded.MembershipFunctions.AddTrapezoid("FarPositive", 0.6, 0.7, 0.8, 0.9);
        var positive        = turningNeeded.MembershipFunctions.AddTrapezoid("Positive", 0.8, .90, 0.95, 1);
        var straight        = turningNeeded.MembershipFunctions.AddTrapezoid("Straight", -0.12, -0.05, 0.05, 0.12);
        var negative        = turningNeeded.MembershipFunctions.AddTrapezoid("Right", -1, -0.95, -0.9, -0.8);
        var farNegative     = turningNeeded.MembershipFunctions.AddTrapezoid("FarRight", -0.9, -0.8, -.7, -.6);
        var veryFarNegative = turningNeeded.MembershipFunctions.AddTrapezoid("VeryFarPositive", -0.65, -0.5, -0.2, 0);


        frontOrBack = new LinguisticVariable("FrontOrBack");
        var front  = frontOrBack.MembershipFunctions.AddTrapezoid("Front", 0, 0, 1, 1);
        var behind = frontOrBack.MembershipFunctions.AddTrapezoid("Behind", -1, -1, 0, 0);

        turningDirection = new LinguisticVariable("TurningDirection");
        //direction taken from the objects forward vector, left being anti clockwise, right being clockwise not from camera perspective
        var veryHardTurnNegative = turningDirection.MembershipFunctions.AddTrapezoid("VeryHardTurnNegative", -2, -1.5, -1, -0.5);
        var hardTurnNegative     = turningDirection.MembershipFunctions.AddTrapezoid("HardTurnNegative", -1.5, -1, -0.5, -0.25);
        var turnDirNegative      = turningDirection.MembershipFunctions.AddTrapezoid("TurnDirNegative", -0.5, -0.25, -0.2, -0.15);
        var noTurn               = turningDirection.MembershipFunctions.AddTrapezoid("NoTurn", -0.2, -0.15, 0.15, 0.2);
        var turnDirPositive      = turningDirection.MembershipFunctions.AddTrapezoid("TurnDirPositive", 0.15, 0.2, 0.25, 0.5);
        var hardTurnPositive     = turningDirection.MembershipFunctions.AddTrapezoid("HardTurnPositive", 0.25, 0.5, 1, 1.5);
        var veryHardTurnPositive = turningDirection.MembershipFunctions.AddTrapezoid("VeryHardTurnPositive", 0.5, 1, 1.5, 2);

        //var veryHardTurnNegative = turningDirection.MembershipFunctions.AddTrapezoid("VeryHardTurnNegative", -5, -4, -2, -1);
        //var hardTurnNegative = turningDirection.MembershipFunctions.AddTrapezoid("HardTurnNegative", -2, -1, -0.5, -0.2);
        //var turnDirNegative = turningDirection.MembershipFunctions.AddTrapezoid("TurnDirNegative", -0.40, -0.20, -0.10, -0.05);
        //var noTurn = turningDirection.MembershipFunctions.AddTrapezoid("NoTurn", -0.07, -0.03, 0.03, 0.07);
        //var turnDirPositive = turningDirection.MembershipFunctions.AddTrapezoid("TurnDirPositive", 0.05, 0.10, 0.20, 0.40);
        //var hardTurnPositive = turningDirection.MembershipFunctions.AddTrapezoid("HardTurnPositive", 0.2, 0.5, 1, 2);
        //var veryHardTurnPositive = turningDirection.MembershipFunctions.AddTrapezoid("VeryHardTurnPositive", 1, 2, 4, 5);


        distanceToPlayer = new LinguisticVariable("DistanceToPlayer");
        var veryFarAway = distanceToPlayer.MembershipFunctions.AddTrapezoid("VeryFarAway", 400, 900, 1100, 2000);
        var farAway     = distanceToPlayer.MembershipFunctions.AddTrapezoid("FarAway", 150, 200, 300, 450);
        var optimal     = distanceToPlayer.MembershipFunctions.AddTrapezoid("Optimal", 70, 90, 150, 170);
        var tooClose    = distanceToPlayer.MembershipFunctions.AddTrapezoid("TooClose", 0, 0, 70, 70);

        speed = new LinguisticVariable("Speed");
        var fast    = speed.MembershipFunctions.AddTrapezoid("Fast", 0.40, 0.60, 0.7, 0.80);
        var slow    = speed.MembershipFunctions.AddTrapezoid("Slow", 0.20, 0.30, 0.40, 0.60);
        var crawl   = speed.MembershipFunctions.AddTrapezoid("Crawl", 0.10, 0.15, 0.20, 0.30);
        var reverse = speed.MembershipFunctions.AddTrapezoid("Reverse", -0.10, -0.08, -0.06, -0.40);

        // if ship in front && if dot = 0 to .50 then very hard turn negative
        // if ship in front && if dot = .40 to .80 then  hard turn negative
        // if ship in front && if dot = .70 to 1 then  hard turn negative

        // if ship in front && if dot = 0 to -.50 then very hard turn positive
        // if ship in front && if dot = -.40 to -.80 then  hard turn positive
        // if ship in front && if dot = -.70 to -1 then  hard turn positive

        // if ship is behind && if dot = 0 to .50 then very hard turn negative
        // if ship in behind && if dot = .40 to .80 then  hard turn negative
        // if ship in behind && if dot = .70 to 1 then  hard turn negative

        // if ship in behind && if dot = 0 to -.50 then very hard turn positive
        // if ship in behind && if dot = -.40 to -.80 then  hard turn positive
        // if ship in behind && if dot = -.70 to -1 then  hard turn positive


        var turningRule1 = Rule.If(turningNeeded.Is(veryFarPositive).And(frontOrBack.Is(front))).Then(turningDirection.Is(turnDirNegative));
        var turningRule2 = Rule.If(turningNeeded.Is(farPositive).And(frontOrBack.Is(front))).Then(turningDirection.Is(hardTurnNegative));
        var turningRule3 = Rule.If(turningNeeded.Is(positive).And(frontOrBack.Is(front))).Then(turningDirection.Is(veryHardTurnNegative));
        var turningRule4 = Rule.If(turningNeeded.Is(straight).And(frontOrBack.Is(front))).Then(turningDirection.Is(noTurn));
        var turningRule5 = Rule.If(turningNeeded.Is(negative).And(frontOrBack.Is(front))).Then(turningDirection.Is(veryHardTurnPositive));
        var turningRule6 = Rule.If(turningNeeded.Is(farNegative).And(frontOrBack.Is(front))).Then(turningDirection.Is(hardTurnPositive));
        var turningRule7 = Rule.If(turningNeeded.Is(veryFarNegative).And(frontOrBack.Is(front))).Then(turningDirection.Is(turnDirPositive));

        var turningRule8  = Rule.If(turningNeeded.Is(veryFarPositive).And(frontOrBack.Is(behind))).Then(turningDirection.Is(veryHardTurnNegative));
        var turningRule9  = Rule.If(turningNeeded.Is(farPositive).And(frontOrBack.Is(behind))).Then(turningDirection.Is(hardTurnNegative));
        var turningRule10 = Rule.If(turningNeeded.Is(positive).And(frontOrBack.Is(behind))).Then(turningDirection.Is(turnDirNegative));
        var turningRule11 = Rule.If(turningNeeded.Is(straight).And(frontOrBack.Is(behind))).Then(turningDirection.Is(noTurn));
        var turningRule12 = Rule.If(turningNeeded.Is(negative).And(frontOrBack.Is(behind))).Then(turningDirection.Is(turnDirPositive));
        var turningRule13 = Rule.If(turningNeeded.Is(farNegative).And(frontOrBack.Is(behind))).Then(turningDirection.Is(hardTurnPositive));
        var turningRule14 = Rule.If(turningNeeded.Is(veryFarNegative).And(frontOrBack.Is(behind))).Then(turningDirection.Is(veryHardTurnPositive));



        var speedrule1 = Rule.If(distanceToPlayer.Is(veryFarAway)).Then(speed.Is(fast));
        var speedrule2 = Rule.If(distanceToPlayer.Is(farAway)).Then(speed.Is(slow));
        var speedrule3 = Rule.If(distanceToPlayer.Is(optimal)).Then(speed.Is(crawl));
        var speedrule4 = Rule.If(distanceToPlayer.Is(tooClose)).Then(speed.Is(reverse));

        //If(frontOrback.Is(Front)).If(turningNeeded.Is(HardTurnLeft).Then(turningDirection.Is(hardLeftTurnPositive));

        turningEngine.Rules.Add(turningRule1, turningRule2, turningRule3, turningRule4, turningRule5, turningRule6, turningRule7,
                                turningRule8, turningRule9, turningRule10, turningRule11, turningRule12, turningRule13, turningRule14);
        speedEngine.Rules.Add(speedrule1, speedrule2, speedrule3, speedrule4);
    }
Ejemplo n.º 15
0
        public double Control(double errorInput, double derivateInput)
        {
            _fuzzyEngineErik = new FuzzyEngineFactory().Default();

            //bemeneti hiba univerzum
            var error            = new LinguisticVariable("Error");
            var nagyonHuteniKell = error.MembershipFunctions.AddTriangle("Very Cool", -500, -11, -4);
            var huteniKell       = error.MembershipFunctions.AddTriangle("Cool", -5, -3, -1);
            var jo               = error.MembershipFunctions.AddTriangle("Good", -2, 0, 2);
            var futeniKell       = error.MembershipFunctions.AddTriangle("Hot", 1, 3, 5);
            var nagyonFuteniKell = error.MembershipFunctions.AddTriangle("Very Hot", 4, 11, 500);

            //bemeneti derivalt univerzum
            var dt          = new LinguisticVariable("Derivate");
            var nagyonHevul = dt.MembershipFunctions.AddTriangle("Very Cooling", -100, -0.65, -0.3);
            var hevul       = dt.MembershipFunctions.AddTriangle("Cooling", -0.5, -0.3, -0.1);
            var stabil      = dt.MembershipFunctions.AddTriangle("Stabil", -0.2, 0, 0.2);
            var hul         = dt.MembershipFunctions.AddTriangle("Heating", 0.1, 0.3, 0.5);
            var nagyonHull  = dt.MembershipFunctions.AddTriangle("Very Heating", 0.3, 0.65, 100);

            //kimeneti univerzum
            var output         = new LinguisticVariable("Output");
            var outVeryCooling = output.MembershipFunctions.AddTriangle("Very Cooling", -100, -75, -50);
            var outCooling     = output.MembershipFunctions.AddTriangle("Cooling", -65, -45, -25);
            var outStop        = output.MembershipFunctions.AddTriangle("Stop ", -30, 0, 30);
            var outHeating     = output.MembershipFunctions.AddTriangle("Heating", 25, 45, 65);
            var outVeryHeating = output.MembershipFunctions.AddTriangle("Very Heating", 50, 75, 100);

            ////mamdani torvenyek hozzaadasa


            ////bemeneti hiba univerzum
            //var error = new LinguisticVariable("Error");
            //var nagyonHuteniKell = error.MembershipFunctions.AddTriangle("Very Cool", -500, -11, -4);
            //var huteniKell = error.MembershipFunctions.AddTriangle("Cool", -5, -3, -0.5);
            //var jo = error.MembershipFunctions.AddTriangle("Good", -1, 0, 1);
            //var futeniKell = error.MembershipFunctions.AddTriangle("Hot", 0.5, 3, 5);
            //var nagyonFuteniKell = error.MembershipFunctions.AddTriangle("Very Hot", 4, 11, 500);

            ////bemeneti derivalt univerzum
            //var dt = new LinguisticVariable("Derivate");
            //var nagyonHevul = dt.MembershipFunctions.AddTriangle("Very Cooling", -100, -0.65, -0.3);
            //var hevul = dt.MembershipFunctions.AddTriangle("Cooling", -0.5, -0.3, -0.1);
            //var stabil = dt.MembershipFunctions.AddTriangle("Stabil", -0.15, 0, 0.15);
            //var hul = dt.MembershipFunctions.AddTriangle("Heating", 0.1, 0.3, 0.5);
            //var nagyonHull = dt.MembershipFunctions.AddTriangle("Very Heating", 0.3, 0.65, 100);

            ////kimeneti univerzum
            //var output = new LinguisticVariable("Output");
            //var outVeryCooling = output.MembershipFunctions.AddTriangle("Very Cooling", -100, -75, -50);
            //var outCooling = output.MembershipFunctions.AddTriangle("Cooling", -65, -55, -25);
            //var outStop = output.MembershipFunctions.AddTriangle("Stop ", -30, 0, 30);
            //var outHeating = output.MembershipFunctions.AddTriangle("Heating", 25, 55, 65);
            //var outVeryHeating = output.MembershipFunctions.AddTriangle("Very Heating", 50, 75, 100);

            /*
             *
             *          var error = new LinguisticVariable("Error");
             *          var nagyonHuteniKell = error.MembershipFunctions.AddTriangle("Very Cool", -500, -11, -4);
             *          var huteniKell = error.MembershipFunctions.AddTriangle("Cool", -5, -3, -0.5);
             *          var jo = error.MembershipFunctions.AddTriangle("Good", -1, 0, 1);
             *          var futeniKell = error.MembershipFunctions.AddTriangle("Hot", 0.5, 3, 5);
             *          var nagyonFuteniKell = error.MembershipFunctions.AddTriangle("Very Hot", 4, 11, 500);
             *
             *          //bemeneti derivalt univerzum
             *          var dt = new LinguisticVariable("Derivate");
             *          var nagyonHevul = dt.MembershipFunctions.AddTriangle("Very Cooling", -100, -0.65, -0.3);
             *          var hevul = dt.MembershipFunctions.AddTriangle("Cooling", -0.5, -0.3, -0.1);
             *          var stabil = dt.MembershipFunctions.AddTriangle("Stabil", -0.15, 0, 0.15);
             *          var hul = dt.MembershipFunctions.AddTriangle("Heating", 0.1, 0.3, 0.5);
             *          var nagyonHull = dt.MembershipFunctions.AddTriangle("Very Heating", 0.3, 0.65, 100);
             *
             *          //kimeneti univerzum
             *          var output = new LinguisticVariable("Output");
             *          var outVeryCooling = output.MembershipFunctions.AddTriangle("Very Cooling", -100, -75, -30);
             *          var outCooling = output.MembershipFunctions.AddTriangle("Cooling", -85, -55, -5);
             *          var outStop = output.MembershipFunctions.AddTriangle("Stop ", -10, 0, 10);
             *          var outHeating = output.MembershipFunctions.AddTriangle("Heating", 5, 55, 85);
             *          var outVeryHeating = output.MembershipFunctions.AddTriangle("Very Heating", 30, 75, 100);
             */



            _fuzzyEngineErik.Rules.Add(
                Rule.If(error.Is(nagyonHuteniKell).And(dt.Is(nagyonHevul))).Then(output.Is(outVeryCooling)),
                Rule.If(error.Is(nagyonHuteniKell).And(dt.Is(hevul))).Then(output.Is(outVeryCooling)),
                Rule.If(error.Is(nagyonHuteniKell).And(dt.Is(stabil))).Then(output.Is(outCooling)),
                Rule.If(error.Is(nagyonHuteniKell).And(dt.Is(hul))).Then(output.Is(outCooling)),
                Rule.If(error.Is(nagyonHuteniKell).And(dt.Is(nagyonHull))).Then(output.Is(outCooling))
                );
            _fuzzyEngineErik.Rules.Add(
                Rule.If(error.Is(huteniKell).And(dt.Is(nagyonHevul))).Then(output.Is(outVeryCooling)),
                Rule.If(error.Is(huteniKell).And(dt.Is(hevul))).Then(output.Is(outCooling)),
                Rule.If(error.Is(huteniKell).And(dt.Is(stabil))).Then(output.Is(outCooling)),
                Rule.If(error.Is(huteniKell).And(dt.Is(hul))).Then(output.Is(outCooling)),
                Rule.If(error.Is(huteniKell).And(dt.Is(nagyonHull))).Then(output.Is(outStop))
                );
            _fuzzyEngineErik.Rules.Add(
                Rule.If(error.Is(jo).And(dt.Is(nagyonHevul))).Then(output.Is(outCooling)),
                Rule.If(error.Is(jo).And(dt.Is(hevul))).Then(output.Is(outCooling)),
                Rule.If(error.Is(jo).And(dt.Is(stabil))).Then(output.Is(outStop)),
                Rule.If(error.Is(jo).And(dt.Is(hul))).Then(output.Is(outHeating)),
                Rule.If(error.Is(jo).And(dt.Is(nagyonHull))).Then(output.Is(outHeating))
                );
            _fuzzyEngineErik.Rules.Add(
                Rule.If(error.Is(futeniKell).And(dt.Is(nagyonHevul))).Then(output.Is(outStop)),
                Rule.If(error.Is(futeniKell).And(dt.Is(hevul))).Then(output.Is(outHeating)),
                Rule.If(error.Is(futeniKell).And(dt.Is(stabil))).Then(output.Is(outHeating)),
                Rule.If(error.Is(futeniKell).And(dt.Is(hul))).Then(output.Is(outHeating)),
                Rule.If(error.Is(futeniKell).And(dt.Is(nagyonHull))).Then(output.Is(outVeryHeating))
                );
            _fuzzyEngineErik.Rules.Add(
                Rule.If(error.Is(nagyonFuteniKell).And(dt.Is(nagyonHevul))).Then(output.Is(outHeating)),
                Rule.If(error.Is(nagyonFuteniKell).And(dt.Is(hevul))).Then(output.Is(outHeating)),
                Rule.If(error.Is(nagyonFuteniKell).And(dt.Is(stabil))).Then(output.Is(outHeating)),
                Rule.If(error.Is(nagyonFuteniKell).And(dt.Is(hul))).Then(output.Is(outVeryHeating)),
                Rule.If(error.Is(nagyonFuteniKell).And(dt.Is(nagyonHull))).Then(output.Is(outVeryHeating))
                );
            var result = _fuzzyEngineErik.Defuzzify(new { Error = errorInput, Derivate = derivateInput });

            return(result);
        }
Ejemplo n.º 16
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"));
    }
        public FuzzyLogicController()
        {
            populationDensity = new PopulationDensity();
            nonWhiteBritishEthnicityPercentage = new NonWhiteBritishEthnicityPercentage();
            numberOfUniversities = new NumberOfUniversities();
            averageSalary        = new AverageSalary();

            politicalLeaning = new PoliticalLeaning();

            fuzzyEngine = new FuzzyEngineFactory().Default();

            //Hard Left Leaning Rules
            var hardLeftRule1 = Rule
                                .If(populationDensity.Input
                                    .Is(populationDensity.Medium)
                                    .And(nonWhiteBritishEthnicityPercentage.Input
                                         .Is(nonWhiteBritishEthnicityPercentage.Medium))
                                    .And(numberOfUniversities.Input
                                         .Is(numberOfUniversities.Medium))
                                    .And(averageSalary.Input
                                         .Is(averageSalary.High)))
                                .Then(politicalLeaning.Output
                                      .Is(politicalLeaning.HardLeft));

            //Left Leaning Rules
            var leftRule1 = Rule
                            .If(populationDensity.Input
                                .Is(populationDensity.High)
                                .And(nonWhiteBritishEthnicityPercentage.Input
                                     .Is(nonWhiteBritishEthnicityPercentage.Medium))
                                .And(numberOfUniversities.Input
                                     .Is(numberOfUniversities.Low))
                                .And(averageSalary.Input
                                     .Is(averageSalary.Medium)))
                            .Then(politicalLeaning.Output
                                  .Is(politicalLeaning.Left));

            var leftRule2 = Rule
                            .If(populationDensity.Input
                                .Is(populationDensity.High)
                                .And(nonWhiteBritishEthnicityPercentage.Input
                                     .Is(nonWhiteBritishEthnicityPercentage.Low))
                                .And(numberOfUniversities.Input
                                     .Is(numberOfUniversities.Low))
                                .And(averageSalary.Input
                                     .Is(averageSalary.Medium)))
                            .Then(politicalLeaning.Output
                                  .Is(politicalLeaning.Left));

            var leftRule3 = Rule
                            .If(populationDensity.Input
                                .Is(populationDensity.Medium)
                                .And(nonWhiteBritishEthnicityPercentage.Input
                                     .Is(nonWhiteBritishEthnicityPercentage.Low))
                                .And(numberOfUniversities.Input
                                     .Is(numberOfUniversities.High))
                                .And(averageSalary.Input
                                     .Is(averageSalary.Medium)))
                            .Then(politicalLeaning.Output
                                  .Is(politicalLeaning.Left));

            //Centre Left Leaning Rules
            var centreLeftRule1 = Rule
                                  .If(populationDensity.Input
                                      .Is(populationDensity.High)
                                      .And(nonWhiteBritishEthnicityPercentage.Input
                                           .Is(nonWhiteBritishEthnicityPercentage.Medium))
                                      .And(numberOfUniversities.Input
                                           .Is(numberOfUniversities.Medium))
                                      .And(averageSalary.Input
                                           .Is(averageSalary.Medium)))
                                  .Then(politicalLeaning.Output
                                        .Is(politicalLeaning.CentreLeft));

            var centreLeftRule2 = Rule
                                  .If(populationDensity.Input
                                      .Is(populationDensity.Medium)
                                      .And(nonWhiteBritishEthnicityPercentage.Input
                                           .Is(nonWhiteBritishEthnicityPercentage.High))
                                      .And(numberOfUniversities.Input
                                           .Is(numberOfUniversities.Low))
                                      .And(averageSalary.Input
                                           .Is(averageSalary.Medium)))
                                  .Then(politicalLeaning.Output
                                        .Is(politicalLeaning.CentreLeft));

            var centreLeftRule3 = Rule
                                  .If(populationDensity.Input
                                      .Is(populationDensity.Medium)
                                      .And(nonWhiteBritishEthnicityPercentage.Input
                                           .Is(nonWhiteBritishEthnicityPercentage.Medium))
                                      .And(numberOfUniversities.Input
                                           .Is(numberOfUniversities.Low))
                                      .And(averageSalary.Input
                                           .Is(averageSalary.VeryHigh)))
                                  .Then(politicalLeaning.Output
                                        .Is(politicalLeaning.CentreLeft));

            //Centre Leaning Rules
            var centreRule1 = Rule
                              .If(populationDensity.Input
                                  .Is(populationDensity.Medium)
                                  .And(nonWhiteBritishEthnicityPercentage.Input
                                       .Is(nonWhiteBritishEthnicityPercentage.Low))
                                  .And(numberOfUniversities.Input
                                       .Is(numberOfUniversities.Low))
                                  .And(averageSalary.Input
                                       .Is(averageSalary.Medium)))
                              .Then(politicalLeaning.Output
                                    .Is(politicalLeaning.Centre));

            var centreRule2 = Rule
                              .If(populationDensity.Input
                                  .Is(populationDensity.VeryHigh)
                                  .And(nonWhiteBritishEthnicityPercentage.Input
                                       .Is(nonWhiteBritishEthnicityPercentage.High))
                                  .And(numberOfUniversities.Input
                                       .Is(numberOfUniversities.VeryHigh))
                                  .And(averageSalary.Input
                                       .Is(averageSalary.VeryHigh)))
                              .Then(politicalLeaning.Output
                                    .Is(politicalLeaning.Centre));

            //Centre Right Leaning Rules
            var centreRightRule1 = Rule
                                   .If(populationDensity.Input
                                       .Is(populationDensity.Low)
                                       .And(nonWhiteBritishEthnicityPercentage.Input
                                            .Is(nonWhiteBritishEthnicityPercentage.Low))
                                       .And(numberOfUniversities.Input
                                            .Is(numberOfUniversities.Medium))
                                       .And(averageSalary.Input
                                            .Is(averageSalary.Medium)))
                                   .Then(politicalLeaning.Output
                                         .Is(politicalLeaning.CentreRight));

            var centreRightRule2 = Rule
                                   .If(populationDensity.Input
                                       .Is(populationDensity.Medium)
                                       .And(nonWhiteBritishEthnicityPercentage.Input
                                            .Is(nonWhiteBritishEthnicityPercentage.High))
                                       .And(numberOfUniversities.Input
                                            .Is(numberOfUniversities.Low))
                                       .And(averageSalary.Input
                                            .Is(averageSalary.High)))
                                   .Then(politicalLeaning.Output
                                         .Is(politicalLeaning.CentreRight));

            var centreRightRule3 = Rule
                                   .If(populationDensity.Input
                                       .Is(populationDensity.Medium)
                                       .And(nonWhiteBritishEthnicityPercentage.Input
                                            .Is(nonWhiteBritishEthnicityPercentage.Medium))
                                       .And(numberOfUniversities.Input
                                            .Is(numberOfUniversities.Low))
                                       .And(averageSalary.Input
                                            .Is(averageSalary.High)))
                                   .Then(politicalLeaning.Output
                                         .Is(politicalLeaning.CentreRight));

            //Right Leaning Rules
            var rightRule1 = Rule
                             .If(populationDensity.Input
                                 .Is(populationDensity.Low)
                                 .And(nonWhiteBritishEthnicityPercentage.Input
                                      .Is(nonWhiteBritishEthnicityPercentage.Low))
                                 .And(numberOfUniversities.Input
                                      .Is(numberOfUniversities.Low))
                                 .And(averageSalary.Input
                                      .Is(averageSalary.Medium)))
                             .Then(politicalLeaning.Output
                                   .Is(politicalLeaning.Right));

            var rightRule2 = Rule
                             .If(populationDensity.Input
                                 .Is(populationDensity.VeryLow)
                                 .And(nonWhiteBritishEthnicityPercentage.Input
                                      .Is(nonWhiteBritishEthnicityPercentage.Low))
                                 .And(numberOfUniversities.Input
                                      .Is(numberOfUniversities.Low))
                                 .And(averageSalary.Input
                                      .Is(averageSalary.Medium)))
                             .Then(politicalLeaning.Output
                                   .Is(politicalLeaning.Right));

            var rightRule3 = Rule
                             .If(populationDensity.Input
                                 .Is(populationDensity.Medium)
                                 .And(nonWhiteBritishEthnicityPercentage.Input
                                      .Is(nonWhiteBritishEthnicityPercentage.Low))
                                 .And(numberOfUniversities.Input
                                      .Is(numberOfUniversities.Low))
                                 .And(averageSalary.Input
                                      .Is(averageSalary.High)))
                             .Then(politicalLeaning.Output
                                   .Is(politicalLeaning.Right));

            //Hard Right Leaning Rules
            var hardRightRule1 = Rule
                                 .If(populationDensity.Input
                                     .Is(populationDensity.Low)
                                     .And(nonWhiteBritishEthnicityPercentage.Input
                                          .Is(nonWhiteBritishEthnicityPercentage.Low))
                                     .And(numberOfUniversities.Input
                                          .Is(numberOfUniversities.Low))
                                     .And(averageSalary.Input
                                          .Is(averageSalary.High)))
                                 .Then(politicalLeaning.Output
                                       .Is(politicalLeaning.HardRight));


            fuzzyEngine.Rules.Add(hardLeftRule1, leftRule1, leftRule2, leftRule3, centreLeftRule1, centreLeftRule2, centreLeftRule3, centreRule1, centreRule2, centreRightRule1, centreRightRule2, centreRightRule3, rightRule1, rightRule2, rightRule3, hardRightRule1);
        }