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