1 Introduction

Project scheduling is a fundamental decision in project management. In terms of computational complexity, project scheduling under limited resources, referred as the resource constrained project scheduling (RCPS) problem constitutes an intractable combinatorial optimization problem. Blazewicz et al. [1] showed that RCPS belongs to the class of the strongly NP-hard problems. Since the pioneer mathematical model and the first solution algorithm of Pritsker et al. [2], hundreds of mathematical models and solution algorithms for various real-world variants of the basic RCPS problem have been proposed in the literature. Habibi et al. [3] provides a recent brief review of this variations while a more comprehensive review but somewhat older can be found in Hartmann and Briskorn [4]. In order to face the fluctuation of the use of the resources in a project, project managers build suitable Gantt charts which help presenting the resource profiles, i.e., the usage of each resource over the planning horizon of the project. Large fluctuations in resource usage can be quite costly and therefore not desired. The goal of achieving a smoother resource profile leads to another very challenging problem known as the resource leveling problem (RLP) (see, e.g., Neumann and Zimmermann [5]).

In practice, commercial software applications such as Primavera, SuperProject, and MS Project perform resource leveling using simple priority rules. These rules obtain smoother profiles by shifting the project’s jobs within their float times while kee** the project’s length fixed. However, these solutions are usually non-optimal. In fact, RLP has been proven to be NP-hard in the strong sense and therefore quite difficult to be solved in optimality (see Neumann et al. [6]). During the last decades many mathematical models and solution algorithms have been proposed in the literature to face RLPs. Different optimization objectives result to different balancing of the resources and consequently to different resource profiles. Some common objectives used in the literature are the following: minimizing the maximum daily usage; minimizing the sum of squares of daily usages, the sum of the absolute deviations from daily target values, the imbalance of the resource usage over the project schedule, the peak of resource usage in the schedule, and the total number of released and rehired workers (in the case of workforce resources); and minimizing the cumulated deviations of the resource utilization from a given level.

Most of the research works on RLP assume that the schedule length is given and the project manager has to manage the jobs so that to achieve the objectives related to balancing the usage of the resources over the schedule’s duration. In contrast, some other works try to determine both a balance resource allocation and minimum project duration (see for example Caramia and Dell’ Olmo [7]). This makes the problem much harder. Moreover, the majority of the models assume non-preemption (no jobs splitting); that is, a job once started cannot be interrupted until its work finishes. Few models however assume jobs’ splitting (see, e.g., [8, 9]. As a final comment, most of the existing works deal with the deterministic RLP. That is, jobs’ durations are fixed and known a priori, resources are assumed renewable available at their maximum capacity in every period etc. Yet, some researchers concentrated their attention into more realistic scenarios where uncertainty is expected in jobs duration, resources may break down, due dates may change, etc. (see, e.g., [10,11,12,13].

Exact solution methods (mainly based on bound-and-bound method as well as on dynamic programming) for resource leveling cannot solve large-sized problem instances in reasonable computer time (see [14, 15]. Due to these results, many researchers turned recently their attention to the development of heuristic and metaheuristic algorithms for approximately solving the problem (see, e.g., [8, 16,17,18,19].

The current study contributes to the growing resource leveling literature as follows: firstly, two effective greedy algorithms are introduced for leveling the resource usage fluctuations in a schedule. These algorithms constitute adaptations of practical smoothing techniques used in real-world projects. Secondly, three hybrid models are designed to address RLP. These models combine the two greedy algorithms with DE, GA, and PSO metaheuristics in a number of ways. A comprehensive literature review is also performed for publications concerning the heuristic solution of RLP. Our attention was concentrated on works about modern heuristics known as metaheuristics (for an introduction into the field please see the text books of Michalewicz and Fogel [20], Talbi [21]). The table in the Appendix A gives a synopsis of this review presenting for each identified article the performance criteria considered for optimization and the solution method implemented. Considering the outcome of this review we can realize the following: first, GAs are by far the most used solution algorithms to tackled RLPs. Second, the majority of the papers studied RLP assuming a given (fixed) time horizon. That is, the resources are allocated to jobs into time slots kee** the schedule’s makespan fixed. Third, none of these works makes extended investigation on existing RCPS benchmarks datasets to measure the efficiency of their resource leveling solution methods. Actually, all previous studies assessed the performance of their algorithms over randomly generated (often small-sized) test instances.

The rest of this study is structured as follows: Section 2 of the paper presents a comprehensive state-of-the-art review on previous metaheuristics for the solution of RLP. The formulation of the problem together with the necessary genera assumption are given in Section 3. The hybrid metaheuristic algorithms employed to tackle the problem are presented and analyzed in detail in Section 4. Experimental results concerning the performance of the developed approaches together with a comprehensive statistical performance analysis are provided in Section 5. Also, in the same section comparisons to a commercial project management software are given. Finally, a summary of conclusions and ideas for future plans are described in Section 6.

2 Literature Review

A complete literature overview of the existing algorithms to solve this challenging scheduling problem is not the aim of this paper and can be found in other sources in the literature (see, e.g., [15, 17, 22]). Here, we refer to a number of interesting works concerning the metaheuristic solution of the deterministic RLP that are worth reading.

In an early attempt Chan et al. [23] used a canonical genetic algorithm (GA) to tackle RLP in the context of construction project scheduling. The authors adopted an optimization model with aim to minimize the deviation of the necessary resources profiles for the available resources. The Chan et al.’s GA tries to reduce peak resource usage while determining the shortest schedule duration for the project. Later, Hegazy [24] faced a multi-objective version of the problem aiming to minimize both the time completion of the project and resource usage. First, improvement of some known simple heuristics was proposed for resource allocation and leveling. In these heuristics random priorities were introduced into selected tasks and their impact on the schedule was monitored. A GA was then applied to search for the priorities that result to shorter schedules with smoother resource profiles. Son and Skibniewski [25] tackled RLP via a hybrid model which combines a local optimizer with simulated annealing (SA). Four simple priority rules were included in the local optimizer module each one using a different combination of schemes for shifting noncritical activities. The solution generated by the local optimizer was then being improved by a SA procedure.

Leu et al. [26] also employed a GA with the aim to minimize the weighted total resources requirements. Senouci and Eldin [27] presented a non-linear mathematical model for RLP considering all the types of relationships constraints. A hybrid GA was also proposed to simultaneously address both scheduling and leveling. Formulating the fitness function of each individual solution as a quadratic penalty function the authors treated the physical constrained optimization problem as an unconstrained one. Caramia and Dell’ Olmo [7] studied a more general RLP with three objectives to be minimized, namely the project duration, the peak of resource profile and the imbalancing of the resource usage. The authors addressed the problem via an iterated local search algorithm (LCA).

Raja and Kumanan [28] presented a Petri nets based approach aided by a memetic algorithm to solve RLP. Petri nets were used to model the project while the memetic algorithm was used to search for an optimum resource leveled solution. The developed memetic algorithm combines a canonical GA with a LCA (applied on every population solution) for schedule optimization. Georgy [29] proposed a GA for solving the RLP in linear construction projects. Leveling was achieved by smoothing either the daily fluctuations in resource usage or the deviations from the average resource usage. El-Rayes and Jun [30] introduced two interesting performance indices to directly compute and minimize the resource variations related to productivity as well as to the cost in construction project scheduling. Solutions to RLP using the two aforementioned indices were finally achieved by a GA. A similar GA was also appeared in Huang et al. [31]. The authors first analyzed the problem in the context of large scale projects and then established a mathematical optimization model which finally tackled by a GA-based solution method.

Anagnostopoulos and Koulinas [16] introduced the concept of hyper heuristics in accordance with SA for solving RLPs. SA is used for searching for a near-optimum resource leveled schedule solution. Then, a hyper heuristic is applied which works on a set of task priority rules aiming to improve SA’s solution. Later, in a similar study, Koulinas and Anagnostopoulos [32] tacked the problem using a tabu-search algorithm together with a hyper heuristic algorithm. Geng et al. [33] employed a modified ants colony optimization (ACO) algorithm for solving non-linear RLPs. In ACO a swarm of artificial ants search for the best path through the decision space that corresponds to a resource smoothing schedule. Alsayegh and Hariga [8] considered a variant of RLP aiming to minimize the costs related to both the fluctuations of the resource usage and to the split of non-critical activities. To address this problem, the authors proposed a set of hybrid metaheuristics which combine a particle swarm optimization (PSO) algorithm with SA. The designed metaheuristics differ in the way the particles’ velocities and positions (used in PSO) are updated. Ranjbar [19] presented a path-relinking metaheuristic algorithm to tackle RLP which includes a relinking procedure, a repairing procedure and an improvement procedure. The author showed experimentally that this algorithm is superior to two existing similar approaches, namely a tabu-search algorithm and an iterated greedy algorithm. Kyriklidis et al. [34] presented three solution algorithms for RLP, namely a GA, an ACO, and a hybrid scheme which combines the two aforementioned algorithms to a hybrid metaheuristic. In the latter, ACO searches for a near-optimum solution which is then used to seed the initial population of GA. Later, Kyriklidis and Dounias [18] presented an improved version of the GA appeared in Kyriklidis et al. [34] investigating its performance in regard to various resource leveling performance criteria. As a final point, a random-key GA hybridized with a local search procedure was recently presented by Li et al. [35] to address a variant of RLP with generalized precedence relations. This variant is much more difficult to be solved than the standard RLP since minimal and maximal time lags are introduced between pairs of activities.

3 Problem Formulation

In this section we present and discuss a general formulation for the resource leveling problem (RLP) under consideration. All information used in the analysis is assumed to be deterministic and known in advance. Below we give a set of notation used In our analysis:

\({\varvec{n}}\)

Number of jobs.

\(\mathbf{K}\)

Number of renewable resources types.

\({\varvec{J}}\)

Set of jobs, \(J=\left\{{J}_{1},{J}_{2},\dots ,{J}_{n}\right\}\).

\({\varvec{R}}\)

Set of resources, \(R=\left\{{R}_{1},{R}_{2}, \dots ,{R}_{K}\right\}\).

\({\varvec{j}}\)

Index for the jobs.

\({\varvec{k}}\)

Index for the resources.

\({{\varvec{J}}}_{{\varvec{j}}}\)

Job \(j\).

\({{\varvec{R}}}_{{\varvec{k}}}\)

The \(k\) type of resource.

\({{\varvec{p}}}_{{\varvec{j}}}\)

Processing time (duration) of job \(j\).

\({{\varvec{S}}}_{{\varvec{j}}}\)

The start time of job \(j\) in the schedule.

\({{\varvec{C}}}_{{\varvec{j}}}\)

Completion time of job \({\text{j}}\).

\({{\varvec{C}}}_{{\varvec{m}}{\varvec{a}}{\varvec{x}}}\)

The makespan of a project.

\({{\varvec{r}}}_{{\varvec{j}}{\varvec{k}}}\)

The amount of units of resource type \(k\) required by job \(j\) in each period.

\({\varvec{T}}\)

The length of a project schedule.

\({\varvec{t}}\)

Index for the time periods, \(t\le T\).

\({{\varvec{t}}{\varvec{c}}}_{{\varvec{k}}}^{({\varvec{t}})}\)

The total consumption of resource type \(k\) requested by those jobs scheduled at time \(t\).

\({{\varvec{\mu}}}_{{\varvec{\kappa}}}\)

The average resource request of resource type \(k\) per period.

\({{\varvec{d}}{\varvec{e}}{\varvec{v}}}^{\left({\varvec{t}}\right)}\)

The absolute deviations of \({tc}_{k}^{(t)}\) from \({\mu }_{\kappa }\) averaged over the resource types.

\({\varvec{D}}{\varvec{E}}{\varvec{V}}\)

The balancing of the usage of all the resource types over the schedule length.

\({{\varvec{\sigma}}}^{\left({\varvec{x}}\right)}\)

The project schedule of an individual solution \(x\).

A project consists of a set \({\varvec{J}}=\left\{{J}_{1},{J}_{2},\dots ,{J}_{n}\right\}\) of \(n\) jobs to be carried out by a set \({\varvec{R}}=\left\{{R}_{1},{R}_{2},\dots ,{R}_{K}\right\}\) of \(K\) renewable resource types. The resources are renewable in the sense that in every period their full capacity is available. The jobs are subject to precedence constraints in the form of an acyclic activity-on-node (AON) network topology. This implies that a job cannot be started before the completion of all its predecessors in the project’s network. Each job \({J}_{j}\in {\varvec{J}}\) has a fixed and known duration \({p}_{j}\) and requires in each period a certain amount of \({r}_{jk}\ge 0\) units of each resource type \({R}_{k} (k=1,\dots ,{\text{K}})\) to be performed. Preemption of a job is not allowed. That is, a job must be finished without interruption once it has been started. A project schedule is an assignment of start times \({S}_{j}\) to each job \({J}_{j}\in {\varvec{J}}\). The objective is to find a schedule that minimizes the makespan of the project while achieving a smooth resource profile.

The former objective (minimum makespan) leads to the earliest possible completion of the project. Assuming that the completion time of each job \({J}_{j}\in {\varvec{J}}\) in a schedule is \({C}_{j}\) then the makespan is, \({C}_{max}={\text{max}}({C}_{1,\dots ,}{C}_{n})\), i.e., the maximum of the completion times of all the jobs in the project. The latter objective (smooth resource profile) leads to a balance of the resources allocated to the jobs of the project; a fact that can be achieved by minimizing the changes in the level of resource usage from period to period. Below we give the formulation of the resource balance objective employed in this study. In our discussion we followed a similar analysis as that appeared in the excellent book of Caramia and Dell’ Olmo [7]. In particular, the objective function employed measures the sum of the deviations in the consumption of each resource type from a desired threshold. Let a project schedule of length (duration) \(T\). Let also \({tc}_{k}^{(t)}\) be the total consumption of a resource type \(k\) requested by those jobs scheduled at time slot \(t\le T\). Then, for each slot \(t\), \({tc}_{k}^{(t)}\) is estimated by:

$${tc}_k^{(t)}=\sum_{j=1}^nr_{jk},t=1,\dots,T,k=1,\dots,\text{K}$$
(1)

In addition, let \({\mu }_{\kappa }\) (\(k=1,\dots ,{\text{K}}\)) be the average request for resource of type \(k\) per period estimated by

$$\mu_k=\frac1{\text{T}}\sum_{j=1}^nr_{jk},k=1,\dots,\text{K}$$
(2)

The average, over the resource types of the absolute deviations of \({tc}_{k}^{(t)}\) from \({\mu }_{\kappa }\), is given by the relation

$$dev^{(t)}=\frac1{\text{K}}\sum_{k=1}^\text{K}\left\lfloor\mu_k-tc_k^{\left(t\right)}\right\rfloor,\;t=1,\;...\;,T$$
(3)

Summing now the usage of all the resource types over the schedule duration denotes an efficient measure for the balancing of the resources (Caramia and Dell’ Olmo [7]).

$$DEV=\sum_{t=1}^T{dev}^{\left(t\right)}$$
(4)

Minimizing the function given by Eq. (4) leads to a smooth resource profile, i.e., to an efficient allocation of the resources to the jobs over the schedule length. This function constitutes the second objective in the resource leveling problem under consideration.

4 The Developed Hybrid Metaheuristics

We now present and discuss the solution algorithms investigated for RLP. These algorithms effectively constitute hybrid adaptations of three famous metaheuristics, namely DE, GA, and PSO. First, we briefly describe the main components and operation of the standard version of the three metaheuristics. Then, we present and analyze how these algorithms can be applied to the RLP in accordance to two novel local search scheduling procedures. Two different design issues were considered in the development of these hybrids: (a) combining a metaheuristic with a local search heuristic; (b) combining a metaheuristic with a complementary metaheuristic.

4.1 The Standard DE, GA, and PSO Algorithms

DE, GA, and PSO belong to the class of population-based metaheuristics (see e.g., Michalewicz [36], Michalewicz and Fogel [20], Talbi [21]). In their standard version, both DE and PSO are stochastic optimizers over continuous search spaces, which means that they both utilize floating-point vectors as potential solutions to the physical optimization problem. Instead, a GA can be found in various forms depending on the way it encodes the problem solution space; such as, binary-coded, integer-coded real-valued coded GA. To achieve a fair comparison between the three algorithms, a real-valued GA was selected for use in this work. Meaning that the individual GA solutions (genotypes are floating-point vectors as in the case of DE and PSO as well. Let us briefly discuss the operation of each one of these metaheuristics for the solution of the global optimization problem:

$$\underset{\mathbf{x}\in\Omega \subset {{\varvec{R}}}^{D}}{{\text{min}}}f\left(\mathbf{x}\right)$$
(5)

with \(\Omega\) denoting the feasible search space of the D-dimensional problem.

4.2 The Differential Evolution (DE) Algorithm

DE [37] utilizes a population of \(Ns\), D-dimensional parameter vectors \({{\varvec{x}}}_{i,gen}\) \(i\in \{1,\dots ,Ns\}\) (\(gen\) denotes the generation number) to search Ω. The population S = \(\left\{{{\varvec{x}}}_{\mathrm{1,0}},\dots ,{{\varvec{x}}}_{Ns,0}\right\}\) of the initial generation (gen = 0) is randomly selected over Ω. In every generation, all members in S (called target vector solutions) are candidate to be replaced by other new solutions. This is attained by applied three successive operators on the population, namely mutation, crossover, and acceptance, respectively. Mutation operates as in the following: for each target vector \({{\varvec{x}}}_{i,gen}\) in S a mutant vector \({\widetilde{{\varvec{x}}}}_{i,gen}\) is obtained by

$${\widetilde{{\varvec{x}}}}_{i,gen}={{\varvec{x}}}_{\alpha ,gen}+F\left({{\varvec{x}}}_{\beta ,gen}-{{\varvec{x}}}_{\gamma ,gen}\right)$$
(6)

where \(\alpha \ne \beta \ne \gamma \ne i\in \left\{1,\dots ,Ns\right\}\) are integer indices and \(F>0\) is a real number.

After mutation, crossover operator is applied to generate \({\boldsymbol{\Psi }}_{i,gen}\) from both \({\widetilde{{\varvec{x}}}}_{i,gen}\) and \({{\varvec{x}}}_{i,gen}\). \({\boldsymbol{\Psi }}_{i,gen}\) is called trial vector and is obtained by,

$${\boldsymbol{\Psi }}_{i,gen}=\left\{\begin{array}{l}{\widetilde{{\varvec{x}}}}_{i,gen}^{l}, if\; rnd\le CR\; or\; l=z \\ {{\varvec{x}}}_{i,gen}^{l}, if\; rnd>CR\; and\; l\ne z\end{array}\right.$$
(7)

where \(CR\) is the crossover probability. \(z\) is an integer randomly selected in \(\left\{1,\dots ,D\right\}\); \(l\) denotes the value of the \(l\)-th component of a vector and \(rnd\in \left(\mathrm{0,1}\right)\) is a real number drawn randomly for each \(l\). The two operators mutation and crossover are iteratively applied on all members in S and the result is the creation of \(Ns\) trial vectors. Acceptance operator is then applied to produce the final solutions of the new S. Each member of the new population is generated using the relation:

$${{\varvec{x}}}_{i,gen+1}=\left\{\begin{array}{l}{\boldsymbol{\Psi }}_{i,gen}, if\; f\left({\boldsymbol{\Psi }}_{i,gen}\right)< f\left({{\varvec{x}}}_{i,gen}\right) \\ {{\varvec{x}}}_{i,gen},\qquad \qquad \quad otherwise\end{array}\right.$$
(8)

where \(f\left( {\boldsymbol{\Psi }}_{i,gen}\right)\) denotes the cost of the trial vector \({\boldsymbol{\Psi }}_{i,gen}\) and \(f\left({{\varvec{x}}}_{i,gen}\right)\) denotes the cost of the target vector \({{\varvec{x}}}_{i,gen}\). During the acceptance phase, each target vector is compared with its associated trial vector and the vector with the lowest cost is copied into the new population. After a number of generations, DE terminates with the satisfaction of a desired termination condition.

4.3 The Particle Swarm Optimization (PSO) Algorithm

PSO [38] has its roots in bird flocking and fish schooling theories. PSO maintains a population (called swarm) of \(Ns\) particles (potential solution), with every particle representing a position in the search space Ω. The particles start at random locations and search for the optimum solution by moving through Ω. Each particle \(i\in \left\{1,\dots ,Ns\right\}\) has three characteristics: its current position \({{\varvec{x}}}_{i,gen}\), its personal best position \({{\varvec{x}}}_{i,gen}^{pbest}\) determined so far, and its current velocity \({{\varvec{v}}}_{i,gen}\). The initial population (\(gen=0\)), S = \(\left\{{{\varvec{x}}}_{1,gen},\dots ,{{\varvec{x}}}_{Ns,gen}\right\}\) is randomly created using the relation:

$${{\varvec{x}}}_{i,gen}^{l}={{\varvec{x}}}_{min}+rnd.\left({{\varvec{x}}}_{max}-{{\varvec{x}}}_{min}\right)$$
(9)

where \(l\) represents the \(l\)-th component of particle \({{\varvec{x}}}_{i,gen}\).\({{\varvec{x}}}_{min}\) and \({{\varvec{x}}}_{max}\) are user defined bounds, and \(rnd\in \left(\mathrm{0,1}\right)\) a random number. The velocities of the initial particles are generated in a similar way using

$${{\varvec{v}}}_{i,gen}^{l}={{\varvec{v}}}_{min}+rnd.\left({{\varvec{v}}}_{max}-{{\varvec{v}}}_{min}\right)$$
(10)

With \({{\varvec{v}}}_{min}\), \({{\varvec{v}}}_{max}\) being user-defined fixed bounds.

The general operation of PSO in every generation is as follows:

  • STEP 1: For each particle \(i \left(i\in \left\{1,\dots ,Ns\right\}\right)\), estimate its objective function \(f\left({{\varvec{x}}}_{i,gen}\right)\).

  • STEP 2: For each particle \(i,\) update its personal best position as follows:

    $$\mathbf{if}\; gen=0\; \mathbf{then}\; {{\varvec{x}}}_{i,0}^{pbest}={{\varvec{x}}}_{i,0}$$
    $$\varvec{else}\;\varvec{if}\;f\left({{\varvec{x}}}_{i,gen}\right) < f\left({{\varvec{x}}}_{i,gen}^{pbest}\right) \varvec{then}\; {{\varvec{x}}}_{i,gen}^{pbest}={{\varvec{x}}}_{i,gen}$$
    (11)
  • STEP 3: Update the global best position \({{\varvec{x}}}_{gen}^{gbest}\). This metric corresponds to the best \(f\left({{\varvec{x}}}_{i,gen}\right)\) among the all the particles in the swarm.

  • STEP 4: For each particle \(i\), update its velocity \({{\varvec{v}}}_{i,gen}\) using the relation

    $${{\varvec{v}}}_{i,gen}={{\varvec{c}}}_{1}.{{\varvec{r}}}_{1}.\left({{{\varvec{x}}}_{i,gen}^{pbest}-{\varvec{x}}}_{i,gen}\right)+{{\varvec{c}}}_{2}.{{\varvec{r}}}_{2}.\left({{{\varvec{x}}}_{gen}^{gbest}-{\varvec{x}}}_{i,gen}\right)+{{\varvec{w}}}_{gen}.{{\varvec{v}}}_{i,gen}$$
    (12)

    where parameters \({{\varvec{c}}}_{1}\) and \({{\varvec{c}}}_{2}\) are the acceleration coefficients (also called cognitive and social parameter, respectively). These parameters (are fixed during the execution of the algorithm) represent the influence of the local best and the global best position, respectively, to a particle. \({{\varvec{r}}}_{1},{{\varvec{r}}}_{2}\) are random values drawn within (0,1). Parameter \({{\varvec{w}}}_{gen}\) is called the inertia weight and its use to determine the influence of the old velocity of the particle. Typical values of \({{\varvec{w}}}_{gen}\) are near to 1.

  • STEP 5: For each particle \(i\), calculate its new position by:

    $${{\varvec{x}}}_{i,gen}={{\varvec{x}}}_{i,gen-1}+{{\varvec{v}}}_{i,gen}\quad {\text{for }} gen>0$$
    (13)
  • STEP 6: Repeat steps (1)–(5) for a user-defined maximum number of generations.

4.4 The Genetic Algorithm (GA)

GAs introduced by Holland [39] as stochastic population heuristics that follow the evolution paradigm. GAs encodes the problem’s decision variables into strings of fixed length over a certain alphabet. These strings called chromosomes represent potential solutions to the physical search problem. Chromosomes are maintained and evolved in a data structure called population. The conventional GA is binary-coded, that is, it maintains a population of binary vector solutions (chromosomes). Michalewicz [36] showed that a real-valued GA is superior to the conventional binary-coded GA for function optimization. As discussed before, the former treats the chromosomes as floating-point vectors, and therefore from this point of view is similar to DE and PSO.

Particularly. a real-valued GA also utilizes \(Ns\), D-dimensional chromosomes \({{\varvec{x}}}_{i,gen}\) \(\left(i\in \left\{1,\dots ,Ns\right\}\right)\), (\(gen\) denotes the generation number) as a population to search Ω. The initial population S is created in the same way as in DE. The chromosomes in S are then evaluated by computing their fitness; this is a measure denoting the quality of the solution represented by a particular chromosome. High fitness values correspond to high quality solutions to the physical problem. At each generation, a set of three operators namely selection, crossover, and mutation are applied on S to determine its members for the next generation. In the selection phase, a pair of parent chromosomes is selected for reproduction using a selection scheme. There are several selection schemes in the literature. The most famous are the proportional [39] and the tournament selection [36]. Using the former, an individual \({{\varvec{x}}}_{i,gen}\) is selected for reproduction with a probability given by \(f\left({{\varvec{x}}}_{i,gen}\right)/\sum_{i=1}^{Ns}f\left({{\varvec{x}}}_{i,gen}\right)\). With \(f\left({{\varvec{x}}}_{i,gen}\right)\) denoting the fitness of \({{\varvec{x}}}_{i,gen}\). When using tournament selection, a tournament between a randomly chosen set of individuals is held and the one with the highest fitness is chosen for reproduction.

The selected parent chromosomes undergo crossover and mutation (with a corresponding probability) to generate two new chromosomes called children. There exist dozens of crossover and mutation operators in the literature (see, e.g., [20, 36]. Once created, the two children are copied into a temporary population say S′ and the three operators (selection, crossover, mutation) are iteratively applied on S until the completion of S′ with \(Ns\) chromosomes. S′ is then copied into S constituting the population of the next generation. The above process is repeated until a certain termination condition is met as in DE and PSO. Finally, the chromosome with the best so far fitness will constitute the near-optimum solution to the physical optimization problem.

4.5 Hybrid Metaheuristics

Two main issues should be considered when designing a hybrid metaheuristic, namely the exploration of the problem’s search space and the exploitation of (usually) the best solution found so far. The former ensures that every region of the search space is searched enough to provide a reliable estimate of the global optimum.

The latter is needed to refine the current best solution aiming to produce a better solution. Exploration is generally performed by population-based heuristics while exploitation is usually attained by single-solution based heuristics (see, e.g., [21]). Following these lines of thought, we built two problem-specific greedy heuristic algorithms aiming to optimize locally the best individual solution of the evolving population. The actual objective with the developed greedy algorithms is to balance the resources among the project’s jobs by producing smoother resource profiles. The improved solution is then placed back into the population and continues evolution in competition with the other members of the population. The pseudo-codes of the two algorithms are presented and discussed below:

Algorithm
figure a

Leveling scheme 1 (LS1)

LS1 algorithm takes as input the schedule corresponding to the population best individual solution generated by a particular metaheuristic and creates an improved schedule with smoother resource profile. The new schedule has the same duration (length) \(T\) as the original schedule. Considering the non-critical jobs of the schedule (one job at a time), the algorithm extends randomly the duration of these jobs within the available float (total slack) aiming to minimize the changes in the level of resource usage from period to period. Non-critical jobs with high total floats are given priority considering jobs with less float later in order to even-out resource allocation to periods (i.e., fine-tuning). Throughout the algorithm, the main criterion for re-scheduling the project is the least value of parameter \(DEV\) so far. In this respect, the algorithm attempts to combine the duration of the non-critical jobs within the permitted floats so as to equalize the usage of the resources over the schedule’s length \(T\).

The second greedy algorithm termed LS2 (see below) constitutes a small variant of LS1. Actually, the only difference between the two algorithms is that LS2 applies two alternative resource leveling methods on each non-critical job of the schedule: either extending the duration of a job within its available float or delaying the job within its available float (see Fig. 1). The two methods are applied with equal probability on each non-critical job (see lines 9–13 of the pseudo-code below). Note that flip(x) in line 9 of the pseudo-code simulates a coin flip with probability x.

Fig. 1
figure 1

Possible cases occurred for a non-critical job \({{\varvec{j}}}^{\boldsymbol{*}}\) under the influence of the developed leveling schemes

Algorithm
figure b

Leveling scheme 2 (LS2)

Given the structure and operation of the two leveling schemes we now proceed with the presentation of the developed hybrids. A schematic overview of these hybrids is shown in Fig. 2. It is worth pointing out that LS1 and LS2 constitute a core building block of all the proposed hybrids.

Fig. 2
figure 2

A schematic overview of the developed hybrids. a A greedy heuristic embedded into a metaheuristic. b A serial hybrid scheme. c A parallel hybrid scheme

As can be seen from Fig. 2(a), the first hybrid follows the classic approach of combining a local search algorithm with a population-based heuristic. The local search algorithm is applied on the best population solution at each new generation aiming to optimize locally this solution. The population-based heuristic tries to optimize globally while the (single solution based) local search heuristic tries to optimize locally. Two forms of local search were investigated which correspond to the two greedy heuristics LS1 and LS2 analyzed above.

The second hybrid (see Fig. 2(b)) combines the three metaheuristics (DE, GA, PSO) into a single hybrid algorithm. Let us call this algorithm by the acronym SER (meaning, the serial hybrid metaheuristic). SER starts with a random population of solutions which is being evolved by DE. The population of the final generation of DE is then passed to a GA. Similarly, the population of the last generation of GA passes to the final phase of the algorithm which corresponds to the evolution of the population via PSO. That is, SER applies the three metaheuristics in a sequential form: first DE then GA and finally PSO. Moreover, as one can see from Fig. 2(b), the population best solution of each generation (iteration) is being locally optimized by a greedy algorithm (either LS1 or LS2). In each iteration the algorithm keeps track for the best-so-far solution.

The third hybrid (see Fig. 2(c)) referred to herein as PAR (the parallel hybrid metaheuristic) applies the three metaheuristics in “parallel.” Particularly, PAR separates the population of the individuals into three equal partitions and applies DE on the first partition, GA on the second, and PSO on the third partition of the population. In this sense each metaheuristic carries out a search in a separate solution space. At each iteration the best solution of every partition of the population is locally optimized by a greedy heuristic algorithm (LS1, LS2). Note that the best-so-far solution constitutes the best among all the individuals of the populations generated so far.

4.6 Solution Representation

A final point worth making is to decide how to decode the solutions maintained and evolved by the metaheuristics (DE, GA, PSO) to actual project schedule solutions. For an \(n\)-job RLP an individual solution is represented by a real-valued vector containing \(n\) real numbers taken values in the range (0,1). Each real number represents the priority of a job such that the i-th number in the vector denotes the priority of the i-th job in the project. A schedule can be then constructed using either the serial schedule generation scheme (SGS) or the parallel SGS (see, e.g., Hartmann and Kolisch [40] by scheduling each job as early as possible taking into account of course the constraints of both the jobs’ dependencies and resources’ availability. The use of serial SGS results to active schedules, while using parallel SGS results to non-delay schedules. Non-delay schedules may not include an optimal solution. This is due to the fact that idle times are occurred in these schedules only when no feasible job available for resource allocation exist. Besides, active schedules guarantee the inclusion of at least one optimal solution (see, e.g., [40, 41]). For this reason, in this study, the serial SGS was adopted for use.

5 Computational Experiments

We now present and discuss the experimental results obtained for assessing the quality of the examined algorithms. The algorithms were coded in C +  + and ran on an Intel Core i7 processor running at 3.6GHz and 16 GB 2400MHz DDR4 RAM. The experiments were accomplished on known RCPSP benchmarks available by ORLIB library (http://www.om-db.wi.tum.de/psplib/library.html). These benchmarks (originally appeared in Kolisch et al. [42] include three dataset test instances with \(n=\) 30, 60, and 120 jobs generated using ProGen (see Kolisch et al. [43] for details). The first two sets, termed j30 and j60, consist of 480 projects (test instances) with 30 and 60 activities, respectively, and four resource types. The third set (termed j120) consists of 600 projects each with 120 activities and four resource types. A comprehensive analysis on the way they were created can be found in Kolisch et al. [42].

5.1 Experimentation Setting

A three-phased experimentation was performed. In the first phase the performance of the developed hybrid leveling schemes (LS1, LS2) is evaluated in the context of the developed DE, GA, and PSO algorithms as well as within the new high-level hybrids PAR and SER. Each algorithm was run 10 times on each test instance and the best solution after these runs is reported. To eliminate bias from the experimentation process, each run was defined to start from a different random seed. In a second phase, a complete statistical analysis is conducted to rank formally the algorithms based on their efficiency. Each algorithm terminates after running for 5000 iterations (this is the stop** criterion). The following performance metrics were used to assess the performance of the algorithms:

  • %DEV: which is the average relative deviation between \(DEV\) (see Eq. (4)) estimated after applying a leveling scheme (either LS1 or LS2) on an existing schedule solution and the \(DEV\) estimated before the application of a leveling scheme. That is, this metric is computed by the relation

    $$\%DEV=\frac{\left(DEV.{\text{after}}-DEV.{\text{before}}\right)}{DEV.{\text{before}}}\times 100$$
    (14)
  • %Cmax is the mean % deviation from the optimal makespan (case of j30 tests) and the from critical path lower bound (case of j60 and j120 tests).

  • #opt is the number of times the algorithm found the optimal (or the existing lower bound to) makespan solution.

Finally, in the third phase of the experimentation, we compare the performance of the best algorithms found in the previous phases with a commercial project management software. The comparisons were carried out on a set of real-world projects ranging from 40 to 200. These projects were kindly provided from a large construction company in Cyprus in which the first author of this paper works. The full characteristics of these projects (jobs, dependencies, resource requirements, resource availability) can be submitted to the interested reader after request.

5.2 Control Parameters’ Settings

To determine the suitable settings of the control parameters of the three metaheuristics the following experimental framework was carried out: all algorithms maintain and evolve a population of 100 individual solutions. Stop** criterion was defined equal to 5000 iterations. That is, after 5000 iteration, each run is stopped. Recall that the individual solutions in the genotypic level for all the algorithms are encoded as real-valued vectors. The correct values for the rest of the control parameters included in each algorithm were estimated as in the following: in the case of DE, crossover rate (CR) takes values within the discrete range (0.2, 0.6, 0.9) while the scaling parameter F takes values in (0.5, 0.9). Mutant vectors are created using the best/1/bin scheme (see Storn and Price [37] for details about this scheme) As far as GA is concerned, we experimented with various combination of mutation and crossover rates within the discrete ranges {0.1, 0.01, 0.0333} and {0.6, 0.8}, respectively. To determine the appropriate mutation and crossover operators for GA we experimented with many well-known variation schemes related to continuous search spaces. In particular, five mutations were tested, namely random swap, uniform, non-uniform [36], polynomial [44], and Gaussian [45]. Regarding crossover, the following four schemes were tested: one-point, two-point, arithmetic [36], and simulated binary (most known with the abbreviation SBX) [46]. Finally, the most appropriate operators for the developed GA were the polynomial mutation and the simulated binary crossover.

Concerning PSO, we adopted the following control schemes (see Clerc and Kennedy [47]): first, \({{\varvec{c}}}_{1}\) and \({{\varvec{c}}}_{2}\) parameters were both set to be equal taking values in {0.5, 1.0, 2.0}. Then, we set \({{\varvec{c}}}_{1}=2\) and \({{\varvec{c}}}_{2}=1.5\) and repeat the experiments. Both schemes were examined with the inertia weight factor (\(w\)) taking value within the range (0.9, 1). To sum up, the developed algorithms were finally run with the control parameters’ settings shown in Table 1. Note that these settings were found to be the most appropriate for each algorithm after exhaustive experimentation with the control schemes described above.

Table 1 “Best” settings for the algorithms’ control parameters

The “best” settings shown in Table 1 were also adopted and used in relation to PAR and SER algorithms. In addition, for fair comparisons, the main population in PAR was virtually separated into 3 partitions each one containing POPsize/3 individual solutions, The first part was evolved by DE, the second by GA and the third by PSO (as explained in Section 3). PAR was defined to terminate after MAGEN iterations. Regarding SER, each one of the integrated algorithms (i.e., DE, GA, PSO) was defined to evolve a set of POPsize solutions for a MAXGEN/3 iterations (stop** condition).

5.3 Results

Table 2 displays the results obtained over the full benchmarks dataset with respect to the two developed resource leveling schemes (LS1, LS2). The algorithms are shown in the table sorted in ascending order of their %DEV value. As can be observed from Table 2, as far as the j30 tests are considered, the use of LS2 procedure within the algorithms results to better resource balancing than using LS1 procedure. See for example, the first three lines in Table 2. Here, SER/LS2 (i.e., SER in accordance with the second leveling scheme) is ranked first followed by GA/LS2 and then PAR/LS2. The former achieved solutions with a mean %DEV value equal to circa -25% and a mean deviation from optimal makespan circa 0.33%. This particular algorithm attained the exact optimal makespan solution in 356 out the 480 in total instances. As it obvious however, we cannot make a safe conclusion for the absolute best algorithm since some other algorithms dominate SER/LS2 in regard to the makespan metric. For instance, PAR/LS2 dominate SER/LS2 in both Cmax.dev% (= 0.29%) and #opt metrics (found the exact optimum makespan solution in 358 of the 480 in total instances). What is quite clear however is that the use of the proposed leveling procedures (either LS1 or LS2) within the context of the examined heuristics result to higher quality solutions in regard to all the investigated performance metrics (see the last five lines of the first block of Table 2). Note that in the cases where no leveling was applied on the generated schedule solutions (i.e., the algorithms ran without any leveling procedure), %DEV value is obviously zero (see 0.00% values in the table).

Table 2 Summary results of the first investigation phase

Turning now to j60 dataset, one can observe a completely different behavior of the examined heuristics. Particularly, the use of LS1 leveling procedure within the examined heuristics results to more effective resource balancing than using LS2 procedure. This observation seems to be also validated in the case of the most difficult set of instances, that with 120 activities (see the third block of Table 2). Another observation from both j60 and j120 datasets is that the use of either LS1 or LS2 procedures definitely improve the efficiency of the algorithms with respect to all the examined performance metrics. Moreover, considering the developed hybrid heuristics PAR and SER, the results show to a certain extent a high-quality performance ranked them among the top algorithms. However, the observed difference among all the algorithms in Table 2 regarding all the performance metrics is not clear enough and therefore it is still suggested to check whether this difference is statistically significant. The full results of all the investigations performed in this study are provided In appendices B and C of the paper. Appendix B includes the results obtained using LS1 leveling scheme while Appendix C includes the results concerning the use of LS2 scheme. A graphical illustration of the performance profiles of the algorithms regarding the running times required when using LS1 scheme is depicted in Fig. 3. In particular, this figure displays the probability for an algorithm to convergence to the “best” solution in time lower than x seconds. Performance profiles (please see [48] constitute a valuable tool for benchmarking and comparing optimization algorithms over large datasets in regard to various objective metrics.

Fig. 3
figure 3figure 3

Performance profiles over the three datasets in regard to different ranges of running times when using LS1 leveling scheme

5.4 Statistical Analysis

The results of the first investigation phase were further tested for statistical significance aimed at ranking the examined solution algorithms in terms of their efficiency. This is what we consider in this sub-section. Considering the makespan obtained by each algorithm as a random variable, we first observed that these variables violated the required conditions for normality. Therefore, we accomplished the Friedman non-parametric test (see [49] for a comprehensive analysis on this topic) to determine differences across multiple samples. As it is known, Friedman test (as many other non-parametric tests) uses data ranks contrary to absolute data values. Analogous statistical observations were encountered for the resource balancing metric. A synopsis of the results concerning the two metrics is presented in Table 3. In particular, the table shows the average ranking of the algorithms with respect to both metrics. Moreover, the Friedman statistic is reported in the table (next to last row) as well as the corresponding p-value (last row). The latter is called the probability for the differences across the examined algorithms to be due to chance.

Table 3 Average ranking of the algorithms’ performance w.r.t. resource leveling and Cmax

As can be seen from Table 3, (see p-values in the last line of the table), there are highly statistically significant differences between the algorithms over all test instances in regard to both performance metrics. Consequently, we employed a post hoc analysis to examine where the differences occur. In particular, a Wilcoxon signed-rank test for all possible pairs of algorithms was separately performed. Then, due to the multiple comparisons obtained, the Bonferroni adjustment was used on the results obtained from the Wilcoxon tests in order to get statistically valid results. The main idea behind the Bonferroni adjustment is the division of the original significance level (0.05 in our case) by the amount of comparisons we make (45 in our case). Therefore, the new significance level is 0.001.

Taking into consideration j30 test problems the results obtained showed statistically significant differences for all possible pairs of algorithms; Table 4 (first column) portrays the resulting ranking of the 10 algorithms in relation to the two metrics. Note that the notations < algorithm > /LS1 and < algorithm > /LS2 refer, respectively, to the use of the LS1 and LS2 hybrid scheduling schemes within a particular < algorithm > . With respect to the resource balancing index similar observations for statistically significant differences for all possible pairs of algorithms are also concluded in the case of j60 problems (see the corresponding algorithms’ ranking in Table 4(a) second column).

Table 4 Post hoc analysis: ranking of the algorithms performance, w.r.t. (a) resource balancing and (b) makespan index

The results in the case of j60 instances with respect to the resource balancing index also conclude that there are statistically significant differences for all possible pairs of algorithms. The ranking of the algorithms with respect to this metric is as depicted in the second column of Table 4(a). In the cases where more than one algorithm is reported in a cell of Table 4, this means that there are no statistically significant differences between these algorithms. For instance, see the results corresponding to the most difficult class of problems (j120) in the last column of the table. Best algorithms with regard to the leveling metric are PAR/LS1 and SER/LS1; second with similar performance come four algorithms (DE/LS1, GA/LS1, GA/LS2, and PSO/LS1). As far as the makespan is concerned for dataset j120 (see Table 4(b)), the experiments concluded that GA is ranked first while there are no statistically significant differences between DE/LS1, DE/LS2, PAR/LS2, and SER/LS2 algorithms which are ranked second. Considering the leveling metric, SER either with LS2 (case of j30 problems) or with LS1 (in both j60 and j120 problems) is ranked first.

A general observation stemming from the rankings in Table 4 is that that there is no one algorithm superior to all w.r.t. all performance indices. We can however highlight some clear observations from this ranking: first, GA/LS1 appears to be the best algorithm w.r.t. to the makespan for both medium-sized (j60) and large-sized problems (j120). Second, considering the leveling index, SER/LS1 and PAR/LS1 are the best algorithms for both j60 and j120 problem instances. A fact that demonstrates a quite promising direction for further investigation of similar hybridization schemes which combined multiple population-based heuristics into a single algorithm. Third, turning to the effect of LS1 and LS2 leveling procedures on the algorithms’ efficiency, LS1 appears to be more effective than LS2 especially when used on medium- and large-sized problems. As a final comment, the mean processing times needed for arriving at a solution by the examined algorithms are depicted in Fig. 4. As one can see from the figure, the mean solution times are circa 3 s for j30 problems, 6.5 s for j60 problems, and 24 s for j120 problems.

Fig. 4
figure 4

Average CPU times (in seconds) required for arriving at a solution

Finally, we compare PAR/LS2 (one of the best algorithms found in the previous investigation phases) against the MS Project software. The comparative runs were performed on three real construction projects with 40, 70, and 120 jobs, respectively, and demands for nine resource types (these demands are displayed in Table 5).

Table 5 Demands of resources for each different project

The results obtained are presented in Table 6. The entries in the first row of Table 6 (CPM) concern the application of MS Project without resource constraints (i.e., assuming unlimited resources) and no leveling. As can be observed from Table 6, PAR/LS2 outperformed MS Project in regard to both performance indices over all the examined projects. The proposed heuristic showed a remarkable high performance since was found able to generate shorter in length and much smoother schedules than MS Project. The last line of the table depicts the percentage improvement in both makespan and resource leveling values achieved by PAR/LS2 taking as reference point the related values generated by the commercial program. The most encouraging, however, is the running time needed by PAR/LS2 for convergence to a solution. As can be seen, the CPU time needed by PAR/LS2 to converge is comparable to that of MS Project. The latter needed circa 2 s for j40 project, circa 3 s for j70 and 22 s for j120 project. Very near to these values were the corresponding times needed by PAR/LS2 (roughly 6, 7.5, and 20 s, respectively. This investigation is quite promising making the use of PAR/LS2 algorithm achievable in practice.

Table 6 Comparative results against the MS Project software

6 Conclusions

Resource leveling in project scheduling with limited resources was considered. After making a comprehensive analysis for positioning the problem within the existing literature we turned our attention on two research issues: first, to address the problem with a set of novel hybrid solution algorithms and second to investigate their performance on known benchmarks datasets. The new solution algorithms include population-based metaheuristics as high-level hybrids to perform the exploration of the search space and problem-specific greedy heuristics as low-level hybrids to carry out the exploitation of the population best solution. Three famous population-based metaheuristics were investigated, namely genetic algorithms (GAs), differential evolution (DE), and particle swarm optimization (PSO). Two different design issues were taken into account in the development of these hybrids: first, combining a metaheuristic with a local search heuristic and second, combining a metaheuristic with a complementary metaheuristic. The metaheuristics deal with the problem of minimizing the project duration taking into account both the jobs’ dependencies and resource constraints, while local search heuristics deal with the resource leveling problem.

Extensive experiments on benchmarks problems supported by a comprehensive statistical performance analysis showed the efficiency of the developed algorithms. The results obtained prove that all the hybrid schemes are superior to the individual metaheuristics in terms of both solution and time quality. Interestingly, a special hybrid scheme which integrates GA, DE, and PSO into a single hybrid metaheuristic showed a quite promising performance outperforming all the examined hybrids in most of the test cases. Further experiments were also conducted on real-life construction projects to evaluate the developed hybrids. The obtained results were found substantially better than those obtained by existing commercial project management software.

The study of the presented hybrid optimization algorithms is still in its initial stages. Our next step is to apply the hybrid algorithms on multi-objective resource leveling problems. The problem of simultaneously minimizing multiple objectives related to project duration, levels of resource usage, project cost, etc., is a quite challenging problem for future investigation. A real application of this problem is identified in manpower planning where a number of employees have to be assigned to work shifts in order to accomplish a set of jobs. A main concern in such environments is to balance the work between all the employees while kee** the length of the schedule as short as possible; see, e.g., [7, 50, 51]. As a final point, further work will focus on the design of more advanced and relatively “unexplored” hybrid models such as the “island model” and others from the field of parallel metaheuristics (see, e.g., [21, 52,53,54,55]).