[rules-users] Multiplying the count of each score rule [planner]

Geoffrey De Smet ge0ffrey.spam at gmail.com
Mon Dec 19 09:22:26 EST 2011



Op 19-12-11 15:04, Patrik Dufresne schreef:
> Hi Geoffrey,
>
> Thanks for your opinion. I will try to implement what I call a 
> HardAndSoftPriorityScoreDefinition and give it back to the community. 
> Where is the best place to post a 'patch' ?
Create a pull request :) on http://github.com/drools-planner
   
https://github.com/droolsjbpm/droolsjbpm-build-bootstrap/blob/master/README.md

Design wise, I recommend:
It's basically about allowing a dynamic number of levels, instead of 
just 2 (hard and soft).
it should not extend AbstractHardAndSoftScore, just extend AbstractScore
Because it cannot correctly implement HardAndSoftScore.getSoftScore();
I should just have a Map<Integer, Integer> levelToScoreMap; (no int 
hardScore or int softScore)
hardScore is like level 0.
softScore is like level -1.
This allows for:
softerScore at level -2
harderScore at level 1
Higher level is more important then lower level.
The class name should probably contain the word "Level".
>
> 2011/12/19 Geoffrey De Smet <ge0ffrey.spam at gmail.com 
> <mailto:ge0ffrey.spam at gmail.com>>
>
>
>
>     Op 14-12-11 18:40, Patrik Dufresne schreef:
>>     Hi,
>>
>>     I'm still in process to model my planning problem and I have some
>>     difficulties in defining the correct weight of soft constraints.
>>     I have soft constraints with different priorities : C1, C2, C3,
>>     ..., Cn where C1 are higher then C2. Currently, I've tried to set
>>     different weight for each of them : C1 get higher weight. But
>>     it's not sufficient since multiple C2 may balance one C1. What I
>>     really need is to set the priority to every soft constraints.
>>
>>     Solution #1 :
>>     My first thought it to implement a new score definition
>>     (HardAndSoftPriorityScoreDefinition) having separate soft score
>>     for each priority. The rule may insert ConstraintOccurence by
>>     defining the weight and the priority. This solution seems elegant
>>     but require effort to implement the score definition, the score
>>     calculation, and other things I don't even know about.
>     That is the perfect solution to your problem. Start by copy
>     pasting DefaultHardAndSoftScoreDefinition and work your way from
>     there.
>     You'll need to create at least a ScoreDefinition, ScoreCalculator
>     and Score.
>
>     I've been thinking about adding such a "dynamic" score definition
>     to planner's build-in scores,
>     but so far every use case where the developers said they needed
>     this, it turned out end-users meant it differently:
>     when you break a 100 C2's, then it's better to break 1 C1 instead...
>>
>>     Solution #2 :
>>     The other solution is stated in the Drools Planner User Guide :
>>
>>         "Most use cases will also weigh their constraints
>>         differently, by multiplying the count of each score rule with
>>         its weight. For example in freight routing, you can make 5
>>         broken "avoid crossroads" soft constraints count as much as 1
>>         broken "avoid highways at rush hour" soft constraint. This
>>         allows your business analysts to easily tweak the score
>>         function as they see fit."
>>
>>     Even tough I don't know how to implement this, it's seems much
>>     easier to achieve since it's only a rule. Compare to solution #1,
>>     it's lack the support of soft constraints with same priority but
>>     different weights.
>     That text describes plain-old weighting. Say C1 weights 100 and C2
>     weights 2, then you can break 50 C2's for every 1 broken C1.
>
>     This is far easier and most of the time end-users actually mean this.
>     Make exaggerated examples (1000 C2's broken vs 1 C1 broken) and
>     make your end-users decide what they prefer. If they still prefer
>     1000 C2's broken, then you need #1.
>
>     Tip: Sometimes, taking the square of a weight is a neat trick.
>     In bin packing, say you got
>     Solution A with 3 CPU and 3 CPU too little = 3² + 3² = 18
>     and Solution B with 4 CPU and 2 CPU too little = 4² + 2² = 20
>     So the second is worse even though they both miss 6 CPU.
>
>>
>>     What is your opinion about both solution.
>>
>>     Is one faster then the other ?
>>
>>     Is it hard to create a new score definition ?
>>
>>     Did anyone ever did this ?
>>
>>     -- 
>>     Patrik Dufresne
>>
>>
>>     _______________________________________________
>>     rules-users mailing list
>>     rules-users at lists.jboss.org  <mailto:rules-users at lists.jboss.org>
>>     https://lists.jboss.org/mailman/listinfo/rules-users
>
>     -- 
>     With kind regards,
>     Geoffrey De Smet
>
>
>     _______________________________________________
>     rules-users mailing list
>     rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>     https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
> -- 
> Patrik Dufresne
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

-- 
With kind regards,
Geoffrey De Smet

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20111219/3f002123/attachment.html 


More information about the rules-users mailing list