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 <[email protected]> wrote:

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


      
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to