[rules-users] SimpleScoreCalculator

André Fróes arfmoraes at gmail.com
Thu Feb 21 13:32:32 EST 2013


Wrong result, i didn't enable the skill hard constraint there, this is the
result, its the opposite of that, everything is feasible:

ID: 104[Skills: ABC 2,] -- Priority: P3   -   Andre(8)[Skills: ABC 1,ABC
2,] ------ Feasible(0)
ID: 103[Skills: ABC 1,ABC 2,ABC 3,ABC 4,] -- Priority: P1   -
Denny(8)[Skills: ABC 2,ABC 1,ABC 3,ABC 4,] ------ Feasible(0)
ID: 105[Skills: ABC 2,] -- Priority: P3   -   Andre(8)[Skills: ABC 1,ABC
2,] ------ Feasible(0)
ID: 102[Skills: ABC 2,] -- Priority: P4   -   Andre(8)[Skills: ABC 1,ABC
2,] ------ Feasible(0)
ID: 101[Skills: ABC 1,ABC 2,ABC 4,] -- Priority: P1   -
Richard(8)[Skills: ABC 1,ABC 2,ABC 4,] ------ Feasible(0)
ID: 107[Skills: ABC 1,ABC 3,] -- Priority: P4   -   Fabio(8)[Skills: ABC
3,ABC 1,] ------ Feasible(0)
ID: 106[Skills: ABC 1,] -- Priority: P6   -   Andre(8)[Skills: ABC 1,ABC
2,] ------ Feasible(0)
ID: 108[Skills: ABC 1,ABC 4,] -- Priority: P5   -   Richard(8)[Skills: ABC
1,ABC 2,ABC 4,] ------ Feasible(0)
ID: 109[Skills: ABC 3,] -- Priority: P5   -   Fabio(8)[Skills: ABC 3,ABC
1,] ------ Feasible(0)
ID: 110[Skills: ABC 1,] -- Priority: P6   -   Fabio(8)[Skills: ABC 3,ABC
1,] ------ Feasible(0)
ID: 11011[Skills: ABC 1,ABC 2,ABC 3,ABC 4,] -- Priority: P6   -
Denny(8)[Skills: ABC 2,ABC 1,ABC 3,ABC 4,] ------ Feasible(0)


2013/2/21 André Fróes <arfmoraes at gmail.com>

> I forgot to mention that, if the hard constraint is broken, it breaks all
> the planning to.
>
> ID: 104[Skills: ABC 2,] -- Priority: P3   -   Fabio(8)[Skills: ABC 3,ABC
> 1,] ------ Broken(1)
> ID: 103[Skills: ABC 1,ABC 2,ABC 3,ABC 4,] -- Priority: P1   -
> Andre(8)[Skills: ABC 1,ABC 2,] ------ Broken(2)
> ID: 105[Skills: ABC 2,] -- Priority: P3   -   Richard(8)[Skills: ABC 1,ABC
> 2,ABC 4,] ------ Feasible(0)
> ID: 102[Skills: ABC 2,] -- Priority: P4   -   Fabio(8)[Skills: ABC 3,ABC
> 1,] ------ Broken(1)
> ID: 101[Skills: ABC 1,ABC 2,ABC 4,] -- Priority: P1   -   Denny(8)[Skills:
> ABC 2,ABC 1,ABC 3,ABC 4,] ------ Feasible(0)
> ID: 107[Skills: ABC 1,ABC 3,] -- Priority: P4   -   Richard(8)[Skills: ABC
> 1,ABC 2,ABC 4,] ------ Broken(1)
> ID: 106[Skills: ABC 1,] -- Priority: P6   -   Andre(8)[Skills: ABC 1,ABC
> 2,] ------ Feasible(0)
> ID: 108[Skills: ABC 1,ABC 4,] -- Priority: P5   -   Fabio(8)[Skills: ABC
> 3,ABC 1,] ------ Broken(1)
> ID: 109[Skills: ABC 3,] -- Priority: P5   -   Denny(8)[Skills: ABC 2,ABC
> 1,ABC 3,ABC 4,] ------ Feasible(0)
> ID: 110[Skills: ABC 1,] -- Priority: P6   -   Fabio(8)[Skills: ABC 3,ABC
> 1,] ------ Feasible(0)
> ID: 11011[Skills: ABC 1,ABC 2,ABC 3,ABC 4,] -- Priority: P6   -
> Fabio(8)[Skills: ABC 3,ABC 1,] ------ Broken(2)
>
> every workorder fits if I remove ID 11011, and only 1 engineer can attend
> that workorder, that would be Denny that has every required skill, but if
> you notice here, you'll see that it breaks more than one assignment
>
>
> 2013/2/21 André Fróes <arfmoraes at gmail.com>
>
>> in that case, i just want to leave it unassigned or (and) add it to a
>> list of unassigned workorders, so I can get it and resort to another set of
>> engineers.
>>
>>
>>  2013/2/21 Geoffrey De Smet <ge0ffrey.spam at gmail.com>
>>
>>>
>>> Op 21-02-13 12:54, André Fróes schreef:
>>>
>>> Sure. My sorting by worktime and skills is partially working, if I do my
>>> planning with a certain number of engineers/workorders that fits in each
>>> other, it works perfectly, If i overcome that, it breaks the planning, it
>>> keeps showing the data that shouldn't be displayed and, in consequence,
>>> breaks the optimal solution.
>>>
>>>  Example:
>>> Engineer Andre, WT(8 hours), Skills ABC1, ABC2
>>>
>>>  Workorder 1, required WT(2), required Skills ABC2
>>> Workorder 2, required WT(3), required Skills ABC2
>>>  Workorder 3, required WT(1), required Skills ABC1
>>>
>>>  with these 3 WO it should work perfectly, results:
>>>  ID: 104[Skills: ABC 2,]   -   Andre(8)[Skills: ABC 1,ABC 2,] ------
>>> Feasible(0)
>>> ID: 105[Skills: ABC 2,]   -   Andre(8)[Skills: ABC 1,ABC 2,] ------
>>> Feasible(0)
>>> ID: 106[Skills: ABC 1,]   -   Andre(8)[Skills: ABC 1,ABC 2,] ------
>>> Feasible(0)
>>>
>>>  Adding this workorder that exceed in time and skill
>>>
>>>  Workorder 1, required WT(5), required Skills ABC2, ABC3
>>>
>>>  this is the outcome:
>>>
>>>  ID: 104[Skills: ABC 2,]   -   Andre(8)[Skills: ABC 1,ABC 2,] ------
>>> Feasible(0)
>>> ID: 105[Skills: ABC 2,]   -   Andre(8)[Skills: ABC 1,ABC 2,] ------
>>> Feasible(0)
>>> ID: 107[Skills: ABC 1,ABC 3,]   -   Andre(8)[Skills: ABC 1,ABC 2,]
>>> ------ Broken(1)
>>> ID: 106[Skills: ABC 1,]   -   Andre(8)[Skills: ABC 1,ABC 2,] ------
>>> Feasible(0)
>>>
>>> What do you want to happen with that extra workorder ID: 107[Skills: ABC
>>> 1,ABC 3,]?
>>> - Assign it to different engineer - because there's another engineer
>>> available which has time (or it doesn't matter that engineers are
>>> overloaded)
>>> - Leave it "unassigned" because you are doing "over-constrained
>>> planning." For 6.0, planner will support "nullable planner variables", but
>>> in 5.5, you need to emulate this behavior by creating special Engineer
>>> called Unassigned and adjusting your score constraints to not trigger when
>>> that UnassignedEngineer is involved. There's been some previous mails about
>>> this topic in this mail archive.
>>>
>>>
>>>  it shows all not excluding the workorder that is not to be assigned to
>>> engineer. I did it by simplescorecalculator:
>>>
>>>   public HardAndSoftScore calculateScore(Distributor distributor) {
>>>  int hardScore = 0;
>>>  int softScore = 0;
>>>
>>>  for (Engineer e : distributor.getEngineerList()) {
>>>  int requiredWorktime = 0;
>>>  List<Skill> requiredSkillList = new ArrayList<Skill>();
>>>
>>>  for (WorkOrder o : distributor.getWorkOrderList()) {
>>>  if (e.equals(o.getEngineer())) {
>>>  requiredWorktime += o.getRequiredWorktime();
>>>  for (SkillWorkOrder swo : o.getRequiredSkills()) {
>>>  requiredSkillList.add(swo.getSkill());
>>>  }
>>>  }
>>>  }
>>>
>>>  int engineerAvailableTime = e.getWorktime() - requiredWorktime;
>>>  if (engineerAvailableTime < 0) {
>>>  hardScore += engineerAvailableTime;
>>>  }
>>>
>>>  List<Skill> tempEngSkillList = new ArrayList<Skill>();
>>>  for (SkillEngineer se : e.getSkillEngineerList()){
>>>  tempEngSkillList.add(se.getSkill());
>>>  }
>>>   if (tempEngSkillList.containsAll(requiredSkillList)){
>>>  hardScore += 1;
>>>  }
>>>  }
>>>
>>>  return DefaultHardAndSoftScore.valueOf(hardScore, softScore);
>>>  }
>>>
>>>  that's the problem happening, after that i'll start working on
>>> priority by the tip you provided in the previous post, but i'll try by
>>> simplescorecalculator to, i'm not getting along (yet) with drools rules
>>> system (drl), it's a bit harder to use it with planner.
>>>
>>>  thanks for the help Geoffrey!
>>>
>>>
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20130221/25599662/attachment.html 


More information about the rules-users mailing list