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.spam(a)gmail.com
<mailto:ge0ffrey.spam@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(a)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(a)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(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
--
With kind regards,
Geoffrey De Smet