@Override
	protected boolean createPath(Lane start)
	{
		/*if(fPathList.get(fStart.hashCode() + fEnd.hashCode()) != null)
		{
			fPath = new LinkedList<Lane>(fPathList.get(fStart.hashCode() + fEnd.hashCode()));
			return true;
		}*/
		fClosedList = new ArrayList<Lane>();
		fOpenList = new SortedNodeList();
		Graphics2D g = start.getEnd().getSide().getTile().getMap().getTheGraphics();
        double fromStartToEnd = start.getStart().getPosition().distance(fEnd.getEnd().getPosition());
        Candidate current = new Candidate(start);
        current.fDistanceToGoal = fromStartToEnd;
        fOpenList.add(current);
        while (fOpenList.size() != 0)
		{
			fOpenList.sort();
			current = fOpenList.getFirst();
			fOpenList.remove(current);
			//draw(g, current);
			if(current.candidate.equals(fEnd))
			{
				getPath(current);
				fPathList.put(fStart.hashCode()+"" + fEnd.hashCode(),fPath);
				return true;
			}


			fClosedList.add(current.candidate);
			for (Lane lane : current.candidate.getEnd().getOutputLanes())
			{
				Candidate neighbour = new Candidate(lane);
				if(fClosedList.contains(lane))
					continue;

			double distanceToStart = current.fDistanceToStart + lane.getTrajectory().getLength();

				double distanceToEnd = lane.getEnd().getPosition().distance(fEnd.getEnd().getPosition());

				double heatMapReading = getHeatMapReading(lane);
				distanceToStart = distanceToStart + fGlobals.getConfig().getHeatMapModifier()* heatMapReading;


				if(fOpenList.contains(neighbour) && distanceToStart >= fOpenList.getByLane(neighbour).fDistanceToStart)
					continue;

				neighbour.setPrevious(current);
				neighbour.setDistanceToStart(distanceToStart);
				neighbour.fDistanceToGoal = distanceToEnd;

				if (fOpenList.contains(neighbour))
				{
					fOpenList.getByLane(neighbour).fDistanceToStart = distanceToStart;
				}
				else
				{
					fOpenList.add(neighbour);

				}
			}
		}
		return false;
	}