[rules-users] Drools-solver performance optimizations?

Greg Barton greg_barton at yahoo.com
Thu Feb 12 10:31:54 EST 2009


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 <ikbenvanmars at gmail.com> wrote:

> From: Wim Vancroonenburg <ikbenvanmars at gmail.com>
> Subject: [rules-users] Drools-solver performance optimizations?
> To: rules-users at 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 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 at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users


      



More information about the rules-users mailing list