## 3 Proposed Methods
### Discrete Cuckoo Search (DCS)  
After a schedule has been generated by the ADP, we further try to improve it using various local search techniques. Although there are many local search techniques [60; 61; 62], in this study we use DCS [26; 50], which systematically switches between different typesof search steps based on certain predefined paths. DCS mimics a cuckoo bird searching for a host nest to lay eggs. The Levy flight [63; 64] is one of the search paths the cuckoo birds follow to explore a viable nest. In the Levy phenomenon, there are many short hops and only rarely long hops. In this study, we set the stability parameter of the stable Levy distribution (\(\alpha=1\)), which corresponds to the Cauchy distribution [65], and consider the following search techniques corresponding to different step lengths as indicated in the algorithm shown in Algorithm 2:  
1. Swap mutation [66]: In this swap mutation, two activities are picked randomly and their order is swapped if possible. Swapping positions is not always possible due to precedence constraints. Nevertheless, we try to mutate as much as possible. For instance, we select activities \(a\) and \(b\) such that \(f_{a}<f_{b}\), then the schedule up to \(a\) being executed remains unchanged. The partial schedule is completed using SGS by delaying \(a\) as far as possible and prioritizing \(b\) as soon as possible.
2. \(k-\) swap mutation: In this search, we perform the swap mutation \(k\) times in a row. In this study, we set \(k=\lfloor 0.15\times J\rfloor\), where \(J\) denotes the project size.
3. Scramble mutation [66]: In this mutation, \(n\) jobs are randomly selected, and their execution times are scrambled based on cost. For instance, we randomly select \(a_{1},\ a_{2},\ldots,\ a_{n}\) such that \(s_{a_{1}}<s_{a_{2}}<\cdots<s_{a_{n}}\), then we take the partial schedule just before the execution of \(a_{1}\) and complete the schedule using SGS by prioritizing the activities which have the minimum costs. In our study, we set \(n=\lfloor 0.15\times J\rfloor\).
4. Inverse mutation [66]: In this mutation, \(n\) jobs are randomly selected, and their execution times are inverted. For example, we randomly select \(b_{1},\ b_{2},\ldots,b_{n}\) such that \(s_{b_{1}}<s_{b_{2}}<\cdots<s_{b_{n}}\), followed by completing the partial schedule containing the original schedule just before \(b_{1}\) is executed. We set \(n\) the same as scramble mutation.  
```
Input: schedule, \(\tau\) (maximum number of steps)
1. Set \(w=(\tau+1)^{-1}\), \(\lambda\in[2,\ \tau]\).
2. Generate \(\tau\) number of step lengths from Levy distribution with \(\alpha=1\) and set it to \(L\).
3. Normalize \(L\) such that value of \(L\) are between 0 and 1.
4. For each \(i\) in \(L\)
5. If\(i\in[0,w]\)
6. Perform swap mutation search.
7. Update the schedule with better NPV.
8. Else If\(i\in[(\lambda-1)\times w,\lambda\times w]\)
9. Perform \(k-\)swapmutation.
10. Update the schedule with better NPV.
11. Else
12. If random (0,1) < 0.5
13. Perform inverse mutation.
14. Update the schedule with better NPV.
15. Else
16. Perform scramble mutation.
17. Update the schedule with better NPV.
18. End If
19. End If
20. End For
21. Output: Updated schedule with NPV
```  
**Algorithm 2** DCS algorithm applying various mutations