[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