@Override
	public EAResult execute() {
		try {
			setIndividuals(new ArrayList<IndividualWithRealVectorPhenotype>(
					clusterCenters.size() * clusterSize));

			switch (state) {
			case EXEC1:
				logger.info("FakeEA - first execution: generating Gaussian samples in basins of attraction");
				// generate Gaussian cluster
				for (Coords2D c : clusterCenters) {
					EuclideanSpacePoint mean = new EuclideanSpacePoint(
							new double[] { c.getX(), c.getY() });
					Collection<EuclideanSpacePoint> points = PointGenerator
							.generateGaussianPoints2D(mean, standardDev,
									clusterSize);
					assignFitnessToPoints(points);
				}
				state = EXEC2;

				PrintUtils.writePopulation("fakePopulation1", getPopulation());
				break;

			case EXEC2:
				logger.info("FakeEA - second execution: generate uniformly distributed noise");
				// generate random cluster
				for (Coords2D c : clusterCenters) {
					EuclideanSpacePoint mean = new EuclideanSpacePoint(
							new double[] { c.getX(), c.getY() });
					Collection<EuclideanSpacePoint> points = PointGenerator
							.generateUniformCircle2D(mean, 8 * standardDev,
									clusterSize);
					assignFitnessToPoints(points);
				}
				state = FIN;

				PrintUtils.writePopulation("fakePopulation2", getPopulation());
				break;

			default:
				logger.warn("Execution of FakeEA is performed for the third time");
				break;
			}
		} catch (Exception e) {
			logger.error("FakeEA execution error", e);
		}

		return null;
	}