A top-level general strategy which guides other heuristics to search for feasible solutions in domains where the task is hard. Metaheuristics have been most generally applied to problems classified as NP-Hard or NP-Complete by the theory of computational complexity. However, metaheuristics would also be applied to other combinatorial optimisation problems for which it is known that a polynomial-time solution exists but is not practical. Examples of metaheuristics are Tabu Search, simulated annealing, genetic algorithms and memetic algorithms.