More tweaks.

This commit is contained in:
Naveen Sundar Govindarajulu 2017-01-16 00:02:52 -05:00
parent c9201bc0b2
commit afde7793e5
7 changed files with 69 additions and 33 deletions

View file

@ -36,7 +36,7 @@ public class DepthFirstPlanner implements Planner {
if (Operations.satisfies(background, start, goal)) { if (Operations.satisfies(background, start, goal)) {
//Already satisfied. Do nothing. Return a set with an empty plan. //Already satisfied. Do nothing. Return a set with an empty plan.
return Optional.of(Sets.with(Plan.newEmptyPlan(goal, background))); return Optional.of(Sets.with(Plan.newEmptyPlan(start, background)));
} }

View file

@ -3,7 +3,9 @@ package edu.rpi.rair;
import com.naveensundarg.shadow.prover.representations.formula.Formula; import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.utils.CollectionUtils; import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.Pair; import com.naveensundarg.shadow.prover.utils.Pair;
import com.naveensundarg.shadow.prover.utils.Sets;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -50,16 +52,19 @@ public class GoalTracker {
Set<Plan> plans = possiblePlans.get(); Set<Plan> plans = possiblePlans.get();
Optional<Plan> noConflictPlan = plans.stream().filter(plan -> plan.noConflicts(currentGoals)).findAny(); Optional<Plan> possibleNoConflictPlan = plans.stream().filter(plan -> plan.noConflicts(currentGoals)).
sorted(Comparator.comparing(plan->plan.getActions().size())).findAny();
if (noConflictPlan.isPresent()) { if (possibleNoConflictPlan.isPresent()) {
/* /*
* If there is any plan without any goal conflicts, then adopt the goal. * If there is any plan without any goal conflicts, then adopt the goal.
*/ */
Plan noConflictPlan = possibleNoConflictPlan.get();
currentGoals.add(goal); currentGoals.add(goal);
return noConflictPlan; currentState = noConflictPlan.getExpectedStates().get(noConflictPlan.getExpectedStates().size()-1);
return possibleNoConflictPlan;
} else { } else {
@ -72,30 +77,35 @@ public class GoalTracker {
*/ */
boolean feasiblePlanExists = false; boolean feasiblePlanExists = false;
int bestPlanSize = Integer.MAX_VALUE;
double bestPriorityGap = 0; double bestPriorityGap = 0;
Set<Goal> bestRemovalCandidates = null; Set<Goal> bestRemovalCandidates = null;
Plan feasiblePlan = null; Set<Plan> feasiblePlans = Sets.newSet();
for (Plan plan : plans) { for (Plan plan : plans) {
Set<Goal> conflictingGoals = plan.getConflictingGoals(currentGoals); Set<Goal> conflictingGoals = plan.getConflictingGoals(currentGoals);
double conflictSum = conflictingGoals.stream().mapToDouble(Goal::getPriority).sum(); double conflictSum = conflictingGoals.stream().mapToDouble(Goal::getPriority).sum();
double gap = goal.getPriority() - conflictSum; double gap = goal.getPriority() - conflictSum;
if(gap > 0 && gap > bestPriorityGap ){ if(gap > 0 && gap >= bestPriorityGap && plan.getActions().size() <= bestPlanSize){
feasiblePlanExists = true; feasiblePlanExists = true;
bestPriorityGap = gap; bestPriorityGap = gap;
feasiblePlan = plan; bestPlanSize = plan.getActions().size();
feasiblePlans.add(plan);
bestRemovalCandidates= conflictingGoals; bestRemovalCandidates= conflictingGoals;
} }
} }
if(feasiblePlan!=null){ if(!feasiblePlans.isEmpty()){
Plan bestPlan = feasiblePlans.stream().
min(Comparator.comparing(plan->plan.getActions().stream().mapToInt(Action::getWeight).sum())).get();
currentGoals.removeAll(bestRemovalCandidates); currentGoals.removeAll(bestRemovalCandidates);
currentGoals.add(goal); currentGoals.add(goal);
currentState = bestPlan.getExpectedStates().get(bestPlan.getExpectedStates().size()-1);
return Optional.of(feasiblePlan); return Optional.of(bestPlan);
} }
else { else {

View file

@ -31,6 +31,10 @@ public class Plan {
return actions; return actions;
} }
public List<State> getExpectedStates() {
return expectedStates;
}
public Plan getPlanByStartingWith(Action action, State state){ public Plan getPlanByStartingWith(Action action, State state){
List<Action> newActions = CollectionUtils.newEmptyList(); List<Action> newActions = CollectionUtils.newEmptyList();
newActions.addAll(actions); newActions.addAll(actions);

View file

@ -60,26 +60,21 @@
] ]
} }
:goals {G1 {:priority 1.0 :goals {G1 {:priority 6.0
:state [(not (open (door room1)))]} :state [(not (open (door room1)))]}
G2 {:priority 1.0 G2 {:priority 6.0
:state [(in prisoner room1)]} :state [(in prisoner room1)]}
G3 {:priority 1.0 G3 {:priority 6.0
:state [(forall [?room] :state [(forall [?room]
(if (in prisoner ?room) (if (in prisoner ?room)
(in self ?room)))]} (in self ?room)))]}
G4 {:priority 3.0
G4 {:priority 2.0
:state [(interrogates commander prisoner)]}
G5 {:priority 1.0
:state [(in prisoner room2) :state [(in prisoner room2)
(in self room2)]} (in self room2)]}
G5 {:priority 2.0
:state [(interrogates commander prisoner)]}}
}
} }

View file

@ -0,0 +1,16 @@
{G1 {:priority 6.0
:state [(not (open (door room1)))]}
G2 {:priority 6.0
:state [(in prisoner room1)]}
G3 {:priority 6.0
:state [(forall [?room]
(if (in prisoner ?room)
(in self ?room)))]}
G4 {:priority 3.0
:state [(in prisoner room2)
(in self room2)]}
G5 {:priority 2.0
:state [(interrogates commander prisoner)]}}

View file

@ -60,26 +60,21 @@
] ]
} }
:goals {G1 {:priority 1.0 :goals {G1 {:priority 6.0
:state [(not (open (door room1)))]} :state [(not (open (door room1)))]}
G2 {:priority 1.0 G2 {:priority 6.0
:state [(in prisoner room1)]} :state [(in prisoner room1)]}
G3 {:priority 1.0 G3 {:priority 6.0
:state [(forall [?room] :state [(forall [?room]
(if (in prisoner ?room) (if (in prisoner ?room)
(in self ?room)))]} (in self ?room)))]}
G4 {:priority 3.0
G4 {:priority 2.0
:state [(interrogates commander prisoner)]}
G5 {:priority 1.0
:state [(in prisoner room2) :state [(in prisoner room2)
(in self room2)]} (in self room2)]}
G5 {:priority 2.0
:state [(interrogates commander prisoner)]}}
}
} }

View file

@ -0,0 +1,16 @@
{G1 {:priority 6.0
:state [(not (open (door room1)))]}
G2 {:priority 6.0
:state [(in prisoner room1)]}
G3 {:priority 6.0
:state [(forall [?room]
(if (in prisoner ?room)
(in self ?room)))]}
G4 {:priority 3.0
:state [(in prisoner room2)
(in self room2)]}
G5 {:priority 2.0
:state [(interrogates commander prisoner)]}}