Skip to content

Commit 2c6acd9

Browse files
committed
Demo for GraphPlanAlgorithm added.
1 parent f1fd09d commit 2c6acd9

File tree

5 files changed

+72
-16
lines changed

5 files changed

+72
-16
lines changed

aima-core/src/main/java/aima/core/logic/planning/ActionSchema.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121
* @author samagra
2222
*/
2323
public class ActionSchema {
24+
25+
/**
26+
* Name for persistence actions.
27+
*/
28+
public final static String NO_OP = "No-op";
29+
2430
List<Term> variables;// list of variables
2531
List<Literal> precondition; //PRECONDITION: treated as a conjunction of fluents
2632
List<Literal> effects;//EFFECT: treated as a conjunction of fluents
@@ -56,11 +62,17 @@ private void sortEffects() {
5662
@Override
5763
public String toString() {
5864
String result = "Action(" + this.getName() + ")\n\tPRECOND:";
59-
for (Literal precond : getPrecondition())
60-
result = result + "^" + precond.toString();
65+
String and = "";
66+
for (Literal precond : getPrecondition()) {
67+
result = result + and + precond.toString();
68+
and = "^";
69+
}
6170
result = result + "\n\tEFFECT:";
62-
for (Literal effect : getEffects())
63-
result = result + "^" + effect.toString();
71+
and = "";
72+
for (Literal effect : getEffects()) {
73+
result = result + and + effect.toString();
74+
and = "^";
75+
}
6476
return result;
6577
}
6678

aima-core/src/main/java/aima/core/logic/planning/GraphPlanAlgorithm.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import aima.core.logic.fol.kb.data.Literal;
44

55
import java.util.*;
6+
import java.util.stream.Collectors;
67

78
/**
89
* Artificial Intelligence A Modern Approach (3rd Edition): Figure 10.9 page
@@ -139,6 +140,13 @@ private List<List<ActionSchema>> extractSolution(Graph graph, List<Literal> goal
139140
return null;
140141
}
141142

143+
public List<ActionSchema> asFlatList(List<List<ActionSchema>> solution) {
144+
List<ActionSchema> result = solution.stream().flatMap(Collection::stream)
145+
.filter(actionSchema -> !ActionSchema.NO_OP.equals(actionSchema.getName()))
146+
.collect(Collectors.toList());
147+
return result;
148+
}
149+
142150
/**
143151
* This method is used to check if all goals are present in a particular state
144152
* and none of them has a mutex link.
@@ -155,8 +163,7 @@ private boolean checkAllGoalsNonMutex(Level level, List<Literal> goals) {
155163
for (Object literal : goals) {
156164
List<Object> mutexOfGoal = level.getMutexLinks().get(literal);
157165
if (mutexOfGoal != null) {
158-
for (Object object :
159-
mutexOfGoal) {
166+
for (Object object : mutexOfGoal) {
160167
if (goals.contains((Literal) object)) {
161168
mutexCheck = true;
162169
break;

aima-core/src/main/java/aima/core/logic/planning/Level.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public Level(Level prevLevel, Problem problem) {
5555
calculateNextLinks();
5656
calculateMutexLinks(null);
5757
}
58-
addPersistentActions();
58+
addPersistenceActions();
5959
}
6060

6161
public Level(Level prevLevel, Problem problem, String extraLiterals) {
@@ -70,7 +70,7 @@ public void addExtraLiterals(String s) {
7070
}
7171
calculateNextLinks();
7272
calculateMutexLinks(getPrevLevel());
73-
addPersistentActions();
73+
addPersistenceActions();
7474
}
7575

7676
public List<Object> getLevelObjects() {
@@ -93,10 +93,10 @@ public Problem getProblem() {
9393
return problem;
9494
}
9595

96-
private void addPersistentActions() {
96+
private void addPersistenceActions() {
9797
if(getLevelObjects().get(0) instanceof Literal) {
9898
for (Object literal : getLevelObjects()) {
99-
ActionSchema action = new ActionSchema("No-op", null,
99+
ActionSchema action = new ActionSchema(ActionSchema.NO_OP, null,
100100
Collections.singletonList((Literal) literal),
101101
Collections.singletonList((Literal) literal));
102102
addToHashMap(literal, action, nextLinks);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package aima.gui.demo.logic;
2+
3+
import aima.core.logic.planning.ActionSchema;
4+
import aima.core.logic.planning.GraphPlanAlgorithm;
5+
import aima.core.logic.planning.PlanningProblemFactory;
6+
import aima.core.logic.planning.Problem;
7+
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
/**
12+
* Demonstrates how the GraphPlanAlgorithm solves different example problems.
13+
* @author Ruediger Lunde
14+
*/
15+
public class GraphPlanAlgorithmDemo {
16+
public static void main(String[] args) {
17+
GraphPlanAlgorithm algorithm = new GraphPlanAlgorithm();
18+
List<Problem> problems = Arrays.asList(
19+
PlanningProblemFactory.spareTireProblem(),
20+
PlanningProblemFactory.goHomeToSFOProblem(),
21+
PlanningProblemFactory.airCargoTransportProblem());
22+
23+
int i = 1;
24+
for (Problem problem : problems) {
25+
System.out.println("\n\nProblem " + i++);
26+
System.out.println("Initial State:");
27+
System.out.println(problem.getInitialState().getFluents());
28+
System.out.println("Goal State:");
29+
System.out.println(problem.getGoalState().getFluents());
30+
31+
long start = System.currentTimeMillis();
32+
List<List<ActionSchema>> solution = algorithm.graphPlan(problem);
33+
long duration = System.currentTimeMillis() - start;
34+
System.out.println("Time for Planning [ms]: " + duration);
35+
36+
System.out.println("Plan:");
37+
List<ActionSchema> sol = algorithm.asFlatList(solution);
38+
sol.forEach(System.out::println);
39+
}
40+
}
41+
}

aima-gui/src/main/java/aima/gui/fx/applications/IntegratedAimaFxApp.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@
55
import aima.gui.demo.agent.TrivialVacuumDemo;
66
import aima.gui.demo.agent.WumpusAgentDemo;
77
import aima.gui.demo.learning.LearningDemo;
8-
import aima.gui.demo.logic.DpllDemo;
9-
import aima.gui.demo.logic.FolDemo;
10-
import aima.gui.demo.logic.PlFcEntailsDemo;
11-
import aima.gui.demo.logic.PlResolutionDemo;
12-
import aima.gui.demo.logic.TTEntailsDemo;
13-
import aima.gui.demo.logic.WalkSatDemo;
8+
import aima.gui.demo.logic.*;
149
import aima.gui.demo.search.EightPuzzleDemo;
1510
import aima.gui.demo.search.MapColoringCspDemo;
1611
import aima.gui.demo.search.NQueensDemo;
@@ -95,6 +90,7 @@ public static void defineContent(IntegratedAppBuilder builder) {
9590
builder.registerDemo(DpllDemo.class);
9691
builder.registerDemo(WalkSatDemo.class);
9792
builder.registerDemo(FolDemo.class);
93+
builder.registerDemo(GraphPlanAlgorithmDemo.class);
9894

9995
// builder.registerDemo(ProbabilityDemo.class); // to slow.
10096
builder.registerDemo(LearningDemo.class); // to slow.

0 commit comments

Comments
 (0)