public long startEvolution(long cycleLimit) {
		long cycle = 0;
		boolean finalForm = false;
		List <E>newList = null;
		
		A : while(cycle < cycleLimit && finalForm == false){
			int maxFitness = problemSet.getProblems().size();
			
			//calculate fitness values
			for(E c : candidates){
				//c.checkViabilityAndResetIfNeeded();
				c.setFitness(c.fitness(problemSet));
			}
			Collections.sort(candidates);
			
			if(newList == null){
				newList = new LinkedList<E>();
			}else{
				newList.clear();
			}
			for(int i = 0;i < (candidates.size())/2;i++){
				if(candidates.get(i).getFitness() == maxFitness){
					//System.out.println("Winner candidate found..stresstesting it");
					if(candidates.get(i).checkValidity(reference)){
						winner = candidates.get(i);
						finalForm = true;
						break A;
					}
				}
				if(candidates.get(i).getFitness() > maxC){
					maxC = candidates.get(i).getFitness();
				}
				
				newList.add(candidates.get(i)); //add old object
				newList.add((E)candidates.get(i).cloneWithMutation()); //add mutated clone
			}
			
			//continue with new list
			candidates.clear();
			candidates.addAll(newList);
			
			//evolve problem set
			problemSet.evolve(0.5);
						
			cycle++;
		}
		return cycle;
	}