The problem of using Math formulas in the LHS of a rule is that the expression can not be indexed by the engine and so it is much heavier to execute. So, yes, if your rules LHS can work only on previously calculated values, performance will increase.
One thing you may try is instead of logically asserting a new fact with the distance, you may set an attribute in the Tile or the Agent facts themselves.
[]s
Edson
2007/12/8, velven <velven83@hotmail.com>:
Hi, thanks for replying.
your 2.b. is what I have done currently, but theres a problem as I have
thousands of Agents and Tiles. and my range can go up to quite high, so i
suspect that there are too much assertions of the "TileInRange" for each
and every tick on the simulation and eventually compromising performace
again (it almost hangs in one of my my test case)
I have thought of 2.a. too but the performance is poor as you mentioned.
BTW, Can I gather that I shouldn't include any calculations in my LHS rule
else the performace of the engine will deteriorate greatly with more
calculations and perhaps not utilising rete?
If this is true, then perhaps I can convince my Boss to do this part of the
problem in Java, which is faster actually.
Thanks
Edson Tirelli-3 wrote:
>
> Your reasoning on how to solve the problem is correct. I don't know
> about your implementation, but my suggestion is:
>
> 1. Create a function to calculate the distance between 2 points. I would
> prefer to create it as a static method in a helper class, but you can
> define
> it in the DRL if you prefer:
>
> function double distance( long originX, long originY, long actualX, long
> actualY ) {
> // return the calculated distance
> }
>
> 2.a. If you want to do it in a single rule, write something like this:
>
> when
> $a: Agent( $x1:x, $y1:y, $r:range)
> $t1: Tile( $x2: x, $y2 : y, eval( distance( $x1, $y1, $x2, $y2 ) <= $r
> )
> )
> not Tile( eval( distance( $x1, $y1, x, y ) < distance( $x1, $y1, $x2,
> $y2 ) ) )
> then
> end
>
> The downside of such approach is that it recalculates the distance many
> times and the performance would be poor.
>
> 2.b. If you want best performance, try a more relational approach with 2
> rules:
>
> rule "calculate distance"
> when
> $a: Agent( $x1 : x, $y1 : y, $r : range )
> $t: Tile( eval( distance( $x1, $y1, x, y ) < $r ) )
> then
> assertLogical( new TileInRange( $a, $t, distance( $x1, $y1, x, y ) )
> );
> end
>
> rule "find the closest"
> when
> $a: Agent()
> $tr TileInRange( agent == $a, $tile : tile, $dist : distance )
> not TileInRange( agent == $a, distance < $dist )
> $t : Tile( this == $tile ) // this last pattern may be removed if you
> don't need to constrain any other attribute
> then
> // do something
> end
>
> Hope it helps
>
> Edson
>
> 2007/12/6, velven <velven83@hotmail.com>:
>>
>>
>> HI, i have a problem
>> using tileworld model, i'm supposed to write a rule which will cause the
>> agents to choose the tile in the agent's range which is closest to the
>> agent.
>>
>> so a rough idea is
>>
>> when
>>
>> agent: Agent(x1:x, y1:y, r:range)
>>
>> tile1: Tile(<tile's x to be between (x1+r) and (x1-r)> && <tile's y to be
>> between (y1+r and y1-r)>)
>>
>> tile2: not Tile( < which is closer than the tile1 to agent> )
>>
>> desperately need help,
>> alternatives tried::
>> i tried to use a query to return a list of tiles which is within the
>> agent's
>> range then compared which one is closer and other similar implementation,
>> but this too slow for my simulation...
>>
>> I need one single good rule or efficient way of implementing the above
>> rule
>>
>>
>> then i tried to do multiple constraints too, say x (> 30 && < 40) is
>> ok
>> but
>> x (>
>> ($x-$r) && < ($x+$r)) gives errors ,due to extra parenthesis? i dunno..
>> any
>> workarounds?
>>
>> Thanks!
>>
>>
>> --
>> View this message in context:
>>
http://www.nabble.com/How-to-write-a-rule-which-only-fires-for-a-closest-value--tf4947931.html#a14166650
>> Sent from the drools - user mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users@lists.jboss.org
>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>
>
>
>
> --
> Edson Tirelli
> JBoss Drools Core Development
> Office: +55 11 3529-6000
> Mobile: +55 11 9287-5646
> JBoss, a division of Red Hat @ www.jboss.com
>
> _______________________________________________
> rules-users mailing list
>
rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
--
View this message in context:
http://www.nabble.com/How-to-write-a-rule-which-only-fires-for-a-closest-value--tf4947931.html#a14227138
Sent from the drools - user mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
--
Edson Tirelli
JBoss Drools Core Development
Office: +55 11 3529-6000
Mobile: +55 11 9287-5646
JBoss, a division of Red Hat @
www.jboss.com