Re: [rules-users] Hard constraints to enforce employee seniority
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 list rules-users@lists.jboss.org https://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
Re: [rules-users] Hard constraints to enforce employee seniority
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
Re: [rules-users] Hard constraints to enforce employee seniority
Op 08-12-11 23:35, Patrik Dufresne schreef: 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 : Yep a not is missing, apparently my hands didn't type what my brains were thinking :) not exists is not possible (or doesn't make sense), because it's the same as just not afaik. 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 mailto: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 list rules-users@lists.jboss.org mailto:rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users -- With kind regards, Geoffrey De Smet ___ rules-users mailing list rules-users@lists.jboss.org mailto: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 -- With kind regards, Geoffrey De Smet ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
[rules-users] Hard constraints to enforce employee seniority
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 ) 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). 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 ? -- Patrik Dufresne ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users