mirror of
https://github.com/RAIRLab/Spectra.git
synced 2024-11-24 18:06:32 -05:00
More tweaks.
This commit is contained in:
parent
c9201bc0b2
commit
afde7793e5
7 changed files with 69 additions and 33 deletions
|
@ -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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)]}}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
16
src/main/resources/edu/rpi/rair/temp.clj
Normal file
16
src/main/resources/edu/rpi/rair/temp.clj
Normal 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)]}}
|
|
@ -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)]}}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
16
target/classes/edu/rpi/rair/temp.clj
Normal file
16
target/classes/edu/rpi/rair/temp.clj
Normal 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)]}}
|
Loading…
Reference in a new issue