示例#1
0
        public static List<FuzzyVariable> Stretch(
            List<MeasurementWithResult> learningSet,
            DecisionMakerType1 originalDecisionMaker,
            VariableMFParam toStretch,
            BoundType boundType)
        {
            List<MeasurementWithResult> withResultsFromFs = (from measurement in learningSet
                select
                    new MeasurementWithResult
                    {
                        InputValues = new Dictionary<string, double>(measurement.InputValues),
                        OutputString = originalDecisionMaker.InferTerm(measurement.InputValues)
                    }).ToList();
            double multiplier = 1;
            int error = 0;
            bool canStretchMore = true;
            if (boundType == BoundType.Upper)
            {
                while (error == 0 && canStretchMore)
                {
                    multiplier += 0.001;
                    MamdaniFuzzySystem newFuzzySystem = UpdateParamsByMultiplier(
                        originalDecisionMaker,
                        multiplier,
                        toStretch,
                        out canStretchMore);
                    var updatedDecisionMaker = new DecisionMakerType1(newFuzzySystem, originalDecisionMaker.RulesDefinitions);
                    error = (from measurement in withResultsFromFs
                        where updatedDecisionMaker.InferTerm(measurement.InputValues) != measurement.OutputString
                        select measurement).Count();
                }

                multiplier -= 0.001;
                var finalFuzzySystem = UpdateParamsByMultiplier(
                    originalDecisionMaker,
                    multiplier,
                    toStretch,
                    out canStretchMore);
                return finalFuzzySystem.Input;
            }
            else
            {
                while (error == 0 && canStretchMore)
                {
                    multiplier -= 0.001;
                    MamdaniFuzzySystem newFuzzySystem = UpdateParamsByMultiplier(
                        originalDecisionMaker,
                        multiplier,
                        toStretch,
                        out canStretchMore);
                    var updatedDecisionMaker = new DecisionMakerType1(newFuzzySystem, originalDecisionMaker.RulesDefinitions);
                    error = (from measurement in withResultsFromFs
                        where updatedDecisionMaker.InferTerm(measurement.InputValues) != measurement.OutputString
                        select measurement).Count();
                }

                multiplier += 0.001;
                var finalFuzzySystem = UpdateParamsByMultiplier(
                    originalDecisionMaker,
                    multiplier,
                    toStretch,
                    out canStretchMore);
                return finalFuzzySystem.Input;
            }
        }