To solve a problem using the constraint_solver package, you must model it as a Constraint Satisfaction Problem (CSP) consisting of three components:
- Variables: A list of entities that need to be assigned values.
- Domains: A mapping where each variable is associated with a list of possible values.
- Constraints: Rules that must be satisfied by the assignments. You implement these by subclassing the
Constraint<V, D> class and overriding the isSatisfied(Map<V, D> assignment) method.
Once modeled, instantiate the CSP<V, D> class with your variables and domains, add your constraints using addConstraint(), and execute the solver using backtrackingSearch().
// 1. Define variables
var doug = Person('Doug', dislikes: ['artichoke']);
var patrick = Person('Patrick', dislikes: ['bananas']);
var susan = Person('Susan', dislikes: ['broccoli']);
var variables = [doug, patrick, susan];
// 2. Define domains
var meals = ['artichoke', 'bananas', 'broccoli'];
var domains = {
doug: meals,
patrick: meals,
susan: meals,
};
// 3. Define constraints by subclassing Constraint
class AvoidDislikes extends Constraint<Person, String> {
AvoidDislikes(super.variables);
@override
bool isSatisfied(Map<Person, String> assignment) {
// Implementation logic goes here
return true;
}
}
// 4. Run the solver
var csp = CSP<Person, String>(variables, domains);
csp.addConstraint(AvoidDislikes(variables));
var result = csp.backtrackingSearch();
print(result);