private void expand(SyrianGraph g, SimpleHeuristicNode hn,
			AbstractList<SimpleHeuristicNode> toBeExpanded,
			AbstractList<SimpleHeuristicNode> alreadyExpanded) {
		this.setExpansions(this.getExpansions() + 1);
		// trivial expansion
		AbstractCollection<SyrianEdge> edges = g.getAllEdgesForVertex(hn
				.getRoot());
		for (SyrianEdge e : edges) {
			SyrianVertex destination = e.getOther(hn.getRoot());
			int sourceDistanceFromTarget = this.distancesFromTarget.get(hn
					.getRoot().getNumber());
			int destinationDistanceFromTarget = this.distancesFromTarget
					.get(destination.getNumber());
			this.addNewHeuristicNode(destination, hn, e, false, false,
					hn.getHn(), toBeExpanded, alreadyExpanded);
			if (hn.getRoot().hasChemicals() || hn.hasChemicals()) {
				// expand with chemicals
				this.addNewHeuristicNode(
						destination,
						hn,
						e,
						true,
						false,
						hn.getHn()
								- ((sourceDistanceFromTarget - destinationDistanceFromTarget) * 2),
						toBeExpanded, alreadyExpanded);
			}
			if (hn.getRoot().hasEscort() || hn.hasEscort()) {
				// expand with escort
				this.addNewHeuristicNode(destination, hn, e, false, true,
						hn.getHn(), toBeExpanded, alreadyExpanded);
			}
			if ((hn.getRoot().hasEscort() || hn.hasEscort())
					&& (hn.getRoot().hasChemicals() || hn.hasChemicals())) {
				// expand with chemicals and escort
				this.addNewHeuristicNode(
						destination,
						hn,
						e,
						true,
						true,
						hn.getHn()
								- ((sourceDistanceFromTarget - destinationDistanceFromTarget) * 2),
						toBeExpanded, alreadyExpanded);
			}
		}
	}