*4.2. Computational Improvements*

All the constraints with respect to the ATCo labor conditions must be checked to verify the feasibility of the analyzed solutions in the different iterations of the VNS execution. In Phase 2, this constraint verification is associated with the fitness function, since this phase is aimed at reaching a feasible solution, whereas the Phase 3 search process is carried out within the feasible region, on which ground we have to check the feasibility of the visited solutions.

Verifying constraints is very time consuming. Therefore, we have carried out a comparative analysis to check if this process is faster using regular expressions, which, apart from structuring the constraint modularly could lead to better computation times than implementing such constraints in the code.

Figure 16 shows the mean execution times throughout the iterations in the proposed VNS adaptation using both regular expressions and the code implementation for Instance 4. Contrary to what we had initially thought, the code implementation outperforms the use of regular expressions for higher numbers of iterations. This is due to the complexity of some of the constraints to be checked, requiring lot more than one number of regular expression.

**Figure 16.** Computation improvements.

Additionally, the parallelization of the constraint verification process could improve computation times. Figure 16 shows the different execution times with and without different degrees of parallelization (up to 12 simultaneous threads), again for Instance 4. As expected, parallelization offers faster speeds with respect to sequential execution. We find that there are significant improvements as the number of threads increases, up to four threads.

These results are logical taking into account the computer that we used, which had a quad-core processor. Therefore, it works better when the number of threads used in the execution is also four. When more than four threads are used, they all share the CPU time and sometimes have to wait in a queue to be processed. These CPU inputs and outputs are time consuming and make the process less efficient. However, a CPU with a higher number of cores would take better advantage of more parallelized threads.

Similar results were output for the other three instances.
