[rules-users] Multiplying the count of each score rule [planner]
Geoffrey De Smet
ge0ffrey.spam at gmail.com
Mon Dec 19 09:25:27 EST 2011
Op 19-12-11 15:22, Geoffrey De Smet schreef:
>
>
> 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
Sorry, on https://github.com/droolsjbpm/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
>
>
> _______________________________________________
> 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/4d429542/attachment.html
More information about the rules-users
mailing list