The Solver SDK Platform includes Frontline's **hybrid Evolutionary / Classical Solver** to solve nonsmooth optimization problems -- that may include any kind of computation (for example, tablelookups) in the objective or constraints.

#### Solving Nonsmooth Problems

The Evolutionary Solver uses genetic algorithm methods to solve **nonsmooth optimization** problems that cannot be handled effectively by the GRG nonlinear Solver engine, or similar gradient-based methods. And where a "classical" Solver would find only a locally optimal solution, this Solver will often find **globally optimal** -- or near-optimal -- solution. And it also handles integer variables and the "alldifferent" constraint. To use the Evolutionary Solver instead of the GRG nonlinear Solver, you simply set the problem's Engine property to the correct element of the Engines collection:

`problem.Engine = problem.Engines["Evolutionary"];`

If you're programming in a procedural language such as C, you can accomplish the same thing with:

`SolverProbEngineSet (problem, L"Evolutionary");`

But this Solver is **much more than a genetic or evolutionary algorithm** -- it also uses "classical" optimization methods to solve for constraints and improve local solutions. The result is **breakthrough performance**, better than virtually any genetic or evolutionary algorithm alone.

To learn more, click on **Genetic Algorithms and Evolutionary Algorithms - Introduction**. The hybrid Evolutionary/Classical Solver uses **genetic algorithm** methods such as mutation, crossover, selection and constraint repair, but it also uses deterministic, gradient-free **direct search** methods, classical **gradient-based** quasi-Newton methods, and even the **Simplex method** for linear subsets of the constraints. The classical methods sometimes yield rapid local improvement of a trial solution, and they also help to solve for sets of constraints. This enables the hybrid Evolutionary/Classical Solver to handle problems with **many (even hundreds of) constraints**, which are typically beyond the capabilities of genetic and evolutionary algorithms alone.

#### Statistics on Population of Solutions

In the Solver SDK Platform, the **FinalValue** properties of the Variable and Function objects give you detailed information about the single "best solution" returned by the Solver. But the Evolutionary Solver maintains a **population of candidate solutions** -- and you can access statistics on this population at the end of the solution process, through properties of the Statistics object. For example, in C#:

`Statistics VarStat = problem.Variables["MyVars"].Statistics;`

for (i=0; i<n; i++) m_Log.Dump("Mean = " + VarStat.Mean[i]);

If you're programming in a procedural language such as C, you can accomplish the same thing with:

`SolverVarStatistics (problem, L"MyVars", ..., Mean, ...);`

for (i=0; i<n; i++) printf ("Var %d Mean = %g\n", i, Mean[i]);

The results returned by these functions can give you insight into the performance of the Evolutionary Solver as well as the characteristics of your model, and help you decide whether additional runs of the Solver are likely to yield even better solutions.