I’m interested in the application of
Drools in the planning and scheduling domain. In a planning application a
planner can take planning decisions and the system will determine all consequences
of the planning decision automatically and provides immediate visual
feedback of these consequences. For example, suppose that we have a number of
machines and a number of jobs and each job must be allocated to one of the
machines; the objective is to minimize the completion time of the latest job. In this case, there are two types of planning decision:
allocating a job to a machine and sequencing the jobs on each machine.
I’ve been experimenting for a while to employ Drools 5.0 to determine the consequences of the planning decisions. Many business rules in the planning and scheduling domain are in fact calculations that express the (declarative) dependency of an attribute of an object on the attributes of one or more other objects. For the machine scheduling problem we have the following business rules:
These rules can be formulated in Drools, for example:
rule "BR-ALLOCATION.COMPLETION_TIME"
when
$job : Job($procTime : procTime)
$allocation : Allocation($startTime : startTime, job == $job)
then
$allocation.setCompletionTime($startTime + $procTime);
end
Unfortunately my approach does not scale very well. I guess that this is related to the way in which RETE works by keeping all possible pairs of Jobs and Allocations in memory, although each Job is associated (object reference) with at most one Allocation. Is there any which in which Drools can take advantage of the fact that a Job has an explicit reference to an Allocation? Do you have any suggestions on how to improve the performance?
In planning and scheduling applications it is not uncommon to have up to a million objects in the working memory.
Regards,
Robin