package aima.gui.demo.search;
import aima.core.search.csp.Assignment;
import aima.core.search.csp.BacktrackingStrategy;
import aima.core.search.csp.CSP;
import aima.core.search.csp.CSPStateListener;
import aima.core.search.csp.ImprovedBacktrackingStrategy;
import aima.core.search.csp.MapCSP;
import aima.core.search.csp.MinConflictsStrategy;
import aima.core.search.csp.SolutionStrategy;
/**
* Demonstrates the performance of different constraint solving strategies.
* The map coloring problem from the textbook is used as CSP.
*
* @author Ruediger Lunde
*/
public class MapColoringCSPDemo {
public static void main(String[] args) {
CSP csp = new MapCSP();
StepCounter stepCounter = new StepCounter();
SolutionStrategy solver;
solver = new MinConflictsStrategy(1000);
solver.addCSPStateListener(stepCounter);
stepCounter.reset();
System.out.println("Map Coloring (Minimum Conflicts)");
System.out.println(solver.solve(csp.copyDomains()));
System.out.println(stepCounter.getResults() + "\n");
solver = new ImprovedBacktrackingStrategy(true, true, true, true);
solver.addCSPStateListener(stepCounter);
stepCounter.reset();
System.out.println("Map Coloring (Backtracking + MRV + DEG + AC3 + LCV)");
System.out.println(solver.solve(csp.copyDomains()));
System.out.println(stepCounter.getResults() + "\n");
solver = new BacktrackingStrategy();
solver.addCSPStateListener(stepCounter);
stepCounter.reset();
System.out.println("Map Coloring (Backtracking)");
System.out.println(solver.solve(csp.copyDomains()));
System.out.println(stepCounter.getResults() + "\n");
}
/** Counts assignment and domain changes during CSP solving. */
protected static class StepCounter implements CSPStateListener {
private int assignmentCount = 0;
private int domainCount = 0;
@Override
public void stateChanged(Assignment assignment, CSP csp) {
++assignmentCount;
}
@Override
public void stateChanged(CSP csp) {
++domainCount;
}
public void reset() {
assignmentCount = 0;
domainCount = 0;
}
public String getResults() {
StringBuffer result = new StringBuffer();
result.append("assignment changes: " + assignmentCount);
if (domainCount != 0)
result.append(", domain changes: " + domainCount);
return result.toString();
}
}
}