[rules-users] [planner] Performance question

Geoffrey De Smet ge0ffrey.spam at gmail.com
Wed Oct 19 08:34:06 EDT 2011



Op 19-10-11 14:16, Guilherme Kunigami schreef:
> Consider I have a set of N activities with a given start and end times 
> and I want to assign them to a set of rooms.
>
> One of the main rules is to avoid two activities that have time 
> conflicts, to be assigned to the same room. I devised three modelling 
> options:
>
> [1] Do it entirely in Java code, checking whether there will be a 
> conflict before allowing an "Assignment move". This way, all solutions 
> that the algorithm works with are feasible.
In the manual that's called a "build-in hard constraint". Look for it.

In this use case, that is probably a bad idea in my experience. Why? 
Well I hope this makes any sense:
/You need to allow the optimization algorithms to break it now and then 
to tunnel through a bad search space into another good search space./
If it doesn't, don't worry.
>
> [2] Do it using drools rules, like the following:
>
> rule "Avoid conflicting activities"
> when
> Assignment($room1: room, $act1: activity, $id : activity.id 
> <http://activity.id>)
> Assignment(room == $room1, room!= null, $act2 : activity, activity.id 
> <http://activity.id> > $id)
> eval(Activity.conflict($act1, $act2))
Why calculate it every time if you can cache it? [3]
> then
> insertLogical(new IntConstraintOccurrence("conflictingActivities", 
> ConstraintType.NEGATIVE_HARD,
>                 10, null));
> end
>
> Here I'm using Assignment as the only planning entity. There's an 
> assignment for each activity and it may point to a room or to null in 
> the case the activity is not assigned. In the case above, I have a 
> static function that checks whether two activities conflicts. This 
> way, solutions may be infeasible but with high penalties the best 
> solution found will eventually be feasible.
>
[3]
> I also thought of a third option, which is to insert a fact "Conflict" 
> for each pair of conflicting activities in a preprocessing phase. This 
> way we would end up with:
This is the recommended way. It's called "cached problem facts" in the 
manual.
See the TopicConflict use in the examinationScoreRules.drl and 
Examination.getProblemFacts() in the examples.
>
> rule "Avoid conflicting activities"
> when
> Assignment($room1 : room, $act1: activity, $id : activity.id 
> <http://activity.id/>)
> Assignment(room== $room1, room != null, $act2 : activity, activity.id 
> <http://activity.id/> > $id)
> Conflict(act1 == $act1, act2 == $act2)
I would put Conflict first. But try it this way too and let me know 
which works better ;) I don't know.
Stated differently: Instead of checking every 2 simultaneous assignments 
if they are a conflict,
I would check if every 2 conflict assignments are simultaneous (like in 
examinationScoreRules.drl).
> then
> insertLogical(new IntConstraintOccurrence("conflictingActivities", 
> ConstraintType.NEGATIVE_HARD,
>                 10, null));
> end
>
> The problem is that there may be up to O(N^2) such objects.
>
> I do not know the rules engine algorithm in depth, so I'd like to 
> know: Is any of these approaches more efficient than the others?
[3] is definitely faster than [2].
>
> Thanks!
>
>
> _______________________________________________
> 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/20111019/d16ae8f8/attachment.html 


More information about the rules-users mailing list