[rules-users] SimpleScoreCalculator

Geoffrey De Smet ge0ffrey.spam at gmail.com
Thu Feb 21 04:38:07 EST 2013


This thread is a bit long, could you summarize the open problems?

Op 20-02-13 19:22, André Fróes schreef:
> I added another variable to check if it would still show the broken 
> constraint and break the planner, and it still happens, I added this:
>
> WorkOrder wo33 = new WorkOrder(103l, 8, Priority.P1, Nature.CORRECTIVE);
> SkillWorkOrder swo333 = new SkillWorkOrder(20333l, wo33, ABC1);
> SkillWorkOrder swo3332 = new SkillWorkOrder(203332l, wo33, ABC2);
> SkillWorkOrder swo3333 = new SkillWorkOrder(203333l, wo33, ABC3);
> SkillWorkOrder swo3334 = new SkillWorkOrder(203334l, wo33, ABC4);
> List<SkillWorkOrder> lswo33 = new ArrayList<SkillWorkOrder>();
> lswo33.add(swo333);
> lswo33.add(swo3332);
> lswo33.add(swo3333);
> lswo33.add(swo3334);
> wo33.setRequiredSkills(lswo33);
>
> it breaks in worktime and required skill, and even so, it shows there 
> in the result breaking everything T.T
>
>
> 2013/2/20 André Fróes <arfmoraes at gmail.com <mailto:arfmoraes at gmail.com>>
>
>     Problem solved (still I think so):
>
>     It was simpler (if i'm right):
>     --------
>     List<Skill> tempEngSkillList = new ArrayList<Skill>();
>     for (SkillEngineer se : e.getSkillEngineerList()){
>     tempEngSkillList.add(se.getSkill());
>     }
>     if (tempEngSkillList.containsAll(requiredSkillList)){
>     hardScore += 1;
>     }
>     --------
>
>     the result:
>
>     Solved distribution with 10 work orders and 4 engineers:
>     ID: 104[Skills: ABC 2,]   -   Andre(8)[Skills: ABC 1,ABC 2,]
>     ------ Feasible(0)
>     ID: 103[Skills: ABC 1,ABC 2,ABC 3,ABC 4,]   - Denny(8)[Skills: ABC
>     2,ABC 1,ABC 3,ABC 4,] ------ Feasible(0)
>     ID: 105[Skills: ABC 2,]   -   Andre(8)[Skills: ABC 1,ABC 2,]
>     ------ Feasible(0)
>     ID: 102[Skills: ABC 2,]   -   Andre(8)[Skills: ABC 1,ABC 2,]
>     ------ Feasible(0)
>     ID: 101[Skills: ABC 1,ABC 2,ABC 4,]   - Richard(8)[Skills: ABC
>     1,ABC 2,ABC 4,] ------ Feasible(0)
>     ID: 107[Skills: ABC 1,ABC 3,]   - Fabio(8)[Skills: ABC 3,ABC 1,]
>     ------ Feasible(0)
>     ID: 106[Skills: ABC 1,]   -   Fabio(8)[Skills: ABC 3,ABC 1,]
>     ------ Feasible(0)
>     ID: 108[Skills: ABC 1,ABC 4,]   - Richard(8)[Skills: ABC 1,ABC
>     2,ABC 4,] ------ Feasible(0)
>     ID: 109[Skills: ABC 3,]   -   Fabio(8)[Skills: ABC 3,ABC 1,]
>     ------ Feasible(0)
>     ID: 110[Skills: ABC 1,]   -   Andre(8)[Skills: ABC 1,ABC 2,]
>     ------ Feasible(0)
>
>
>     2013/2/20 André Fróes <arfmoraes at gmail.com
>     <mailto:arfmoraes at gmail.com>>
>
>         Not fixed, i threw it on excel and make a comparison with
>         expected results and there are 2 broken there. This is how it
>         would be (feasible solution):
>
>         ID 101 - Engineer Richard
>         ID 102 - Engineer Andre
>         ID 103 - Engineer Denny
>         ID 104 - Engineer Andre
>         ID 105 - Engineer Andre
>         ID 106 - Engineer Andre
>         ID 107 - Engineer Fabio
>         ID 108 - Engineer Richard
>         ID 109 - Engineer Fabio
>         ID 110 - Engineer Fabio
>
>         this was the result:
>
>         Solved distribution with 10 work orders and 4 engineers:
>         ID: 104[Skills: ABC 2,]   - Richard(8)[Skills: ABC 1,ABC 2,ABC
>         4,] ------ Feasible(0)
>         ID: 103[Skills: ABC 1,ABC 2,ABC 3,ABC 4,]   -  
>         Denny(8)[Skills: ABC 2,ABC 1,ABC 3,ABC 4,] ------ Feasible(0)
>         ID: 105[Skills: ABC 2,]   - Fabio(8)[Skills: ABC 3,ABC 1,]
>         ------ Broken(1)
>         ID: 102[Skills: ABC 2,]   - Andre(8)[Skills: ABC 1,ABC 2,]
>         ------ Feasible(0)
>         ID: 101[Skills: ABC 1,ABC 2,ABC 4,]   -   Richard(8)[Skills:
>         ABC 1,ABC 2,ABC 4,] ------ Feasible(0)
>         ID: 107[Skills: ABC 1,ABC 3,]   - Fabio(8)[Skills: ABC 3,ABC
>         1,] ------ Feasible(0)
>         ID: 106[Skills: ABC 1,]   - Andre(8)[Skills: ABC 1,ABC 2,]
>         ------ Feasible(0)
>         ID: 108[Skills: ABC 1,ABC 4,]   - Andre(8)[Skills: ABC 1,ABC
>         2,] ------ Broken(1)
>         ID: 109[Skills: ABC 3,]   - Andre(8)[Skills: ABC 1,ABC 2,]
>         ------ Broken(1)
>         ID: 110[Skills: ABC 1,]   - Andre(8)[Skills: ABC 1,ABC 2,]
>         ------ Feasible(0)
>
>         Still working on it, I accept any tips :D
>
>
>         2013/2/20 André Fróes <arfmoraes at gmail.com
>         <mailto:arfmoraes at gmail.com>>
>
>             I think I fixed it, but the broken constraint is still
>             showing, i don't know how to remove it. I did this:
>
>             verified if the engineer skill list had the same size or
>             bigger than the requiredSkillList, iterate to check skills
>             between both counting the matches and then, if the match
>             was 100% to other, give the workorder
>
>             if (e.getSkillEngineerList().size() >=
>             requiredSkillList.size()) {
>             int temp = 0;
>             for (SkillEngineer se : e.getSkillEngineerList()) {
>             for (Skill s : requiredSkillList) {
>             if (se.getSkill().getId() == s.getId()) {
>             temp++;
>             }
>             }
>             }
>             if (temp == requiredSkillList.size()) {
>             hardScore += 1;
>             }
>             }
>
>
>             2013/2/20 André Fróes <arfmoraes at gmail.com
>             <mailto:arfmoraes at gmail.com>>
>
>                 After some workaround I noticed that the workorders
>                 are not being 100% corretly distributed to, i've
>                 changed the scorecalculator to this:
>
>                 int commonSkillCount = 0;
>                 for (Skill s : requiredSkillList){
>                 for (SkillEngineer se : e.getSkillEngineerList()){
>                 if (se.getSkill().getId() == s.getId()){
>                 commonSkillCount++;
>                 }
>                 }
>                 }
>
>                 if ((commonSkillCount -
>                 e.getSkillEngineerList().size()) <= 0){
>                 hardScore += commonSkillCount;
>                 }
>
>                 and I got the result
>
>                 ID: 104[Skills: ABC 2,]   - Trewq(8)[Skills: ABC 3,ABC
>                 2,] ------ Feasible(0)
>                 ID: 103[Skills: ABC 3,]   - Trewq(8)[Skills: ABC 3,ABC
>                 2,] ------ Feasible(0)
>                 ID: 105[Skills: ABC 4,ABC 3,]   - Poiuy(8)[Skills: ABC
>                 1,ABC 2,ABC 3,ABC 4,] ------ Feasible(0)
>                 ID: 102[Skills: ABC 2,ABC 1,ABC 4,]   -
>                 Qwert(8)[Skills: ABC 2,ABC 4,] ------ Broken(1)
>                 ID: 101[Skills: ABC 1,]   - Lkjhg(8)[Skills: ABC 4,ABC
>                 1,] ------ Feasible(0)
>                 ID: 107[Skills: ABC 4,]   - Lkjhg(8)[Skills: ABC 4,ABC
>                 1,] ------ Feasible(0)
>                 ID: 106[Skills: ABC 1,]   - Qwert(8)[Skills: ABC 2,ABC
>                 4,] ------ Broken(1)
>                 ID: 108[Skills: ABC 3,ABC 2,]   - Poiuy(8)[Skills: ABC
>                 1,ABC 2,ABC 3,ABC 4,] ------ Feasible(0)
>
>                 there's a workorder that woud be disconsidered because
>                 no engineer have the required skill to complete it
>
>
>                 2013/2/19 André Fróes <arfmoraes at gmail.com
>                 <mailto:arfmoraes at gmail.com>>
>
>                     I forgot to post the code:
>
>                     public HardAndSoftScore calculateScore(Distributor
>                     distributor) {
>                     int hardScore = 0;
>                     int softScore = 0;
>                     for (Engineer e : distributor.getEngineerList()){
>                     long skill =
>                     e.getSkillEngineerList().get(0).getSkill().getId();
>                     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;
>                     }
>                     int commonSkillCount = 0;
>                     for (SkillEngineer se : e.getSkillEngineerList()){
>                     for (Skill s : requiredSkillList){
>                     if (se.getSkill().getId() == s.getId()){
>                     commonSkillCount++;
>                     }
>                     }
>                     }
>                     if (commonSkillCount != 0){
>                     hardScore += commonSkillCount;
>                     }
>                     }
>
>                     return DefaultHardAndSoftScore.valueOf(hardScore,
>                     softScore);
>                     }
>
>                     ( but i still want to try to create this in dsl
>                     rule after this work :D )
>
>
>                     2013/2/19 André Fróes <arfmoraes at gmail.com
>                     <mailto:arfmoraes at gmail.com>>
>
>                         I managed solving that problem even when
>                         there's more than one skill involved, but now
>                         my hard constraint of worktime breaks if I add
>                         more worktime than the sum of engineers worktime.
>
>                         (8) is the worktime, my workorders all have a
>                         worktime of 4 hours, so, I got 32 available
>                         hours and 32 hours of workorders to be
>                         assigned right? When I stick to this plan, it
>                         works:
>
>                         ----Compilation Result----
>                         Solved distribution with 8 work orders and 4
>                         engineers:
>                           ID: 104[Skills: (1002) ABC 2]  -
>                          Qwert(8)[Skills: (1002) ABC 2]
>                           ID: 103[Skills: (1003) ABC 3]  -
>                          Trewq(8)[Skills: (1003) ABC 3]
>                           ID: 105[Skills: (1004) ABC 4]  -
>                          Lkjhg(8)[Skills: (1004) ABC 4]
>                           ID: 102[Skills: (1002) ABC 2]  -
>                          Qwert(8)[Skills: (1002) ABC 2]
>                           ID: 101[Skills: (1001) ABC 1]  -
>                          Poiuy(8)[Skills: (1001) ABC 1]
>                           ID: 107[Skills: (1004) ABC 4]  -
>                          Lkjhg(8)[Skills: (1004) ABC 4]
>                           ID: 106[Skills: (1001) ABC 1]  -
>                          Poiuy(8)[Skills: (1001) ABC 1]
>                           ID: 108[Skills: (1003) ABC 3]  -
>                          Trewq(8)[Skills: (1003) ABC 3]
>                         ---------------
>
>                         So, if I add another worktime with 4 hours, it
>                         messes everything, this is the outcome:
>
>                         Solved distribution with 9 work orders and 4
>                         engineers:
>                           ID: 104[Skills: (1002) ABC 2]  -
>                          Qwert(8)[Skills: (1002) ABC 2]
>                           ID: 103[Skills: (1003) ABC 3]  -
>                          Trewq(8)[Skills: (1003) ABC 3]
>                           ID: 105[Skills: (1004) ABC 4]  -
>                          Lkjhg(8)[Skills: (1004) ABC 4]
>                           ID: 102[Skills: (1002) ABC 2]  -
>                          Qwert(8)[Skills: (1002) ABC 2]
>                           ID: 101[Skills: (1001) ABC 1]  -
>                          Poiuy(8)[Skills: (1001) ABC 1]
>                           ID: 107[Skills: (1004) ABC 4]  -
>                          Lkjhg(8)[Skills: (1004) ABC 4]
>                           ID: 106[Skills: (1001) ABC 1]  -
>                          Poiuy(8)[Skills: (1001) ABC 1]
>                           ID: 108[Skills: (1003) ABC 3]  -
>                          Trewq(8)[Skills: (1003) ABC 3]
>                           ID: 109[Skills: (1003) ABC 3]  -
>                          Trewq(8)[Skills: (1003) ABC 3]
>
>                         ------------
>
>                         to be precise, i don't know if it is because
>                         of worktime or skill
>
>
>                         2013/2/19 André Fróes <arfmoraes at gmail.com
>                         <mailto:arfmoraes at gmail.com>>
>
>                             Just one correction, it is sorting
>                             correctly when there's one workorder with
>                             a skill, if there's another workorder with
>                             same skill, it doesn't sort that workorder
>                             to that skill.
>
>                             This is what is happening:
>
>                             Workorder skill ABC1 ------------ Engineer
>                             skill ABC1
>                             Workorder skill ABC2 ------------ Engineer
>                             skill ABC2
>                             Workorder skill ABC1 ------------ Engineer
>                             skill ABC2
>
>                             but if there's only one workorder with one
>                             skill it works:
>
>                             Workorder skill ABC1 ------------ Engineer
>                             skill ABC1
>                             Workorder skill ABC2 ------------ Engineer
>                             skill ABC2
>                             Workorder skill ABC3 ------------ Engineer
>                             skill ABC3
>
>                             so, from the second workorder on, with a
>                             repeated required skill, it doesn't sort
>                             properly
>
>
>                             2013/2/19 André Fróes <arfmoraes at gmail.com
>                             <mailto:arfmoraes at gmail.com>>
>
>                                 Hello, since i'm not moving a step
>                                 from where I am at dsl rule, I'm
>                                 trying to do it with
>                                 SimpleScoreCalculator, but the same is
>                                 happening.
>
>                                 ------------
>                                 public HardAndSoftScore
>                                 calculateScore(Distributor distributor) {
>                                 int hardScore = 0;
>                                 int softScore = 0;
>                                 for (Engineer e :
>                                 distributor.getEngineerList()){
>                                 long skill =
>                                 e.getSkillEngineerList().get(0).getSkill().getId();
>                                 int requiredWorktime = 0;
>                                 long requiredSkill = 0l;
>                                 for (WorkOrder o :
>                                 distributor.getWorkOrderList()){
>                                 if (e.equals(o.getEngineer())){
>                                 requiredWorktime +=
>                                 o.getRequiredWorktime();
>                                 requiredSkill =
>                                 o.getRequiredSkills().get(0).getSkill().getId();
>                                 }
>                                 }
>                                 int engineerAvailableTime =
>                                 e.getWorktime() - requiredWorktime;
>                                 if (engineerAvailableTime < 0 ){
>                                 hardScore += engineerAvailableTime;
>                                 }
>                                 if (requiredSkill == skill){
>                                 softScore += requiredSkill;
>                                 }
>                                 }
>                                 return
>                                 DefaultHardAndSoftScore.valueOf(hardScore,
>                                 softScore);
>                                 }
>                                 ------------
>
>                                 wouldn't that have to fit since i'm
>                                 comparing the 1st attribute of each
>                                 skill list from engineers and
>                                 workorders? And how can I weight which
>                                 engineer would be better to a
>                                 determined workorder if the workorder
>                                 have more skills and so does the engineer?
>
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> 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/1e62d416/attachment-0001.html 


More information about the rules-users mailing list