是否有可能完全忽略某些规则?我有一套规则,但我希望用户能够添加某些输入,比如他们想要规则1,规则2,规则3,规则5,但可能不是规则4.所以我希望程序识别出来,在检查约束违规时,根本不输入规则4
我怎么能这样做?
答案 0 :(得分:1)
一个简单的解决方案是创建
class Guard {
String rulename; ... }
并在您的规则中添加模式
rule rule_1
when
Guard( rulename == "rule_1" )
...
然后,您需要为应该阻止的规则插入Guard事实。
答案 1 :(得分:0)
我遇到了类似的问题,除了我希望用户控制每个规则权重[0到10]而不是二进制控件[active - inactive]。我不确定这是一个性能优化的答案(在合理的时间内为我工作,但当然这取决于你的语料库大小)。
我们使用的方法是创建一个 Singleton ,它保存用户在易失性内存中设置的每个规则权重,使用HashMap<Integer, Integer>
进行更快的随机访问(key =规则编号,值=规则权重),因为推理引擎可能会多次调用它。
然后,在我们的规则文件中,我们根据实际规则权重检查了when
子句中给定规则是否处于活动状态,以及then
子句中的更新得分:
import my.rules.singleton.package.MyRulesWeightSingleton;
rule "1"
when
eval(MyRulesWeightSingleton.isRuleActive(1))
//other conditions here.
then
scoreHolder.addHardConstraintMatch(kcontext, MyRulesWeightSingleton.getRuleWeight(1));
end
Singleton 将如下所示:
import java.util.HashMap;
public class MyRulesWeightSingleton {
private static MyRulesWeightSingleton instance;
private HashMap<Integer, Integer> weights;
private MyRulesWeightSingleton() {
this.weights = new HashMap<Integer, Integer>();
}
public static MyRulesWeightSingleton getInstance() {
if (instance == null) {
instance = new MyRulesWeightSingleton();
}
return instance;
}
public boolean isRuleActive(int ruleId) {
Integer weight = weights.get(ruleId);
return (weight != null && weight > 0);
}
public int getRuleWeight(int ruleId) {
Integer weight = weights.get(ruleId);
if (weight != null) {
return weight;
}
return 0;
}
//Allows you to put and remove weights information
//before running planner.
public HashMap<Integer, Integer> getWeights() {
return this.weights;
}
}
PS:我们这里的实际问题比这更复杂,所以我简化了我们的方法,这是出于道德的原因。 ;)