Re: [rules-users] Drools-solver performance optimizations?

2009-02-12 Thread Greg Barton
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  wrote:

> From: Wim Vancroonenburg 
> Subject: [rules-users] Drools-solver performance optimizations?
> To: rules-users@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 rul

Re: [rules-users] Drools-solver performance optimizations?

2009-02-11 Thread Andrew Waterman

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 Va

[rules-users] Drools-solver performance optimizations?

2009-02-11 Thread Wim Vancroonenburg
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@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users