我需要帮助编写以下要求的累积逻辑:
要求:某些规则将提供应用于全局值的百分比。另一组规则应使用总计百分比来确定结果。
例如: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();
请在累积逻辑上提供帮助,以便在每次应用百分比阈值时应用更新后的值。
答案 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