<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Hello, </span><div><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Here is a copy of a question I just sent on Stackoverflow : </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<a href="http://stackoverflow.com/questions/13753983/is-drools-suitable-for-preprocessing-a-resource-allocation-problem" target="_top" rel="nofollow" link="external" style="font-size:13px;color:rgb(85,26,139);font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;background-color:rgb(255,255,255)">http://stackoverflow.com/questions/13753983/is-drools-suitable-for-preprocessing-a-resource-allocation-problem</a><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">I have a quite big resource allocation problem to compute. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">I have just discovered Drools and I would like to know if it is a good candidate to work as a preprocessor and generate a list of forbidden allocations, based on some user rules. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><h2 style="font-family:GillSans,Trebuchet,Calibri,Arial,sans-serif;font-size:1.3em;padding:0.6em 0px 0.4em;margin:0px;background-color:rgb(255,255,255)">

The Problem</h2><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">I have an optimisation engine that can allocate some activities to some resources, while optimizing some KPIs (Key Performance Indicator). </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">The optimizer takes as input (among others) a list of forbiden allocations that should be generated based on some user-provided rules. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Each forbid rule is an &quot;AND&quot; composition of two rules: </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">One for the activity </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">One for the resource </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Each sub rule is itself a list of &quot;AND&quot; tests on some attributes. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Here is the structure of one rule, in Pseudo-Code </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><pre style="background-color:rgb(255,255,255)">Rule1:
    * ActivityRule
      * activity.prop1 == &quot;foo&quot; AND
      * activity.prop2 == &quot;bar&quot; AND
      * ... 
    * ResourceRule
      * resource.prop3 == &quot;foobar&quot; AND
      * resource.prop4 == &quot;NULL&quot; AND
      * ...

Rule2:
   ...
</pre><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">As soon as a pair of [Activity,Resource] matches one rule, it should be sent as output, and not tested again against other rules. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Also, this is important to note that some rules will match very often, while overs will match very rarely (very specific cases). </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Performance constraints </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Here are some rough hints about the volumetry of the problem : </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">* 1000 activities </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">* 200 resources </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">* 50 rules </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">I need the forbidden allocations to be generated in under a minute. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><h2 style="font-family:GillSans,Trebuchet,Calibri,Arial,sans-serif;font-size:1.3em;padding:0.6em 0px 0.4em;margin:0px;background-color:rgb(255,255,255)">

The challenge</h2><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">As far, as I understand, Drools can surely generate those forbidden allocations. the question is : &quot;How smart is he&quot; ? </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">If I had to write an engine myself for this particular problem, I would make some improvements : </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">For example, I would not generate all possible allocations (200.000) and then try to apply each rule on it (50 rules x 200.000). </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Instead, I would try to match the resources and the activities separately on each rule (each side of the rule), and then assemble the couples that match at least one common rule. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Also, I would add some counter on each rule that would auto increment upon each match, in order to apply first the rules that match often. </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><h2 style="font-family:GillSans,Trebuchet,Calibri,Arial,sans-serif;font-size:1.3em;padding:0.6em 0px 0.4em;margin:0px;background-color:rgb(255,255,255)">

Questions</h2><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Is the engine of Drools smart enought for that ? Or is he even smarter ? </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Do you have an example of Drools being used in a similar problem with success ? </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Do you have some hints on how to modelise this problem in Drools ? </span><br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Thanks in advance for your advice.</span><div name="sig_7d53cbd3f0" style="margin:0pt">

</div></div>