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