In the nqueensScoreRules.drl examples there's an implementation commented out which tried something like that, it didn't work out well. Nevertheless I wouldn't be surprised that there's a way to do it right and get beat the IntConstraintOccurrence pattern :)


// Don't do this. It breaks performance and scalability!
//rule "hardConstraintsBroken"
//    when
//        $multipleQueensHorizontal : Number()
//        from accumulate(
//            $q1 : Queen($id : id, $y : y)
//            and Queen(id > $id, y == $y),
//            count($q1)
//        );
//        $multipleQueensAscendingDiagonal : Number()
//        from accumulate(
//            $q1 : Queen($id : id, $ascendingD : ascendingD)
//            and Queen(id > $id, ascendingD == $ascendingD),
//            count($q1)
//        );
//        $multipleQueensDescendingDiagonal : Number()
//        from accumulate(
//            $q1 : Queen($id : id, $descendingD : descendingD)
//            and Queen(id > $id, descendingD == $descendingD),
//            count($q1)
//        );
//    then
//        scoreCalculator.setScore(- $multipleQueensHorizontal.intValue()
// - $multipleQueensAscendingDiagonal.intValue() - $multipleQueensDescendingDiagonal.intValue());
//end

With kind regards,
Geoffrey De Smet


Wim Vancroonenburg schreef:
To be honest, I do not know if I have to insert a new IntConstraintOccurrence. I'm kind of following the Drools Solver examples and docs here. Also I have to conform to a certain objective function (that was defined in literature), and I know that, at the moment, my rules calculate the same value for the objective function for several given solutions. So if I were to change my rules, they would have to generate the same result. And I do not really know how I would have to change them exactly using your approach.

Do you have any tips for that? Perhaps a small example or so?

Sincerely

Wim Vancroonenburg

----- Original Message ----- From: "Greg Barton" <[email protected]>
Newsgroups: gmane.comp.java.drools.user
To: "Rules Users List" <[email protected]>
Sent: Thursday, February 12, 2009 4:31 PM
Subject: Re: Drools-solver performance optimizations?


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 <[email protected]> wrote:

From: Wim Vancroonenburg <[email protected]>
Subject: [rules-users] Drools-solver performance optimizations?
To: [email protected]
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
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users



_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users


_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users


_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to