Combinatorial optimization algorithms for the design of codes: a survey