A scheduling problem is
defined by a set of tasks T and a set of resources R. Tasks are constrained by
precedence relationships, which bind some tasks to wait for other ones to
complete before they can start. Tasks that share a resource are not
interruptible (non-preemptive scheduling) and mutually exclusive (disjunctive
versus cumulative scheduling). The goal is to find a schedule that performs all
tasks in the minimum amount of time.
Formally, to each task t , a
non-negative duration d(t) and a resource use(t) are associated.
For precedence relations, precede(t1, t2 ) denotes that t2 cannot
be performed before t1 is completed. The problem is then to find a
set of starting times {time(t)}, that minimizes the total makespan of
the schedule defined as Makespan := max{time(t) + d(t)} under the
following constraints:
Job-shop scheduling is a special case
where the tasks are grouped into jobs j1,..., jn . A job
ji is a sequence of tasks j1i,..., jmi
that must be performed in this order, i.e., for all ,
one has precede( jki , jk+1i).
Such problems are called n x m problems, where n is the
number of jobs and m the number of resources. The precedence network is
thus very simple: it consists of n “chains”. The simplification does not
come from the matrix structure (one could always add empty tasks to a
scheduling problem) but rather from the fact that precedence is a functional
relation. It is also assumed that each task in a job needs a different machine.
For a task jki , the head will be defined as the sum of
the durations of all its predecessors on its job and similarly the tail as the
sum of the durations of all its successors on its job, e.g.:
When one allows the precedence relations
to form a more complex network, the problem is referred to as a disjunctive
scheduling problem. Although general disjunctive scheduling problems are often
more appropriate for modelling real-life situations, little work concerning
them has been done (they have been studied more by the AI community than by
Operations Researchers and most of the published work concerns small instances,
like a famous bridge construction problem with 42 tasks [VH89]) The interest of
n x m scheduling problems is the attention they have received in the
last 30 years. The most famous instance is a 10 x 10 problem of Fisher &
Thompson [MT63] that was left unsolved until 1989 when it was solved by Carlier
& Pinson [CP89]. Classical benchmarks include problems randomly generated by
Adams, Balas & Zawak in 1988 [ABZ88], Applegate & Cook in 1990 [AC91] and by
Lawrence in 1984 [La84]. Of the 40 problems published by Lawrence, one is still
unsolved (a 20 x 10 referred to as LA29). The typical size of these
benchmarks ranges from 10 x 5 to 30 x 10.
Branch and bound algorithms have, however,
undergone much study, and the method effectively used in [CP89] to solve MT10
is a branch & bound scheme called “edge-finding”. Since a schedule is a set of
orderings of tasks on the machines, a natural way to compute them step after
step is to order a pair of tasks that share the same resource at each node of
the search tree (which corresponds to getting rid of a disjunction in the
constraint formulation). There are many variations depending on which pair to
pick, how to exploit the disjunctive constraint before the pair is actually
ordered, etc., but the general strategy is almost always to order pairs of
tasks [AC91].
The domain associated with time(ti)
is represented as an interval : to each task ti, a window [ti,
¯ti - d(ti)] is associated, where ti
is the minimal starting date and ti is the maximal completion date
(thus the starting date time(ti) must be between ti
and ti-d(ti )). During the search, a partial ordering
(<<) of tasks is built, with the following meaning : t1 << t2<=>time(t1)+d(t1)<=time(t2)
In order to prune efficiently the search
space, one needs to be able to propagate the decisions taken at each node of
the search tree. Thus, whenever an ordering is selected, say t1 << t2,
the bounds of the domains can be updated as follows: t2 >= t1
+ d(t1) and t1 <= t2 - d(t2). With
this model, inconsistency can be detected when one has ¯t - t <
d(t) for some task t (t can no longer fit in its window).