Thanks Geoffrey,
Op 07-12-11 21:41, Patrik Dufresne schreef:What's does this $planifEmployee do?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 )On first sight, in Solution.getProblemFact() I would add these cached problem facts, for any 2 employees (but just once per combination):
not PlanifEventAssignment( employee == $employee )eval(Helper.compareEmployee($employee, $planifEmployee) < 0)theninsertLogical(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).
new EmployeeRanking(higherRankedEmployee, lowerRankedEmployee, numberOfEmployeesInRankBetweenThem)
then you can do
rule "hard-Seniority"when
EmployeeRanking($higherRankedEmployee, $lowerRankedEmployee, $numberOfEmployeesInRankBetweenThem)
PlanifEventAssignment(employee == $lowerRankedEmployee)
PlanifEventAssignment(employee == $higherRankedEmployee)
theninsertLogical(new IntConstraintOccurrence("hard-Seniority",ConstraintType.NEGATIVE_HARD,$numberOfEmployeesInRankBetweenThem,$employee, $assignment));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).
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 = e2PlanifEventAssignment2 = e3PlanifEventAssignment3 = e4PlanifEventAssignment4 = e5
e1 is not working. Multiple move are require to reach the best solution :PlanifEventAssignment1 = e1PlanifEventAssignment2 = e2PlanifEventAssignment3 = e3PlanifEventAssignment4 = 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 ?
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
--
Patrik Dufresne
-- With kind regards, Geoffrey De Smet
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users