I. Introduction
The word Metaheuristic (from ancient Greek meta = “be-yond, higher-level” and heuriskein = “to find”) defines a class of search algorithms able to find near-optimal solutions for hard optimization problems by working on an abstract plane [41]. While ordinary heuristics are explicitly designed to efficiently tackle a specific problem, by exploiting a profound knowledge about it, metaheuristic algorithms implement a more general optimization schema, flexible and easily adaptable to multiple different problems, which usually entails a reduced design and implementation time. The main shortcoming of this class of methods is the relative inefficiency with respect to ad hoc solutions. For these reasons, metaheuristics are typically applied in scenarios where no satisfactory heuristic is known.