Ce cours s'inscrit dans la continuité de Decision Support I (qui n'est pas pour autant un prérequis). Nous commencerons par caractériser ce qui différencie un problème d'optimisation "facile" d'un problème "difficile". Nous verrons ensuite les algorithmes de résolution de trois problèmes faciles: ceux du plus court chemin, d'arbre couvrant et du postier chinois.  Nous étudierons ensuite deux approches générales de résolution de problèmes difficiles: le branch and bound et les heuristiques. Nous approfondirons l'étude de ces dernières et les appliquerons (exercices de programmation) à des problèmes réelles (p. ex. voyageur de commerce, ordonnancement de tâches, ...).