Re: [rules-users] Drools-solver performance optimizations?
Do you need to insert new IntConstraintOccurrence instances? If you had an accumulator object in working memory that you matched on in the rule conditions you could eliminate one object creation and one insert for each rule that matches a **Constraint object. That could free up lots of cpu and memory usage. The calcScore rule would simply match on the accumulator object. --- On Wed, 2/11/09, Wim Vancroonenburg wrote: > From: Wim Vancroonenburg > Subject: [rules-users] Drools-solver performance optimizations? > To: rules-users@lists.jboss.org > Date: Wednesday, February 11, 2009, 12:59 PM > 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 rul
Re: [rules-users] Drools-solver performance optimizations?
Hi Wim, I'm just starting to use the solver as well on a project. Have you ensured that the algorithm implemented by the other solver is the same as the local search your using for drools-solver? You may want to think about tuning that piece, by switching to Geoffrey's tabu implementation. I believe there are a few other examples in drools-solver-examples that show some different approaches to both using the MoveFactory (small-grained moves versus rough-grain moves) as well as with a StartingSolutionInitializer. Anyway, thought I'd pass on a few ideas from my limited experience with the project and interacting on the list. best, A - Andrew Waterman San Cristóbal de las Casas, Chiapas, Mexico +52 1 967 107 5902 +1 510 342 5693 On Feb 11, 2009, at 12:59 PM, Wim Vancroonenburg wrote: 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 Va
[rules-users] Drools-solver performance optimizations?
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