如何在Drools中扩展双Train对象属性比较规则(新增numberOfBoxes条件)
如何在Drools规则中新增基于numberOfBoxes属性的火车判断逻辑?
嘿,我来帮你搞定这个Drools规则的扩展问题~先理清楚当前的情况:你现在要给员工分配合适的火车,现有两辆火车的属性如下:
// Train 1 trainID=1 passengerCount=100 numberOfBoxes=12 // Train 2 trainID=2 passengerCount=150 numberOfBoxes=7
之前你已经用Drools规则通过passengerCount来筛选火车,原规则是这样的:
$train1 : TrainProperties($pasCnt : passengerCount) $train2 : TrainProperties($pasCnt2 : passengerCount > $pasCnt) then System.out.println("Train 2 is more important"); end
要新增基于numberOfBoxes的判断,具体实现得看你的业务优先级需求,我给你几个常见的可行方案:
方案1:优先看乘客数,乘客数相同时再比货箱数
如果你的核心需求是先保证乘客承载能力,只有当两辆火车乘客数一样时,再选择货箱容量更大的,可以拆分出两条规则,或者合并成一条逻辑更清晰的规则:
拆分规则版本(更易维护)
// 优先级更高:先判断乘客数多的火车 rule "Select Train by Passenger Count First" salience 10 // 数值越高,规则越先执行,确保乘客数判断优先 when $train1 : TrainProperties($pasCnt : passengerCount) $train2 : TrainProperties(passengerCount > $pasCnt) then System.out.println("Train " + $train2.getTrainID() + " is more important (higher passenger count)"); end // 乘客数相同时,判断货箱数多的火车 rule "Select Train by Box Count When Passengers Are Equal" when $train1 : TrainProperties($pasCnt : passengerCount, $boxCnt : numberOfBoxes) $train2 : TrainProperties(passengerCount == $pasCnt, numberOfBoxes > $boxCnt) then System.out.println("Train " + $train2.getTrainID() + " is more important (same passenger count, higher box count)"); end
合并规则版本(更简洁)
rule "Select Train by Passenger Then Box Count" when $train1 : TrainProperties($pasCnt1 : passengerCount, $boxCnt1 : numberOfBoxes) $train2 : TrainProperties( (passengerCount > $pasCnt1) || (passengerCount == $pasCnt1 && numberOfBoxes > $boxCnt1) ) then System.out.println("Train " + $train2.getTrainID() + " is more important"); end
方案2:单独以货箱数为判断条件(独立场景)
如果有些业务场景下需要优先考虑货运能力,单独判断货箱数更多的火车,可以直接新增一条独立规则:
rule "Select Train by Box Count Alone" when $train1 : TrainProperties($boxCnt : numberOfBoxes) $train2 : TrainProperties(numberOfBoxes > $boxCnt) then System.out.println("Train " + $train2.getTrainID() + " is more important (higher box count)"); end
方案3:自定义权重组合判断
如果需要同时结合乘客数和货箱数的权重(比如给乘客数和货箱数分别赋值权重,计算综合得分来判断),可以这样写规则:
rule "Select Train by Combined Score" when $train1 : TrainProperties($pasCnt1 : passengerCount, $boxCnt1 : numberOfBoxes) $train2 : TrainProperties( // 假设乘客数权重0.6,货箱数权重0.4,计算综合得分 (passengerCount * 0.6 + numberOfBoxes * 0.4) > ($pasCnt1 * 0.6 + $boxCnt1 * 0.4) ) then System.out.println("Train " + $train2.getTrainID() + " is more important (higher combined score)"); end
最后提醒一下:如果多条规则存在执行顺序冲突,记得用salience属性设置优先级,数值越高的规则会被先执行哦~
内容的提问来源于stack exchange,提问作者Azar G
相关产品推荐
相关产品推荐

