一个通用的回溯约束满足算法。
用法
约束满足问题(CSP)可用于模拟必须找到一个解来满足一个或多个约束的问题。此类问题的例子包括事件调度或地图着色。
CSP 框架是一组*变量*,它们可以在称为*域*的范围内赋值。例如,如果我们为三位客人烹饪晚餐,我们会将他们定义为可以被赋值为一顿饭的变量。
var doug = Person('Doug', dislikes: ['artichoke']);
var patrick = Person('Patrick', dislikes: ['bananas']);
var susan = Person('Susan', dislikes: ['broccoli']);
var variables = [doug, patrick, susan];
每个客人的域(即餐点)可以建模为字符串列表,其中一个字符串将分配给每个变量(客人)。
var meals = ['artichoke', 'bananas', 'broccoli'];
var domains = {
doug: meals,
patrick: meals,
susan: meals,
};
最后,可以通过继承Constraint类来定义约束。
class AvoidDislikes extends Constraint<Person, String> {
AvoidDislikes(super.variables);
@override
bool isSatisfied(Map<Person, String> assignment) {
// ...
}
}
要运行回溯搜索解空间,请实例化CSP类并调用backtrackingSearch函数。
var csp = CSP<Person, String>(variables, domains);
csp.addConstraint(AvoidDislikes(variables));
var result = csp.backtrackingSearch();
print(result);
有关完整示例,请参阅examples/目录。
参考
Java 经典计算机科学问题 – David Kopec