Drools - 积累逻辑

时间:2018-01-17 19:19:33

标签: drools

我需要帮助编写以下要求的累积逻辑:

要求:某些规则将提供应用于全局值的百分比。另一组规则应使用总计百分比来确定结果。

例如:0.75是作为输入传递的全局值(阈值)。 规则1可能适用固定值的-10%,即。 0.75 - (0.75 * 0.10)= 0.675 Rule2将适用+ 20%的更新价值。即,0.675 +(0.675 * 0.20)= 0.81

我的全局值是0.75(阈值)

使用以下规则我尝试应用适用于固定值的百分比:

//类导入 全球双倍FIXED_THRESHOLD;

//规则

rule "Prediction Rule_2"
lock-on-active true
no-loop true
salience (2)
when
    LossInput (airBagDeployed == 'Y' ,  driveable == 'N')
    result : RuleResult(predictedTotalsThreshold == 0)
then
    insert(new ControlFact( -10.0 ) ); //Reduce -10% to global value 0.75 - 0.75* 0.10  = 0.675
    System.err.println("New control fact added to working memory....");
end

rule "Prediction Rule_1"
lock-on-active true
no-loop true
salience (1)
when
    LossInput (airBagDeployed == 'Y' ,  driveable == 'N', make == 'Honda' )
    result : RuleResult(predictedTotalsThreshold == 0)
then
    insert(new ControlFact( 20.0 ) ); // Add 20% to the updated aggregate (0.20 % of 0.675).
    System.err.println("New control fact added to working memory....");
end

我尝试了以下累积逻辑,但显然这是错误的。它始终只应用于固定值而不是更新值。

rule "Aggregate All Threshold"
no-loop true
when
         $aggregateTotalsThresholdPercentage : Number() from accumulate(
                                               ControlFact( $totalsThreshold : totalsThresholdPercentage  ),
                                               sum( ( FIXED_THRESHOLD + ( FIXED_THRESHOLD * $totalsThreshold ) / 100  ) ) )

            ruleResult: RuleResult(predictedTotalsThreshold == 0)

then

        ruleResult.setPredictedTotalsThreshold($aggregateTotalsThresholdPercentage.doubleValue());
    update(ruleResult);    
 end

POJO:

public class LossInput{
    private String airBagDeployed;
    private String driveable;
    private String make;
}


public class ControlFact {
    public double totalsThresholdPercentage;

}

public class RuleResult {
   private double predictedTotalsThreshold;
}


//insert facts in working memory
        kieSession.insert(lossInput);
        kieSession.insert(ruleResult);
        kieSession.setGlobal("FIXED_THRESHOLD", new Double(0.75));
        kieSession.fireAllRules();

请在累积逻辑上提供帮助,以便在每次应用百分比阈值时应用更新后的值。

1 个答案:

答案 0 :(得分:0)

您不能以这种方式使用accumulate / sum,因为您为每个FIXED_THRESHOLD添加了ControlFact

在“预测...”规则中插入ControlFacts(没有所有规则属性)。使用每个ControlFact更新RuleResult的predictTotalsThreshold。 “Aggregate”规则将反复触发,因此您需要确保撤消使用过的ControlFact。

rule "Aggregate All Threshold"
when
  ControlFact( $ttp: totalsThresholdPercentage );
  $res: RuleResult( $ptt: predictedTotalsThreshold)
then
  double nt = $ptt + $ptt*$ttp/100;
  modify( $res ){ setPredictedTotalsThreshold( $nt ) }
  retract( $res );
end