@Override
	protected FitnessFunction performClusteringAndFitnessDeterioration(
			Collection<Cluster<MetricSpacePoint>> currentClusters) {
		// sequential niching
		OpticsClustering<MetricSpacePoint> optics = (OpticsClustering<MetricSpacePoint>) getClusteringAlgorithm();

		// double delta = 0.5;
		Collection<Cluster<MetricSpacePoint>> extractedClusters = optics
				.cluster(new OpticsParamteres(optics.getEpsilon() * 0.75));

		if (extractedClusters.size() == 0) {
			return null;
		}

		currentClusters.addAll(extractedClusters);

		// cast clusters to pointsWithFitness
		List<Cluster<? extends PointWithFitness>> clustersForDeterioration = new ArrayList<Cluster<? extends PointWithFitness>>(
				extractedClusters.size());

		for (Cluster<MetricSpacePoint> cluster : extractedClusters) {
			SimpleCluster<PointWithFitness> simpleCluster = new SimpleCluster<PointWithFitness>();
			for (MetricSpacePoint obj : cluster.getClusterPoints()) {
				simpleCluster.addClusterPoint((PointWithFitness) obj);
			}
			clustersForDeterioration.add(simpleCluster);
		}

		FitnessFunction deterioratedFitness = getFitnessDeterioration()
				.deteriorateFitness(getProblemDomain().getFitnessFunction(),
						clustersForDeterioration);

		return deterioratedFitness;
	}