Optimizing is easy, if the problem is small and functions involved are smooth with out local minima or maxima. But what happens when the problem is bigger or not so smooth? In these cases it might be impossible to find the best solution, so we have to be happy about finding "good enough" solution. How do we do it? By using the most metal algorithm in computer science.