public Path aStar(Node start, Node goal) {
		this.h = new StraightLineDistanceHeuristic();
		if (!graph.contains(start)) {
			// Fail -- start or goal node not in graph
			System.out.println("start not in graph");
			return null;
		}
		
		if (!graph.contains(goal)) {
			System.out.println("goal not in graph");
			return null;
		}
		
		ArrayList<Node> closedList = new ArrayList<Node>();
		SortedList openList = new SortedList();

		openList.add(start);
		
		// Loop while open-list has nodes
		while (!openList.isEmpty()) {
			Node current = openList.getFirst();
			
			// Check if goal reached
			if (current.equals(goal)) {
				return new Path(goal);
			}
			
			// Move current node to visited lists
			openList.remove(current);
			closedList.add(current);
			
			// Iterate over edges running from current node
			for (Edge e : current.getEdges()) {
				// Get destination nodes
				Node n = e.getTo();
				boolean neighborIsBetter;
				// Check if n is already visited
				if (closedList.contains(n)) {
					continue;
				}
				
				// Calculate distance from start to neighbor
				double neighborDistFromStart = current.getG() + current.distanceTo(n);
				
				if (!openList.contains(n)) {
					openList.add(n);
					neighborIsBetter = true;
				} else if (neighborDistFromStart < current.getG()) {
					neighborIsBetter = true;
				} else {
					neighborIsBetter = false;
				}
				
				if (neighborIsBetter) {
					n.setIncoming(e);
					n.setG(neighborDistFromStart);
					n.setH(h.getHeuristicDistance(n, goal));
				}
			}
		}
		
		// Return no path found
		return null;
	}