Thanks Geoffrey, I really like you're suggestion to use intermediate facts to keep the employee's seniority. After this email, I will try to implement it, but I do have a question about your way to implement it. Since my goal is to make senior employee ($higherRankedEmployee) work before a less senior employee ($lowerRankedEmployee), I think the rule should contain a 'not' or a 'not exists' expression. It may be stated as follow :
rule "hard-Seniority" when EmployeeRanking($higherRankedEmployee, $lowerRankedEmployee, $numberOfEmployeesInRankBetweenThem) PlanifEventAssignment(employee == $lowerRankedEmployee) not PlanifEventAssignment(employee == $higherRankedEmployee) then insertLogical(new IntConstraintOccurrence("hard-Seniority", ConstraintType.NEGATIVE_HARD, $numberOfEmployeesInRankBetweenThem, $employee, $assignment)); end Thanks 2011/12/8 Geoffrey De Smet <ge0ffrey.s...@gmail.com> > ** > > > Op 07-12-11 21:41, Patrik Dufresne schreef: > > Hi all, > > I'm trying to create rules to model my problem. So far, I didn't manage > to create rules to make Drools converge to a solution because of score > traps. I don't see any way to avoid it (as I'm not an expert with Drools). > I can express the rule as follow : a senior employee should work before a > less senior employee. > > I've implement it as a hard constraint : > rule "hard-Seniority" > when > $employee : Employee() > $assignment : PlanifEventAssignment( $planifEmployee : employee ) > > What's does this $planifEmployee do? > > not PlanifEventAssignment( employee == $employee ) > eval(Helper.compareEmployee($employee, $planifEmployee) < 0) > then > insertLogical(new IntConstraintOccurrence("hard-Seniority", > ConstraintType.NEGATIVE_HARD, > 1, > $employee, $assignment)); > end > > The function Helper.compareEmployee(e1, e2) return -1 if e1 is more > senior then e2 (mostly based on hire date and other boolean fields). > > On first sight, in Solution.getProblemFact() I would add these cached > problem facts, for any 2 employees (but just once per combination): > new EmployeeRanking(higherRankedEmployee, lowerRankedEmployee, > numberOfEmployeesInRankBetweenThem) > > then you can do > > rule "hard-Seniority" > when > EmployeeRanking($higherRankedEmployee, $lowerRankedEmployee, > $numberOfEmployeesInRankBetweenThem) > PlanifEventAssignment(employee == $lowerRankedEmployee) > PlanifEventAssignment(employee == $higherRankedEmployee) > > then > insertLogical(new IntConstraintOccurrence("hard-Seniority", > ConstraintType.NEGATIVE_HARD, > $numberOfEmployeesInRankBetweenThem, > $employee, $assignment)); > > > > This way, the rule make sure a senior employee is working. But it's a > score trap since, many moves are required to resolve the constraint. e.g: > > PlanifEventAssignment1 = e2 > PlanifEventAssignment2 = e3 > PlanifEventAssignment3 = e4 > PlanifEventAssignment4 = e5 > > e1 is not working. Multiple move are require to reach the best solution > : > PlanifEventAssignment1 = e1 > PlanifEventAssignment2 = e2 > PlanifEventAssignment3 = e3 > PlanifEventAssignment4 = e4 > > So I'm asking you. What is the best way to make Drools converge ? Do I > need to change my rule, or should I create a BigMove ? > > course grained moves will work mostly, but solving the score trap itself > is a far better long-term solution (and it still allows you to add course > grained moves later). > > > -- > Patrik Dufresne > > > _______________________________________________ > rules-users mailing > listrules-users@lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users > > > -- > With kind regards, > Geoffrey De Smet > > > _______________________________________________ > rules-users mailing list > rules-users@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/rules-users > > -- Patrik Dufresne
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users