[rules-users] Drools-solver performance optimizations?

Andrew Waterman andrew.waterman at gmail.com
Wed Feb 11 14:38:59 EST 2009


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 Vancroonenburg
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090211/ed843158/attachment.html 


More information about the rules-users mailing list