protected boolean createPath(Lane next)
    {
        fPath.add(next);
        if(next.equals(fEnd))
        {
            return true;
        }
	    //draw((Graphics2D)(next.getGlobals().getMap().getGraphics()),new Candidate(next));
        Collection<Lane> candidates = next.getEnd().getOutputLanes();
        List<Candidate> candidateCollection = new ArrayList<Candidate>();
	    double startEndDistance = fStart.getEnd().getPosition().distance(fEnd.getStart().getPosition());
	    for (Lane lane : candidates)
        {
	        double distance = lane.getEnd().getPosition().distance(fEnd.getStart().getPosition());
	        Candidate candidate = new Candidate(lane);
	        candidate.candidate = lane;
	        Lane cand = candidate.candidate;
	        Lane randomLane = cand.getEnd().getRandomLane();
	        double heatMapReading = 0;
	        if(randomLane != null)
	        {
		        heatMapReading = getHeatMapReading(startEndDistance, lane, cand, randomLane);
	        }

	        candidate.fDistanceToGoal = distance +1.0*heatMapReading ;
            candidateCollection.add(candidate);
        }


        Collections.sort(candidateCollection);
        for (Candidate candidate : candidateCollection)
        {
            if(!fNoGo.contains(candidate.hashCode())&&!fPath.contains(candidate.candidate) &&createPath(candidate.candidate))
            {
                return true;
            }
        }
        int wrongIndex = fPath.indexOf(next);
        for (int i = wrongIndex; i< fPath.size();i++)
        {
	        fNoGo.add(fPath.get(i).hashCode());
	        fPath.remove(i);
        }

        return false;
    }