## 3 Resolution Approaches
### Approximate Approaches
#### 3.2.1 Greedy Constructive Heuristic
For all needed resource types (\(a_{jr}=1\)), we estimate their available time and select the largest value, since they all need to be available throughout the duration of the job. For each resource type \(r\), we look at all units of this resource (\(q\in 1\dots l_{r}\)) and select the one that would be available first using its complete date \(FTR_{rq}\) and adding a transport time if this resource was last used on a different machine than \(i\). Estimating whether a transport time is required is carried out using \(trtr^{\prime}_{irq}\). If the last task using resource \(q\) of type \(r\) is performed on a different machine than \(i\), then a transport time is required; otherwise, this time is set to \(0\). We also record the resource units that were selected when constructing \(s^{\prime}\) using \(q^{\prime}\) (line 6 of Algorithm 1):  
\[q^{\prime}_{ir}=\operatorname*{arg\,min}_{q\in 1\dots l_{r}}\left(FTR_{rq}+ trtr^{\prime}_{irq}\right)\]  
Using \(s^{\prime}\) and \(q^{\prime}\), we then evaluate each machine \(i\) using a second criterion (line 7 of Algorithm 1, called by function \(ComputeCriterionB(s^{\prime},q^{\prime})\)), which is given as:  
\[p_{j}\cdot fc_{j}\cdot trcj_{ij}\cdot rcm_{i}\cdot tj_{j}\cdot ircm_{i}-\sum_ {r=1}^{k}a_{jr}\cdot\left(rcr_{r}\cdot t_{ij}+ircr_{ir}\right)\cdot tc_{j} \cdot\max(0,s^{\prime}_{i}+t_{ij}-d_{j}),\]  
where  
\[ircm_{i}= \begin{cases}rcm_{i}\cdot(s^{\prime}_{i}-FTM_{i})&\text{, if }FTM_{i}>0\\ 0&\text{, otherwise}\end{cases} \]  
\[ircr_{ir}= \begin{cases}rcr_{r}\cdot(s^{\prime}_{i}-FTR_{rq^{\prime}_{ir}})& \text{, if }FTR_{rq^{\prime}_{ir}}>0\\ 0&\text{, otherwise}\end{cases} \]  
This criterion computes the net gain from selecting job \(j\) to be processed on machine \(i\) at time \(s^{\prime}_{i}\) using its required resources \(q^{\prime}_{ir},\forall r\in 1\dots k\). This criterion includes the selling price of the job (\(p_{j}\)), its fixed costs (\(fc_{j}\)), the cost of transporting the job to the machine (\(trcj_{ij}\)), the renting cost of the machine while executing the job (\(rcm_{i}\cdot t_{ij}\)), the idle time of renting the machine if it was used to process other jobs (\(ircm_{i}\)), the renting cost of the required resources during the job processing but also during idle times for resources that have been used to process other jobs, and, finally, the tardiness costs. Estimating the idle cost of machine \(i\) is carried out by checking whether \(FTM_{i}\) is greater than \(0\), and, in this case, \(ircm_{i}\) is equal to the cost of renting the machine per unit of time multiplied with the time between its latest complete date (\(FTM_{i}\)) and the estimated start date of job \(j\) (\(s^{\prime}_{i}\)). Estimating the idle cost of a resource \(r\) (\(ircr_{ir}\)) is carried out in a similar way, considering the resource that should be selected in order to process job \(j\). Using the second criterion, we sequence the machines in decreasing order (line 8 of Algorithm 1). We then consider each machine from this list and select the first that does not lead the job to overshoot its deadline nor lead to a loss that is worse than if the job were not processed at all (line 10 of Algorithm 1). Once a machine fulfilling these conditions is found, we update the solution (line 11 of Algorithm 1) and jump to the next job (line 12 of Algorithm 1). If there is no machine that can fulfil these conditions, then the job is not processed.