/** * Perform an update to the set. * * @param matchSet the match set used for the update * @param correctSet the correct set used for the update */ @Override public void performUpdate(final ClassifierSet matchSet, final ClassifierSet correctSet) { double strengthSum = 0; final int matchSetMacroclassifiers = matchSet.getNumberOfMacroclassifiers(); final int correctSetSize = correctSet.getTotalNumerosity(); for (int i = 0; i < matchSetMacroclassifiers; i++) { final Classifier cl = matchSet.getClassifier(i); UCSClassifierData data = ((UCSClassifierData) cl.getUpdateDataObject()); cl.experience++; data.msa += 1; if (correctSet.getClassifierNumerosity(cl) > 0) { data.cs = data.cs + (b * (correctSetSize - data.cs)); data.tp += 1; final double accuracy = ((double) data.tp) / ((double) data.msa); if (accuracy > accuracy0) { data.fitness0 = 1; // Check subsumption if (cl.experience >= this.subsumptionExperienceThreshold) cl.setSubsumptionAbility(true); } else { data.fitness0 = a * Math.pow(accuracy / accuracy0, n); cl.setSubsumptionAbility(false); } strengthSum += data.fitness0 * matchSet.getClassifierNumerosity(i); } else { data.fp += 1; data.fitness0 = 0; } } // Fix for avoiding problems... if (strengthSum == 0) strengthSum = 1; // double fitnessSum = 0; final int msSize = matchSet.getNumberOfMacroclassifiers(); for (int i = 0; i < msSize; i++) { Classifier cl = matchSet.getClassifier(i); UCSClassifierData data = ((UCSClassifierData) cl.getUpdateDataObject()); data.fitness += b * ((data.fitness0 / strengthSum) - data.fitness); // TODO: // Something // else? // fitnessSum += data.fitness * matchSet.getClassifierNumerosity(i); } }
@Override public void setComparisonValue( final Classifier aClassifier, final int mode, final double comparisonValue) { final UCSClassifierData data = ((UCSClassifierData) aClassifier.getUpdateDataObject()); data.fitness = comparisonValue; }