# genetic_algorithm_driver.py

# genetic_algorithm_driver.py¶

Driver for a simple genetic algorithm.

This is the Simple Genetic Algorithm implementation based on 2009 AAE550: MDO Lecture notes of Prof. William A. Crossley.

This basic GA algorithm is compartmentalized into the GeneticAlgorithm class so that it can be used in more complicated driver.

The following reference is only for the automatic population sizing: Williams E.A., Crossley W.A. (1998) Empirically-Derived Population Size and Mutation Rate Guidelines for a Genetic Algorithm with Uniform Crossover. In: Chawdhry P.K., Roy R., Pant R.K. (eds) Soft Computing in Engineering Design and Manufacturing. Springer, London.

The following reference is only for the penalty function: Smith, A. E., Coit, D. W. (1995) Penalty functions. In: Handbook of Evolutionary Computation, 97(1).

The following reference is only for weighted sum multi-objective optimization: Sobieszczanski-Sobieski, J., Morris, A. J., van Tooren, M. J. L. (2015) Multidisciplinary Design Optimization Supported by Knowledge Based Engineering. John Wiley & Sons, Ltd.

class`openmdao.drivers.genetic_algorithm_driver.`

`GeneticAlgorithm`

(objfun,comm=None,model_mpi=None)[source]Bases:

`object`

Simple Genetic Algorithm.

This is the Simple Genetic Algorithm implementation based on 2009 AAE550: MDO Lecture notes of Prof. William A. Crossley. It can be used standalone or as part of the OpenMDAO Driver.

- Parameters

objfunfunctionObjective callback function.

commMPI communicator or NoneThe MPI communicator that will be used objective evaluation for each generation.

model_mpiNone or tupleIf the model in objfun is also parallel, then this will contain a tuple with the the total number of population points to evaluate concurrently, and the color of the point to evaluate on this rank.

- Attributes

commMPI communicator or NoneThe MPI communicator that will be used objective evaluation for each generation.

eliteboolElitism flag.

gray_codeboolGray code binary representation flag.

cross_bitsboolCrossover swaps bits instead of tails flag. Swapping bits is similar to mutation, so when used Pc should be increased and Pm reduced.

lchromintChromosome length.

model_mpiNone or tupleIf the model in objfun is also parallel, then this will contain a tuple with the the total number of population points to evaluate concurrently, and the color of the point to evaluate on this rank.

nobjintNumber of objectives.

npopintPopulation size.

objfunfunctionObjective function callback.

`__init__`

(objfun,comm=None,model_mpi=None)[source]Initialize genetic algorithm object.

`crossover`

(old_gen,Pc)[source]Apply crossover to the current generation.

Crossover swaps tails (k-point crossover) of two adjacent genes.

- Parameters

old_genndarrayPoints in current generation.

PcfloatProbability of crossover.

- Returns

- ndarray
Current generation with crossovers applied.

`decode`

(gen,vlb,vub,bits)[source]Decode from binary array to real value array.

- Parameters

genndarrayPopulation of points, encoded.

vlbndarrayLower bound array.

vubndarrayUpper bound array.

bitsndarray(dtype=np.int)Number of bits for decoding.

- Returns

- ndarray
Decoded design variable values.

`encode`

(x,vlb,vub,bits)[source]Encode array of real values to array of binary arrays.

The array of arrays represents a single population member.

- Parameters

xndarrayDesign variable values.

vlbndarrayLower bound array.

vubndarrayUpper bound array.

bitsndarray(dtype=np.int)Number of bits for decoding.

- Returns

- ndarray
Single population member, encoded.

`eval_pareto`

(x,obj,x_nd,obj_nd)[source]Produce a set of non dominated designs.

- Parameters

xndarrayDesign points from new generation.

objndarrayObjective values from new generation.

x_ndndarrayNon dominated design points from previous pareto evaluation.

obj_ndndarrayNon dominated objective values from previous pareto evaluation.

- Returns

- ndarray
Nondominated design points.

- ndarray
Objective at nondominated design points.

`execute_ga`

(x0,vlb,vub,vob,bits,pop_size,max_gen,random_state,Pm=None,Pc=0.5)[source]Perform the genetic algorithm.

- Parameters

x0ndarrayInitial design values.

vlbndarrayLower bounds array.

vubndarrayUpper bounds array. This includes over-allocation so that every point falls on an integer value.

vobndarrayOuter bounds array. This is purely for bounds check.

bitsndarrayNumber of bits to encode the design space for each element of the design vector.

pop_sizeintNumber of points in the population.

max_genintNumber of generations to run the GA.

random_statenp.random.RandomState, intRandom state (or seed-number) which controls the seed and random draws.

Pmfloat or NoneMutation rate.

PcfloatCrossover rate.

- Returns

- ndarray
Best design point.

- float
Objective value at best design point.

- int
Number of successful function evaluations.

static`from_gray`

(g)[source]Convert a Gray coded binary array to normal binary coding.

The input and output arrays represent a single population member.

- Parameters

gbinary arrayGray coded binary array, e.g. np.array([0, 0, 1, 1]).

- Returns

- ndarray
Binary array using normal coding, e.g. np.array([0, 0, 1, 0]).

`mutate`

(current_gen,Pm)[source]Apply mutations to the current generation.

A mutation flips the state of the gene from 0 to 1 or 1 to 0.

- Parameters

current_genndarrayPoints in current generation.

PmfloatProbability of mutation.

- Returns

- ndarray
Current generation with mutations applied.

`shuffle`

(old_gen)[source]Shuffle (reorder) the points in the population.

Used in tournament selection.

- Parameters

old_genndarrayOld population.

- Returns

- ndarray
New shuffled population.

- ndarray(dtype=np.int)
Index array that maps the shuffle from old to new.

static`to_gray`

(g)[source]Convert a binary array representing a single population member to Gray code.

- Parameters

gbinary arrayNormal binary array, e.g. np.array([0, 0, 1, 0]).

- Returns

- ndarray
Binary array using Gray code, e.g. np.array([0, 0, 1, 1]).

`tournament`

(old_gen,fitness)[source]Apply tournament selection and keep the best points.

- Parameters

old_genndarrayPoints in current generation.

fitnessndarrayObjective value of each point.

- Returns

- ndarray
New generation with best points.

`tournament_multi_obj`

(old_gen,obj_val)[source]Apply tournament selection and keep the best points.

This method is used if there are multiple objectives and the non-dominated set is being kept.

- Parameters

old_genndarrayPoints in current generation.

obj_valndarrayObjective value of each point.

- Returns

- ndarray
New generation with best points.

- ndarray
Corresponding objective values.

class`openmdao.drivers.genetic_algorithm_driver.`

`SimpleGADriver`

(**kwargs)[source]Bases:

`openmdao.core.driver.Driver`

Driver for a simple genetic algorithm.

- Parameters

**kwargsdict of keyword argumentsKeyword arguments that will be mapped into the Driver options.

- Attributes

_concurrent_pop_sizeintNumber of points to run concurrently when model is a parallel one.

_concurrent_colorintColor of current rank when running a parallel model.

_desvar_idxdictKeeps track of the indices for each desvar, since GeneticAlgorithm sees an array of design variables.

_ga<GeneticAlgorithm>Main genetic algorithm lies here.

_randomstatenp.random.RandomState, intRandom state (or seed-number) which controls the seed and random draws.

`__init__`

(**kwargs)[source]Initialize the SimpleGADriver driver.

`add_recorder`

(recorder)Add a recorder to the driver.

- Parameters

recorderCaseRecorderA recorder instance.

`cleanup`

()Clean up resources prior to exit.

`declare_coloring`

(num_full_jacs=3,tol=1e-25,orders=None,perturb_size=1e-09,min_improve_pct=5.0,show_summary=True,show_sparsity=False)Set options for total deriv coloring.

- Parameters

num_full_jacsintNumber of times to repeat partial jacobian computation when computing sparsity.

tolfloatTolerance used to determine if an array entry is nonzero during sparsity determination.

ordersintNumber of orders above and below the tolerance to check during the tolerance sweep.

perturb_sizefloatSize of input/output perturbation during generation of sparsity.

min_improve_pctfloatIf coloring does not improve (decrease) the number of solves more than the given percentage, coloring will not be used.

show_summaryboolIf True, display summary information after generating coloring.

show_sparsityboolIf True, display sparsity with coloring info after generating coloring.

`get_constraint_values`

(ctype='all',lintype='all',driver_scaling=True)Return constraint values.

- Parameters

ctypestrDefault is ‘all’. Optionally return just the inequality constraints with ‘ineq’ or the equality constraints with ‘eq’.

lintypestrDefault is ‘all’. Optionally return just the linear constraints with ‘linear’ or the nonlinear constraints with ‘nonlinear’.

driver_scalingboolWhen True, return values that are scaled according to either the adder and scaler or the ref and ref0 values that were specified when add_design_var, add_objective, and add_constraint were called on the model. Default is True.

- Returns

- dict
Dictionary containing values of each constraint.

`get_design_var_values`

(get_remote=True,driver_scaling=True)Return the design variable values.

- Parameters

get_remotebool or NoneIf True, retrieve the value even if it is on a remote process. Note that if the variable is remote on ANY process, this function must be called on EVERY process in the Problem’s MPI communicator. If False, only retrieve the value if it is on the current process, or only the part of the value that’s on the current process for a distributed variable.

driver_scalingboolWhen True, return values that are scaled according to either the adder and scaler or the ref and ref0 values that were specified when add_design_var, add_objective, and add_constraint were called on the model. Default is True.

- Returns

- dict
Dictionary containing values of each design variable.

`get_objective_values`

(driver_scaling=True)Return objective values.

- Parameters

driver_scalingboolWhen True, return values that are scaled according to either the adder and scaler or the ref and ref0 values that were specified when add_design_var, add_objective, and add_constraint were called on the model. Default is True.

- Returns

- dict
Dictionary containing values of each objective.

property`msginfo`

Return info to prepend to messages.

- Returns

- str
Info to prepend to messages.

`objective_callback`

(x,icase)[source]Evaluate problem objective at the requested point.

In case of multi-objective optimization, a simple weighted sum method is used:

\[f = (\sum_{k=1}^{N_f} w_k \cdot f_k)^a\]where \(N_f\) is the number of objectives and \(a>0\) is an exponential weight. Choosing \(a=1\) is equivalent to the conventional weighted sum method.

The weights given in the options are normalized, so:

\[\sum_{k=1}^{N_f} w_k = 1\]If one of the objectives \(f_k\) is not a scalar, its elements will have the same weights, and it will be normed with length of the vector.

Takes into account constraints with a penalty function.

All constraints are converted to the form of \(g_i(x) \leq 0\) for inequality constraints and \(h_i(x) = 0\) for equality constraints. The constraint vector for inequality constraints is the following:

\[ \begin{align}\begin{aligned}g = [g_1, g_2 \dots g_N], g_i \in R^{N_{g_i}}\\h = [h_1, h_2 \dots h_N], h_i \in R^{N_{h_i}}\end{aligned}\end{align} \]The number of all constraints:

\[N_g = \sum_{i=1}^N N_{g_i}, N_h = \sum_{i=1}^N N_{h_i}\]The fitness function is constructed with the penalty parameter \(p\) and the exponent \(\kappa\):

\[\Phi(x) = f(x) + p \cdot \sum_{k=1}^{N^g}(\delta_k \cdot g_k)^{\kappa} + p \cdot \sum_{k=1}^{N^h}|h_k|^{\kappa}\]where \(\delta_k = 0\) if \(g_k\) is satisfied, 1 otherwise

Note

The values of \(\kappa\) and \(p\) can be defined as driver options.

- Parameters

xndarrayValue of design variables.

icaseintCase number, used for identification when run in parallel.

- Returns

- float
Objective value.

- bool
Success flag, True if successful.

- int
Case number, used for identification when run in parallel.

`record_iteration`

()Record an iteration of the current Driver.

`run`

()[source]Execute the genetic algorithm.

- Returns

- bool
Failure flag; True if failed to converge, False is successful.

`scaling_report`

(outfile='driver_scaling_report.html',title=None,show_browser=True,jac=True)Generate a self-contained html file containing a detailed connection viewer.

Optionally pops up a web browser to view the file.

- Parameters

outfilestr, optionalThe name of the output html file. Defaults to ‘driver_scaling_report.html’.

titlestr, optionalSets the title of the web page.

show_browserbool, optionalIf True, pop up a browser to view the generated html file. Defaults to True.

jacboolIf True, show jacobian information.

- Returns

- dict
Data used to create html file.

`set_design_var`

(name,value,set_remote=True)Set the value of a design variable.

- Parameters

namestrGlobal pathname of the design variable.

valuefloat or ndarrayValue for the design variable.

set_remoteboolIf True, set the global value of the variable (value must be of the global size). If False, set the local value of the variable (value must be of the local size).

`use_fixed_coloring`

(coloring=<object object>)Tell the driver to use a precomputed coloring.

- Parameters

coloringstrA coloring filename. If no arg is passed, filename will be determined automatically.