Re: [rules-users] Hard constraints to enforce employee seniority

2011-12-08 Thread Geoffrey De Smet



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

2011-12-08 Thread Patrik Dufresne
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

2011-12-08 Thread Geoffrey De Smet



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

2011-12-07 Thread Patrik Dufresne
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