删除/添加约束 - optaplanner

时间:2017-09-07 10:47:00

标签: constraints add drools rules optaplanner

是否有可能完全忽略某些规则?我有一套规则,但我希望用户能够添加某些输入,比如他们想要规则1,规则2,规则3,规则5,但可能不是规则4.所以我希望程序识别出来,在检查约束违规时,根本不输入规则4

我怎么能这样做?

2 个答案:

答案 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:我们这里的实际问题比这更复杂,所以我简化了我们的方法,这是出于道德的原因。 ;)