Scheduling consists in deciding when a set of activities must be executed under dif- ferent constraints, in order to optimize a given objective. The two main types of constraints are precedences between activities, and the availability of finite resources. Common objectives are to minimize the total duration, or to minimize the weighted sum of the tardiness of activities with respect to given due-dates.
Scheduling problems are very varied, both in application domains and in fea- tured constraints. Some typical applications are manufacture scheduling, construc- tion scheduling, code optimization in compilers, and pharmaceutical project planning. Variations of the problem features may be concerned with the duration of the activities (fixed or variable), the kinds of precedences, the type and number of resources, or the presence of side constraints. More details are given in Section 2.1.
Solution techniques for scheduling include Constraint Programming, Local Search, Mathematical Programming, Genetic Algorithms and many more. Most of these tech- niques are, however, targeted at specific problems, and they need a lot of development

2 Chapter1. TheThesis to adapt them to different problems. Some techniques are more general (e.g., Constraint Programming), but they still need clever heuristics to deal with larger problems.