package aima.core.search.framework;
import java.util.Comparator;
import java.util.List;
import aima.core.agent.Action;
import aima.core.search.framework.problem.Problem;
import aima.core.search.framework.qsearch.QueueSearch;
/**
* Performs search by creating a priority queue based on a given
* <code>Comparator</code> and feeding it to a given <code>QueueSearch</code>
* implementation which finally controls the simulated search space exploration.
*
* @author Ravi Mohan
* @author Ruediger Lunde
*/
public class PrioritySearch implements SearchForActions, SearchForStates {
private final QueueSearch implementation;
private final Comparator<Node> comparator;
public PrioritySearch(QueueSearch impl, Comparator<Node> comp) {
implementation = impl;
comparator = comp;
}
@Override
public List<Action> findActions(Problem p) {
implementation.getNodeExpander().useParentLinks(true);
Node node = implementation.findNode(p, QueueFactory.<Node>createPriorityQueue(comparator));
return node == null ? SearchUtils.failure() : SearchUtils.getSequenceOfActions(node);
}
@Override
public Object findState(Problem p) {
implementation.getNodeExpander().useParentLinks(false);
Node node = implementation.findNode(p, QueueFactory.<Node>createPriorityQueue(comparator));
return node == null ? null : node.getState();
}
public Comparator<Node> getComparator() {
return comparator;
}
@Override
public NodeExpander getNodeExpander() {
return implementation.getNodeExpander();
}
@Override
public Metrics getMetrics() {
return implementation.getMetrics();
}
}