/**
* Template method, which can be configured by overriding the three
* primitive operations below.
*/
private Assignment recursiveBackTrackingSearch(CSP csp,
Assignment assignment)
{
Assignment result = null;
if (assignment.isComplete(csp.getVariables()))
{
result = assignment;
}
else
{
Variable var = selectUnassignedVariable(assignment, csp);
foreach (Object value in orderDomainValues(var, assignment, csp))
{
assignment.setAssignment(var, value);
fireStateChanged(assignment, csp);
if (assignment.isConsistent(csp.getConstraints(var)))
{
DomainRestoreInfo info = inference(var, assignment, csp);
if (!info.isEmpty())
fireStateChanged(csp);
if (!info.isEmptyDomainFound())
{
result = recursiveBackTrackingSearch(csp, assignment);
if (result != null)
break;
}
info.restoreDomains(csp);
}
assignment.removeAssignment(var);
}
}
return result;
}