/** * This method return the output of the model defuzzified * * @param x The output */ public double output(double[] x) { FuzzyAlphaCut xfuzzy[] = new FuzzyAlphaCut[x.length]; for (int i = 0; i < x.length; i++) xfuzzy[i] = new FuzzyAlphaCut(new FuzzyNumberTRIANG(x[i], x[i], x[i])); R.replaceTerminals(xfuzzy); IntDouble[] result = R.CrispEval(); if (defuzType == RuleBase.DEFUZCDM) { double addcenter = 0, addweight = 0; for (int i = 0; i < result.length; i++) { addcenter += C.getComponent(result[i].consequent).massCentre() * result[i].weight; addweight += result[i].weight; } if (addweight == 0) return 0; // The output is not covered. This mustn't ocurr. return addcenter / addweight; } if (defuzType == RuleBase.DEFUZMAX) { double center = 0, maxweight = 0; for (int i = 0; i < result.length; i++) { if (result[i].weight >= maxweight) { maxweight = result[i].weight; center = C.getComponent(result[i].consequent).massCentre(); } } if (maxweight == 0) return 0; // The output is not covered. This musn't ocurr. return center; } return 0; }