Skip to content

Commit f3dd4a6

Browse files
committed
New CSP NQueens application added.
1 parent 0c41f38 commit f3dd4a6

File tree

16 files changed

+610
-273
lines changed

16 files changed

+610
-273
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package aima.core.search.csp.examples;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import aima.core.search.csp.Assignment;
7+
import aima.core.search.csp.Constraint;
8+
import aima.core.search.csp.Variable;
9+
10+
/**
11+
* Represents a binary constraint which forbids equal values.
12+
*
13+
* @author Ruediger Lunde
14+
*/
15+
public class DiffNotEqualConstraint implements Constraint {
16+
17+
private Variable var1;
18+
private Variable var2;
19+
private int diff;
20+
private List<Variable> scope;
21+
22+
public DiffNotEqualConstraint(Variable var1, Variable var2, int diff) {
23+
this.var1 = var1;
24+
this.var2 = var2;
25+
this.diff = diff;
26+
scope = new ArrayList<Variable>(2);
27+
scope.add(var1);
28+
scope.add(var2);
29+
}
30+
31+
@Override
32+
public List<Variable> getScope() {
33+
return scope;
34+
}
35+
36+
@Override
37+
public boolean isSatisfiedWith(Assignment assignment) {
38+
Object value1 = assignment.getAssignment(var1);
39+
Object value2 = assignment.getAssignment(var2);
40+
return (value1 == null || value2 == null ||
41+
value1 instanceof Integer &&
42+
value2 instanceof Integer &&
43+
Math.abs((Integer) value1 - (Integer) value2) != diff);
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,57 @@
1-
package aima.core.search.csp;
2-
3-
4-
/**
5-
* Artificial Intelligence A Modern Approach (3rd Ed.): Figure 6.1, Page 204.<br>
6-
* <br>
7-
* The principal states and territories of Australia. Coloring this map can be
8-
* viewed as a constraint satisfaction problem (CSP). The goal is to assign
9-
* colors to each region so that no neighboring regions have the same color.
10-
*
11-
* @author Ruediger Lunde
12-
* @author Mike Stampone
13-
*/
14-
public class MapCSP extends CSP {
15-
public static final Variable NSW = new Variable("NSW");
16-
public static final Variable NT = new Variable("NT");
17-
public static final Variable Q = new Variable("Q");
18-
public static final Variable SA = new Variable("SA");
19-
public static final Variable T = new Variable("T");
20-
public static final Variable V = new Variable("V");
21-
public static final Variable WA = new Variable("WA");
22-
public static final String RED = "RED";
23-
public static final String GREEN = "GREEN";
24-
public static final String BLUE = "BLUE";
25-
26-
/**
27-
* Constructs a map CSP for the principal states and territories of
28-
* Australia, with the colors Red, Green, and Blue.
29-
*/
30-
public MapCSP() {
31-
addVariable(NSW);
32-
addVariable(WA);
33-
addVariable(NT);
34-
addVariable(Q);
35-
addVariable(SA);
36-
addVariable(V);
37-
addVariable(T);
38-
39-
Domain colors = new Domain(new Object[] { RED, GREEN, BLUE });
40-
41-
for (Variable var : getVariables())
42-
setDomain(var, colors);
43-
44-
addConstraint(new NotEqualConstraint(WA, NT));
45-
addConstraint(new NotEqualConstraint(WA, SA));
46-
addConstraint(new NotEqualConstraint(NT, SA));
47-
addConstraint(new NotEqualConstraint(NT, Q));
48-
addConstraint(new NotEqualConstraint(SA, Q));
49-
addConstraint(new NotEqualConstraint(SA, NSW));
50-
addConstraint(new NotEqualConstraint(SA, V));
51-
addConstraint(new NotEqualConstraint(Q, NSW));
52-
addConstraint(new NotEqualConstraint(NSW, V));
53-
}
1+
package aima.core.search.csp.examples;
2+
3+
import aima.core.search.csp.CSP;
4+
import aima.core.search.csp.Domain;
5+
import aima.core.search.csp.Variable;
6+
7+
/**
8+
* Artificial Intelligence A Modern Approach (3rd Ed.): Figure 6.1, Page 204.<br>
9+
* <br>
10+
* The principal states and territories of Australia. Coloring this map can be
11+
* viewed as a constraint satisfaction problem (CSP). The goal is to assign
12+
* colors to each region so that no neighboring regions have the same color.
13+
*
14+
* @author Ruediger Lunde
15+
* @author Mike Stampone
16+
*/
17+
public class MapCSP extends CSP {
18+
public static final Variable NSW = new Variable("NSW");
19+
public static final Variable NT = new Variable("NT");
20+
public static final Variable Q = new Variable("Q");
21+
public static final Variable SA = new Variable("SA");
22+
public static final Variable T = new Variable("T");
23+
public static final Variable V = new Variable("V");
24+
public static final Variable WA = new Variable("WA");
25+
public static final String RED = "RED";
26+
public static final String GREEN = "GREEN";
27+
public static final String BLUE = "BLUE";
28+
29+
/**
30+
* Constructs a map CSP for the principal states and territories of
31+
* Australia, with the colors Red, Green, and Blue.
32+
*/
33+
public MapCSP() {
34+
addVariable(NSW);
35+
addVariable(WA);
36+
addVariable(NT);
37+
addVariable(Q);
38+
addVariable(SA);
39+
addVariable(V);
40+
addVariable(T);
41+
42+
Domain colors = new Domain(new Object[] { RED, GREEN, BLUE });
43+
44+
for (Variable var : getVariables())
45+
setDomain(var, colors);
46+
47+
addConstraint(new NotEqualConstraint(WA, NT));
48+
addConstraint(new NotEqualConstraint(WA, SA));
49+
addConstraint(new NotEqualConstraint(NT, SA));
50+
addConstraint(new NotEqualConstraint(NT, Q));
51+
addConstraint(new NotEqualConstraint(SA, Q));
52+
addConstraint(new NotEqualConstraint(SA, NSW));
53+
addConstraint(new NotEqualConstraint(SA, V));
54+
addConstraint(new NotEqualConstraint(Q, NSW));
55+
addConstraint(new NotEqualConstraint(NSW, V));
56+
}
5457
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package aima.core.search.csp.examples;
2+
3+
import aima.core.search.csp.CSP;
4+
import aima.core.search.csp.Domain;
5+
import aima.core.search.csp.Variable;
6+
7+
public class NQueensCSP extends CSP {
8+
9+
public NQueensCSP(int size) {
10+
for (int i = 0; i < size; i++)
11+
addVariable(new Variable("Q" + (i+1)));
12+
13+
Integer[] values = new Integer[size];
14+
for (int i = 0; i < size; i++)
15+
values[i] = i+1;
16+
Domain positions = new Domain(values);
17+
18+
for (Variable var : getVariables())
19+
setDomain(var, positions);
20+
21+
for (int i = 0; i < size; i++) {
22+
Variable var1 = getVariables().get(i);
23+
for (int j = i+1; j < size; j++) {
24+
Variable var2 = getVariables().get(j);
25+
addConstraint(new DiffNotEqualConstraint(var1, var2, 0));
26+
addConstraint(new DiffNotEqualConstraint(var1, var2, j-i));
27+
}
28+
}
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,39 @@
1-
package aima.core.search.csp;
2-
3-
import java.util.ArrayList;
4-
import java.util.List;
5-
6-
/**
7-
* Represents a binary constraint which forbids equal values.
8-
*
9-
* @author Ruediger Lunde
10-
*/
11-
public class NotEqualConstraint implements Constraint {
12-
13-
private Variable var1;
14-
private Variable var2;
15-
private List<Variable> scope;
16-
17-
public NotEqualConstraint(Variable var1, Variable var2) {
18-
this.var1 = var1;
19-
this.var2 = var2;
20-
scope = new ArrayList<Variable>(2);
21-
scope.add(var1);
22-
scope.add(var2);
23-
}
24-
25-
@Override
26-
public List<Variable> getScope() {
27-
return scope;
28-
}
29-
30-
@Override
31-
public boolean isSatisfiedWith(Assignment assignment) {
32-
Object value1 = assignment.getAssignment(var1);
33-
return value1 == null || !value1.equals(assignment.getAssignment(var2));
34-
}
35-
}
1+
package aima.core.search.csp.examples;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import aima.core.search.csp.Assignment;
7+
import aima.core.search.csp.Constraint;
8+
import aima.core.search.csp.Variable;
9+
10+
/**
11+
* Represents a binary constraint which forbids equal values.
12+
*
13+
* @author Ruediger Lunde
14+
*/
15+
public class NotEqualConstraint implements Constraint {
16+
17+
private Variable var1;
18+
private Variable var2;
19+
private List<Variable> scope;
20+
21+
public NotEqualConstraint(Variable var1, Variable var2) {
22+
this.var1 = var1;
23+
this.var2 = var2;
24+
scope = new ArrayList<Variable>(2);
25+
scope.add(var1);
26+
scope.add(var2);
27+
}
28+
29+
@Override
30+
public List<Variable> getScope() {
31+
return scope;
32+
}
33+
34+
@Override
35+
public boolean isSatisfiedWith(Assignment assignment) {
36+
Object value1 = assignment.getAssignment(var1);
37+
return value1 == null || !value1.equals(assignment.getAssignment(var2));
38+
}
39+
}

0 commit comments

Comments
 (0)