@@ -166,27 +166,30 @@ An advantage is that it allows modelling task priorities.

Tasks earlier earlier in the instance definition get scheduled first.

Another advantage is that the schedules it builds are valid by construction, where no resource is assigned to two tasks that are overlapping in time, and where tasks are always preceded by their predecessors.

Every valid assignment has at least one valid schedule, and the schedule builder will always find one.

In the worst case, all tasks have to be executed in sequence.

A disadvantage is it does not always find the schedule with the shortest makespan, because it schedules the tasks in the order in which they occur in the instance definition.

It is sometimes possible to find shorter schedules by changing the order of tasks.

Consider the scenario in \cref{fig:greedy-fails}.

There are two resources, A with one capability capA, and B with one capability capB.

There are two resources, resource A with one capability capA, and B with one capability capB.

There are three tasks 1, 2, and 3, where task 1 requires capA and tasks 2 and 3 require capB.

Furthermore, task 1 is a predecessor of task 2.

There exists only one valid assignment, namely the one shown in \cref{fig:greedy-fails}.

There exists exactly one valid assignment, namely the one used in \cref{fig:greedy-fails}.

The greedy schedule builder processes tasks in the order in which they occur, so it fails to see that task 3 could be scheduled at time 0.

\begin{figure}

\centering

\def\svgwidth{0.95\linewidth}

\sffamily

\input{greedy-fails.pdf_tex}

\caption{greedy fails}

\caption{A problem instance where the greedy schedule builder fails to find the best schedule.

Task 3 could be scheduled at time 0.}

\label{fig:greedy-fails}

\end{figure}

Finding the shortest schedule for a given assignment is an optimization problem on its own, which we leave for future work.