There are many techniques that can be used to tackle a Computational Design problem. In addition to the genetic algorithm, other examples include:
Solving with pen and paper
Manual guess and check
Set packing or partitioning algorithms
Stochastic (aka Random) Local Search and then filtering results to desired maximum, minimum, or median values.
Linear, Integer, or Quadratic programming
Some of these techniques are quite basic and easy to implement (see Optioneering section), others are far more sophisticated. Choosing the right technique for your application is a tricky question and much more of an art than a science. Often, it comes down to the precise design question you are tackling and your familiarity with a given technique.