Hi, I'm a student currently evaluating Drools Solver for my dissertation. I am currently trying to solve an optimization problem with two different solvers (one of which is Drools Solver) and I am comparing the results with earlier obtained results from literature. However I am having some troubles with the performance of Drools Solver, and I was hoping if someone could look at my rules to see if they could be tuned:
rule "patientsToBeAssignedToRoomsOfAppropriateSex" when $n : Night(); $room : Room(sexRestriction == Sex.Dependent && capacity > 1); $genders : ArrayList(size>1) from collect( PatientStay(bed.room == $room, night == $n) ); exists PatientStay(bed.room == $room, night == $n, $a : admission, eval(((PatientStay)$genders.get(0)).getAdmission().getPatient().getSex() != $a.getPatient().getSex())); then insertLogical(new IntConstraintOccurrence("patientsToBeAssignedToRoomsOfAppropriateSex",ConstraintType.NEGATIVE_HARD,50,$room,$n)); end rule "hasRequiredRoomProperties" when $pr : RequiredRoomPropertiesConstraint($a : admission, $r : room, $w : weight ); $ps : PatientStay(admission == $a, bed.room == $r); then insertLogical(new IntConstraintOccurrence("hasPreferredRoomProperties",ConstraintType.NEGATIVE_SOFT,50*$w,$ps)); end rule "unplannedTransfers" when $ps : PatientStay($a : admission, $b : bed, $n : night); $ps2 : PatientStay(admission == $a, bed != $b, $n2 : night,eval($n.getIndex()+1 == $n2.getIndex())); then insertLogical(new IntConstraintOccurrence("unplannedTransfers",ConstraintType.NEGATIVE_SOFT,110,$ps,$ps2)); end rule "hasPreferredRoomProperties" when $pr : PreferredRoomPropertiesConstraint($a : admission, $r : room, $w : weight ); $ps : PatientStay(admission == $a, bed.room == $r); then insertLogical(new IntConstraintOccurrence("hasPreferredRoomProperties",ConstraintType.NEGATIVE_SOFT,20*$w,$ps)); end rule "meetsRoomPreference" when $mr : MeetsRoomPreferenceConstraint($a : admission, $r : room); $ps : PatientStay(admission == $a, bed.room == $r); then insertLogical(new IntConstraintOccurrence("meetsRoomPreference",ConstraintType.NEGATIVE_SOFT,8,$ps)); end rule "inGoodDepartment" when $gd : GoodDepartmentConstraint($a : admission, $d : department); $ps : PatientStay(admission == $a, $b : bed, eval($b.getRoom().getDepartment().equals($d))); then insertLogical(new IntConstraintOccurrence("inGoodDepartment",ConstraintType.NEGATIVE_SOFT,10,$ps)); end rule "inGoodRoom" when $gr : GoodRoomConstraint($a : admission, $r : room, $w : weight); $ps : PatientStay(admission == $a, bed.room == $r); then insertLogical(new IntConstraintOccurrence("inGoodRoom",ConstraintType.NEGATIVE_SOFT,10*$w,$ps)); end rule "calcScore" salience -10 when $count : Number() from accumulate( IntConstraintOccurrence($w : weight) , sum($w) ); then scoreCalculator.setScore(-$count.doubleValue()); end The classes with **Constraint in it are possible combinations that cause a constraint to be violated, and are calculated and inserted at initialization time (and are never changed). I know that the rule "patientsToBeAssignedToRoomsOfAppropriateSex" is fairly complex, but even when I remove it, the performance is not fantastic. Is there anything else I can do to get better performance? I'm already using JDK 1.6 and -server mode. Furthermore, all classes used here have their default equals and hashCode methods, so they don't have an impact on performance. Sincerely, Wim Vancroonenburg
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users