mirror of
https://github.com/RAIRLab/Spectra.git
synced 2024-12-03 12:01:56 -05:00
Breadth First Search Implementation
This commit is contained in:
parent
bad5fb5914
commit
395872a4d4
1 changed files with 119 additions and 0 deletions
119
src/main/java/com/naveensundarg/planner/BreadthFirstPlanner.java
Normal file
119
src/main/java/com/naveensundarg/planner/BreadthFirstPlanner.java
Normal file
|
@ -0,0 +1,119 @@
|
|||
package com.naveensundarg.planner;
|
||||
|
||||
import com.naveensundarg.planner.utils.PlanningProblem;
|
||||
import com.naveensundarg.shadow.prover.representations.formula.Formula;
|
||||
import com.naveensundarg.shadow.prover.utils.Pair;
|
||||
import com.naveensundarg.shadow.prover.utils.Sets;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.commons.lang3.tuple.Triple;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Created by naveensundarg on 1/13/17.
|
||||
*/
|
||||
public class BreadthFirstPlanner implements Planner {
|
||||
|
||||
private static int MAX_DEPTH = 7;
|
||||
|
||||
public BreadthFirstPlanner(){ }
|
||||
|
||||
public static int getMaxDepth() {
|
||||
return MAX_DEPTH;
|
||||
}
|
||||
|
||||
public static void setMaxDepth(int maxDepth) {
|
||||
MAX_DEPTH = maxDepth;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Set<Plan>> plan(Set<Formula> background, Set<Action> actions, State start, State goal) {
|
||||
|
||||
|
||||
// Search Space Data Structures
|
||||
Set<State> history = new HashSet<State>();
|
||||
Queue<Triple<List<State>, List<Action>, Integer>> search = new ArrayDeque<Triple<List<State>,List<Action>,Integer>>();
|
||||
|
||||
// Submit Initial State
|
||||
search.add(Triple.of(List.of(start), new ArrayList<Action>(), 0));
|
||||
|
||||
// Breadth First Traversal until
|
||||
// - Goal Reached
|
||||
// - No more actions can be applied
|
||||
// - Max depth reached
|
||||
while (!search.isEmpty()) {
|
||||
|
||||
Triple<List<State>, List<Action>, Integer> currentSearch = search.remove();
|
||||
|
||||
// Return if we're past the depth limit
|
||||
int currentDepth = currentSearch.getRight();
|
||||
if (currentDepth >= MAX_DEPTH) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
List<State> previous_states = currentSearch.getLeft();
|
||||
List<Action> previous_actions = currentSearch.getMiddle();
|
||||
|
||||
State lastState = previous_states.get(previous_states.size() - 1);
|
||||
|
||||
// If we're at the goal return
|
||||
if (Operations.satisfies(background, lastState, goal)) {
|
||||
return Optional.of(Sets.with(
|
||||
new Plan(previous_actions, previous_states, background)
|
||||
));
|
||||
}
|
||||
|
||||
// Try to apply each action to get to the next state
|
||||
for (Action action : actions.stream().filter(Action::isNonTrivial).collect(Collectors.toSet())) {
|
||||
Optional<Set<Pair<State, Action>>> nextStateActionPairs = Operations.apply(background, action, lastState);
|
||||
|
||||
if (nextStateActionPairs.isPresent()) {
|
||||
|
||||
// Actions aren't grounded, so each nextState represents a different
|
||||
// paramter binding
|
||||
for (Pair<State, Action> stateActionPair : nextStateActionPairs.get()) {
|
||||
State nextState = stateActionPair.first();
|
||||
Action nextAction = stateActionPair.second();
|
||||
|
||||
// Prune already visited states
|
||||
if (history.contains(nextState)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
List<State> next_states = new ArrayList<State>(previous_states);
|
||||
next_states.add(nextState);
|
||||
|
||||
List<Action> next_actions = new ArrayList<Action>(previous_actions);
|
||||
next_actions.add(nextAction);
|
||||
|
||||
// Add new state to history and search space
|
||||
search.add(Triple.of(next_states, next_actions, currentDepth + 1));
|
||||
history.add(nextState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Set<Plan>> plan(PlanningProblem problem, Set<Formula> background, Set<Action> actions, State start, State goal) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
|
||||
public Optional<Set<Plan>> plan(PlanningProblem problem, Set<Formula> background, Set<Action> actions, State start, State goal, List<PlanMethod> planMethods){
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
|
||||
public Optional<Plan> verify(Set<Formula> background, State start, State goal, PlanSketch planSketch){
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue