Opytimizer: A Nature-Inspired Python Optimizer

2019·Arxiv

ABSTRACT

ABSTRACT

Optimization aims at selecting a feasible set of parameters in an attempt to solve a particular problem, being applied in a wide range of applications, such as operations research, machine learning fine-tuning, and control engineering, among others. Nevertheless, traditional iterative optimization methods use the evaluation of gradients and Hessians to find their solutions, not being practical due to their computational burden and when working with non-convex functions. Recent biologicalinspired methods, known as meta-heuristics, have arisen in an attempt to fulfill these problems. Even though they do not guarantee to find optimal solutions, they usually find a suitable solution. In this paper, we proposed a Python-based meta-heuristic optimization framework denoted as Opytimizer. Several methods and classes are implemented to provide a user-friendly workspace among diverse meta-heuristics, ranging from evolutionary- to swarm-based techniques.

Keywords Python Optimization Meta-Heuristics

1 Introduction

Mathematics is a formal basis for the representation and solution to the most diverse tasks, being applied throughout several fields of interest. Economy, Geophysics, Electrical Engineering, Mechanical Engineering, Civil Engineering, among others, are some examples of areas that use mathematical concepts in order to solve their challenges. The necessity of finding a suitable set of information (parameters) to solve a specific application fostered the study of mathematical programming, commonly known as optimization. A classic optimization task is the Traveling Salesman problem [1], which consists of visiting m locations with a minimum cost path1. Additionally, it is possible to create analogous situations with daily face-offs, i.e., a logistics company needs to find minimum-cost paths to transport their cargos, thus minimizing their expenses. Furthermore, there are other diverse optimization problems that one can face, such as industrial components modeling [2], operations research [3], market economic models [4], molecular modeling [5], among others.

An optimization problem consists in maximizing or minimizing a function through a systematic choice of possible values to the problem. In other words, the optimization procedure finds the most suitable values of a fitness function, given a pre-defined domain. Equation 1 describes the minimum2 generic optimization model without constraints.

where f(x) stands for the fitness function, while . The optimization of this function aims at finding the most suitable set of values for x, denoted as , where . Nevertheless, when dealing with more complex fitness functions, several minima or maxima points (local optima) appears and difficult the search for the optimal points. Figure 1 illustrates an example of this situation.

Figure 1: Example of a mathematical function with several local optimal points.

Traditional optimization methods [6], such as the iterative methods, e.g., Newton method, Quasi-Newton method, Gradient Descent, and Interpolation methods, use the evaluation of gradients and Hessians, being unfeasible to several applications due to their computational burden. In the past decades, an exciting proposition denoted as meta-heuristic has been employed to solve several optimization problems. A meta-heuristic technique consists of a high-level procedure projected to generate or select a heuristic, which provides a sufficiently feasible solution to the optimization problem. Moreover, a meta-heuristic is a procedure that combines the concepts of exploration, used to perform searches throughout the search space, and exploitation, which is used to refine a promising solution based on its neighborhood. Essentially, meta-heuristic techniques [7] are strategies that guide the process of searching for quasi-optimum solutions. They are mostly constituted of simple local searches and complex learning procedures, usually inspired by biological behaviors. Additionally, they are non-domain specific and have mechanisms to avoid being trapped in local optima points.

In this paper, we propose a nature-inspired open-source Python optimization library focused on minimization problems, called Opytimizer3. Mainly, the idea is to provide a user-friendly environment to work with function optimization and meta-heuristic techniques by creating high-level methods and classes, removing from the user the burden of programming at a mathematical level. The main contributions of this paper are threefold: (i) to introduce a meta-heuristic optimization library in the Python language, (ii) to provide an easy-to-go implementation, and several integrations with other frameworks, and (iii) to fill the lack of research regarding meta-heuristic optimizations.

The remainder of this paper is organized as follows. Section 2 provides a literature review and related works concerning meta-heuristic optimization frameworks. Section 3 introduces a theoretical background concerning agents, search spaces and meta-heuristics. Section 4 presents concepts of the Opytimizer library, such as its architecture, and an overview of the included packages. Section 5 provides more deeply concepts about the library, such as how to install, how to read its documentation, some pre-included examples, and how to run unitary tests. Furthermore, Section 6 provides basic information about the usage of the library, i.e., how to run pre-defined examples, how to integrate with other frameworks, and how to model a new experiment. Finally, Section 7 states conclusions and future works.

2 Literature Review and Related Works

Meta-heuristics algorithms have arisen as a new approach to tackle optimization problems. They offer simple implementations along with complex search mechanisms that guarantee to find a solution and avoid being trapped in local optimums. It is possible to find their usage in a wide range of applications, such as machine learning fine-tuning [8, 9], engineering [10, 11], medical science [12, 13]. For instance, Yang et al. [14] proposed a new algorithm called Cuckoo Search in an attempt to solve engineering design optimization problems, achieving better results than the traditional Particle Swarm Optimization. Roos et al. [15] used concepts of evolutionary populations to interplay between risk-taking and sequentially of choices, creating more robust state-dependent models. Furthermore, Papa et al. [16] proposed a hyperparameter selection of Restricted Boltzmann Machines through a Harmony Search algorithm, achieving better results than empirically setting the hyperparameters. Moreover, Papa et al. [17] extended the previous approach in the context of Deep Belief Networks. Recently, Reyes et al. [18] proposed a multi-objective optimization strategy to perform batch-mode active learning based on an evolutionary algorithm, which turned out to be a more effective approach.

Even though numerous works in the literature use meta-heuristic techniques as an optimization algorithm, the literature still lacks works regarding meta-heuristic frameworks or open-sourced libraries. There are several implementations among the internet, such as EvoloPy4 and MetaheuristicAlgorithmsPython5, but they only provide straightforward implementations of the algorithms, not packing them into libraries or packages, nor providing the necessary tools for users to design new experiments or integrate with other frameworks. Additionally, they lack documentation and test suites, which helps users in understanding the code and implementing new methods and classes.

On the other hand, Inspyred6 tries to provide a more robust library-look, even though it lacks documentation, test suites, maintenance, and several state-of-the-art meta-heuristic algorithms. Moreover, an outstanding library is the PonyGE2 [19], which deals purely with Grammatical Evolution and provides a fast-prototyping environment for students and researches. Furthermore, one of the best packages that one can find is DEAP [20], which is currently a state-of-the-art package concerning Evolutionary Computation. Notwithstanding, one might find it challenging to work with and integrate with other frameworks, such as Tensorflow or PyTorch. Additionally, apart from evolutionary-based algorithms, DEAP lacks implementing hypercomplex representations, some swarm-based algorithms, and even the newest trending meta-heuristics, such as Bat Algorithm, Cuckoo Search, and Firefly Algorithm.

Another state-of-the-art library concerning meta-heuristic optimization techniques is the LibOPT [21]. Although it provides a wide range of algorithms and benchmarking functions, the library is implemented in C language, making it extremely difficult to integrate with other frameworks or packages, primarily because the machine learning community is turning their attention to the Python language. Additionally, there is no documentation nor test suites to help users throughout their usage experience.

Therefore, Opytimizer attempts to fill the gaps concerning meta-heuristic optimization frameworks. It is purely implemented in Python, only using Numpy and Matplotlib as its dependencies. It provides extensive documentation, test suites, several pre-loaded examples, and even integrations with other well-known frameworks. Moreover, every line of code is commented, there are continuous integration tests for every new push to its repository, an amazing readme which explains on how to get started with the library and full-time maintenance and support.

3 Theoretical Foundation

Before diving into Opytimizer’s library, we present a theoretical foundation to assist one in understanding how its basic structures work. In the next subsections, we mathematically explain how agents, search spaces, and meta-heuristics works, as well as, we provide pseudo-algorithms to contextualize their mechanisms.

3.1 Agents

An agent is the first entity in the meta-heuristic optimization workflow, providing valuable knowledge about the optimization problem itself. In other words, an agent is an individual (particle) responsible for traversing a search space in an attempt to find a feasible solution to the optimization task. Additionally, one can find several names for agents in distinct meta-heuristic techniques, such as bats for the Bat Algorithm, nests for the Cuckoo Search, fireflies for the Firefly Algorithm, and particles for the Particle Swarm Optimization, among others.

Mathematically speaking, let a be an agent, composed of two properties: is a real-valued position tensor of size equal to number of decision variables number of dimensions (e.g., complex, quaternion, octonion), and f, which is the agent’s fitness value and initially instantiated as the maximum real value possible.

3.2 Search Spaces

A search space composes the search structure itself, holding all possible values that can be applied to the fitness function. Essentially, a search space is formed by several agents, which are responsible for traversing and finding a feasible solution to a particular problem. Moreover, the search space encodes the lower and upper bounds for each decision variable depicted in the problem, obligating the agents to search on a fixed window. Furthermore, the search space encodes the number of search iterations that will be performed, as well as a pointer to the current best agent (lowest fitness value in minimization tasks).

Let s be a search space, composed of five properties: A, which represents a vector of m agents that composes the space, , which is the pointer to the best agent, T, which is the number of search iterations, represents the lower and upper bounds for each decision variable, respectively.

3.3 Meta-Heuristics

As aforementioned, meta-heuristics are high-level search strategies that combine the power of exploration and exploitation. In other words, the meta-heuristic is the searching algorithm itself, mostly composed of simple local searches and complex learning procedures that attempts to find the most suitable solution for a particular problem. Each meta-heuristic has its searching strategy and is usually inspired by a biological phenomenon, such as the bats’ behavior in the Bat Algorithm, the fireflies’ behavior in the Firefly Algorithm, the water cycle in the Water Cycle Algorithm, and the flowers’ pollination process in the Flower Pollination Algorithm, among others. Algorithm 1 depicts a pseudo-algorithm of how a meta-heuristic works7.

Input: Vector of agents A, number of maximum iterations T, lower and upper bounds Output: A solution tensor holding the most feasible positions for the task’s fitness function.

4 Opytimizer

Opytimizer is divided into several packages, each one being responsible for particular classes and methods across the library. Figure 2 illustrates an overview of Opytimizer’s architecture, while the next sections provide within more details each one of its packages.

4.1 Core

The core package works as the parent of all sub-classes that Opytimizer provides. It serves as a building block for defining more specific structures that one may need when designing a meta-heuristic algorithm or a new search strategy. As depicted in Figure 3, five modules bundles into the core package, as follows:

• Agent: An agent is a basic class that represents the individual of an optimization task, constituted of a fitness value and its position on the search space. It is a generic nomenclature as each algorithm might have an individual agent, such as bats, fireflies, particles, among others;

• Function: The function is a wrapper to the objective function that will be evaluated throughout the optimization task, e.g., benchmarking function, a classifier’s accuracy over a validation set, or the reconstruction error of a machine learning algorithm;

Figure 2: Flowchart of Opytimizer’s architecture.

• Node: When working with tree-based evolutionary algorithms, such as Genetic Programming, we need an additional class to represent the tree itself. The Node class arises to tackle this issue by providing an easy-implementation of a tree structure;

• Optimizer: In Opytimizer, every meta-heuristic technique inherits from the Optimizer class. Essentially, it is a wrapper that provides shared properties and methods among all meta-heuristic algorithms;

• Space: Agents or Nodes needs to be bundled into a search space. Nevertheless, as each training strategy might need a different search space, we offer a building block to implement different possibilities. The Space class provides properties and methods that encode and initialize agents or nodes throughout the space.

Figure 3: Flowchart of Opytimizer’s core package.

4.2 Functions

When designing an optimization task, one might need more complex implementations than single-objective functions. The functions package provides classes and methods to compose high-level abstract functions strategies, such as multi-objective and many-objective ones. Currently, Opytimizer offers only an additional multi-objective weight-based strategy, which is illustrated by Figure 4 and described as follows:

• WeightedFunction: When designing a multi-objective task, one can use the WeightedFunction class and plug several objective functions and weigh them into a single objective.

Figure 4: Flowchart of Opytimizer’s function package.

4.3 Math

In order to ease the user’s life, Opytimizer offers a mathematical package, containing low-level math implementations, illustrated by Figure 5. Essentially, some repetitive methods that are used throughout the library are defined in this package, as follows:

• Benchmark: Benchmarking functions are mathematical functions that help to validate optimization algorithms. This module is composed of several functions with particular traits, such as modality, basins, valleys, separability, and dimensionality;

• Distribution: Some algorithms might need particular distributions throughout their implementation. This module tackles this issue by providing methods to generate distinct mathematical distributions, such as Bernoulli’s or Lévy’s;

• General: Common-use methods that do not have a particular category are defined in this module;

• Hypercomplex: When dealing with hypercomplex numbers, such as quaternions or octonions, one might need some additional methods to interpret them into a real-valued space;

• Random: Lastly, several algorithms use random numbers for sampling or defining some heuristics. This module is capable of generating uniform and Gaussian random numbers.

Figure 5: Flowchart of Opytimizer’s math package.

4.4 Optimizers

The Optimizer package is the heart of the heuristics, where it is possible to find a large number of meta-heuristics implementations, which are depicted by Figure 6. Additionally, we provide their full names, acronyms, and references as follows:

• ABC: Artificial Bee Colony [22];

• AIWPSO: Adaptive Inertia Weight Particle Swarm Optimization [23];

• BA: Bat Algorithm [24];

• BHA: Black Hole Algorithm [25];

• CS: Cuckoo Search [14];

• FA: Firefly Algorithm [26];

• FPA: Flower Pollination Algorithm [27];

• GP: Genetic Programming [28];

• HS: Harmony Search [29];

• IHS: Improved Harmony Search [30];

• PSO: Particle Swarm Optimization [31];

• WCA: Water Cycle Algorithm [32].

Figure 6: Flowchart of Opytimizer’s optimizer package.

4.5 Space

One can see the space as the place that agents update their positions and evaluate a fitness function. Furthermore, each strategy may consider a different type of space, exhibited by Figure 7. Thus, we are glad to support diverse space implementations, such as follows:

• HyperSpace: When using a hypercomplex representation, it is important to define some constraints and specificities that are related to this kind of strategy, such as mapping agents’ components between 0 and 1 and further spanning them into real-valued numbers;

• SearchSpace: The traditional search space representation, where agents are mapped between lower and upper bounds and perform their search in a real-valued space;

• TreeSpace: When using tree-based evolutionary algorithms, one needs to employ the TreeSpace as it holds properties and methods related to producing trees, as well as searching and evaluating them.

Figure 7: Flowchart of Opytimizer’s space package.

4.6 Utils

A utility package provides common tools that are shared across the application, as it is better only to implement once and re-use it across other modules as shown in Figure 8. This package provides the following modules:

• Constants: Constants are fixed numbers that do not change throughout the implementation. For the sake of easiness, they are implemented in the same module;

• Exception: In order to help users when designing their experiments, the exception module provides common errors and exceptions that might occur when invalid settings are used in Opytimizer;

• History: After running an optimization task, one might need some additional information about the agents or the search space. The History module implements a history-based object that saves everything that one might need, such as agents’ positioning and their fitness;

• Logging: Every method or action that is invoked in the library are logged into a log file. One can follow the log in order to find potential mistakes or even important warnings or success messages throughout the optimization task.

Figure 8: Flowchart of Opytimizer’s utils package.

4.7 Visualization

Finally, the last package provides every visual-related method, where one can check a specific variable convergence, the fitness function convergence, and more. Currently, the visualization package implements the following module, which is also portrayed in Figure 9:

• Convergence: The convergence module provides a plotting function that helps users visualize their agents’ positioning or fitness throughout the optimization task. Figures 10 and 11 illustrates some output plots that users can build.

Figure 9: Flowchart of Opytimizer’s visualization package.

Figure 10: Positions’ convergence plot using the visualization package.

5 Library Usage

In this section, we describe more deeply on how to work with Opytimizer. Fundamentally, one can read its documentation to learn more about the library or make use of the already-included examples. Moreover, we also provide methods to perform unitary tests and check if everything is working as expected.

5.1 Installation

We believe that everything has to be easy. Not tricky or daunting, Opytimizer will be the one-to-go package that you will need, from the very first installation to the daily-tasks implementing needs. If you may just run the following under your most preferred Python environment (raw, conda, virtualenv, whatever):

Alternatively, if you prefer to install the bleeding-edge version, please clone this repository and install it:

Note that there is no additional requirement to use Opytimizer. As its unique dependencies are the Numpy and Matplotlib packages, it can be installed throughout every computer, regardless of the machine’s operating system.

Figure 11: Fitness’ convergence plot using the visualization package.

5.2 Documentation

One might have an interest in learning the concepts and strategies behind Opytimizer more deeply. Therefore, we provide a fully documented reference8 for everything that the library offers. From basic classes to more sophisticated methods, Opytimizer’s documentation is the ideal source to understand how the library was built or even help us with further contributions.

5.3 Classes and Methods Examples

Additionally, in the same examples/ folder, we provide examples for all packages that the library implements, such as:

• Core: create_agent.py, create_function.py, create_node.py;

• Functions: create_weighted_function.py;

• Math: benchmarking_functions.py, calculate_hypercomplex_numbers.py, general_functions.py, generate_distributions.py, generate_random_numbers.py;

• Optimizers: create_abc.py, create_aiwpso.py, create_ba.py, create_bha.py, create_cs.py, create_fa.py, create_fpa.py, create_gp.py, create_hs.py, create_ihs.py, create_pso.py, create_wca.py;

• Spaces: create_hyper_space.py, create_search_space.py, create_tree_space.py;

• Utils: load_history.py, load_mnist.py;

• Visualization: convergence_plots.py.

Each example is composed of high-level definitions of how to use predefined classes and methods. One can perceive that it provides a basic explanation on how to instantiate each class and which parameters should be used or not to accomplish their requirements.

5.4 Test Suites

Opytimizer is packed with tests to provide a more in-depth analysis of our code. Essentially, the idea behind any test is to check whether everything is working as expected or not. There are two main methods that we provide in order to run the tests:

• PyTest: The first method that we offer is running solo the command pytest tests/, as depicted by Figure 12. It will perform all the implemented tests and return an output declaring whether they passed or failed;

• Coverage: An interesting addition to PyTest is the coverage module. Despite offering the same outputs from PyTest, it will also offer a report that documents how much the tests cover the code, as illustrated by Figure 13. Its usage is straightforward: coverage run -m pytest tests/ and coverage report -m.

Figure 12: Example of running tests with PyTest.

6 Applications

In this section, we describe within more details on how to run an application with Opytimizer. There are four pre-loaded applications included with the library, as well as, several integrations with well-known frameworks, such as PyTorch and Scikit-Learn.

6.1 Getting Started

After installing the Opytimizer library, it is straightforward to use its packages. Four basic examples show the main features which the library provides. One can refer to the examples/applications folder and check the following files:

• Single objective optimization: single_objective_optimization.py;

• Multi-objective optimization: multi_objective_optimization.py;

• Hyperspace optimization: hyper_space_optimization.py;

Figure 13: Example of code coverage tests with Coverage.

Each example is composed of a minimum set of variables to compose the search space, a mathematical function to be optimized9, and an optimizer, which is the meta-heuristic technique used to perform the optimization process. Furthermore, they are bundled to an Opytimizer class, which holds all the vital information about the optimization task. Finally, the task is started, and when it finishes, it returns a history object which encodes valuable data about the optimization procedure. Figure 14 illustrates the output logs generated by an Opytimizer task.

The difference between single and multi-objective optimization consists of the number of functions to be optimized. While single optimization attempts to optimize one objective function, the multi optimization can employ more than one objective function. As for now, we only offer a weighted-sum approach to compose the multi-objective architecture, i.e., each objective function weighs towards the final objective function.

Additionally, the hyperspace optimization encodes agents in a hyperspace-based search space. Instead of using only a one-dimensional real-valued space, the hyperspace approach uses more dimensions throughout the optimization process. Commonly, there are three main hyperspaces that the literature proposes: (i) complex (2-dimensions), (ii) quaternions (4-dimensions), and (iii) octonions (8-dimensions).

Finally, Genetic Programming optimization is a tree-based evolutionary algorithm, which uses an entirely different structure than the previous examples. The idea is to provide a set of terminal and function (mathematical operators) nodes in order to compose the trees. A possible solution is harvested by traversing the tree and combining its node into a mathematical expression, which is further evaluated according to an objective function. Additionally, for each generation, trees are reproduced, crossed over, and mutated in order to compose the new population.

6.2 Integrations

Instead of modeling a new experiment, one can use our already predefined integrations to gather more knowledge on how to use Opytimizer or even on how to play with parameters. Inside the examples/integrations folder, there are several well-known machine learning libraries used by the community. Each sub-folder contains diverse examples on

Figure 14: Output logs generated by running an Opytimizer task.

how to integrate Opytimizer with a specific technique, e.g., how to optimize Convolutional Neural Networks parameters with a Particle Swarm Optimization. Currently, we offer the following integrations:

• LibOPF10: opf_clustering.py, opf_wrapper.py;

• PyTorch11: cnn.py, enhanced_neural_network.py, linear_regression.py, logistic_regression.py, lstm.py, neural_network.py;

• Recogners12: dropout_rbm.py, rbm.py;

• Scikit-Learn13: k_means_clustering.py, svm.py.

Each integration example is composed of two parts: (i) the objective function to be optimized, e.g., a convolutional neural network, a logistic regression, among others; and (ii) the minimum classes and methods to initialize the optimization procedure. For every example, the idea behind Opytimizer’s functioning is almost the same: define the objective function, create a search space, instantiate an optimizer, and bundle everything into an Opytimizer class. Essentially, the main difference between all integrations scripts is the objective function to be optimized. Figure 15 illustrates an example of optimizing three parameters of a Restricted Boltzmann Machine (RBM): learning rate, momentum, and weight decay.

Figure 15: Recogners’ RBM optimization using Opytimizer.

6.3 Modeling a New Experiment

In order to model a new experiment, there are some standard rules that need to be followed. First of all, the objective function needs to be defined, which in this case we will be optimizing the well-known Sphere benchmarking function:

Furthermore, we need to define the basic variables to initialize the search space:

Afterward, we need to define the hyperparameters of the optimizer and its class:

Finally, we can bundle everything in the Opytimizer class and initialize the optimization task:

At the end of the optimization, a history object is produced, containing vital information about the task:

7 Conclusions

In this article, we presented a nature-inspired open-source library for handling function optimization called Opytimizer. Using an object-oriented implementation, Opytimizer provides a sophisticated yet straightforward implementation, allowing users to prototype new meta-heuristic algorithms rapidly and integrating with other well-known libraries, such as LibOPF, PyTorch, Recogners, Scikit-Learn.

The library implements a broad range of meta-heuristic techniques, from evolutionary- to swarm-based methods, as well as a couple of benchmarking functions, used to validate the optimizations’ performance. Additionally, as Opytimizer uses a tensor-based structure, it is possible to extend the idea of real-value optimization to more complex search spaces, the so-called hypercomplex optimization. Furthermore, Opytimizer provides a multi-objective optimization environment, empowering users with the ability to enhance their tasks and needs. Finally, Opytimizer also provides a history-based object, which used to track the whole optimization process and can be employed to furnish charts and insightful information about the procedure.

Regarding future works, we intend to make available more meta-heuristic algorithms and support more multi-objective techniques. Additionally, we also intend to create a more robust visualization package, allowing users to feed their history objects and furnish more charts. Moreover, we aim to add more benchmarking functions and integrations continually, providing a one-to-go optimization library for all purposes.

Acknowledgments

The authors are grateful to FAPESP grants #2013/07375-0, #2014/12236-1, #2017/25908-6, #2018/15597-6, and #2019/02205-5, as well as CNPq grants #307066/2017-7 and #427968/2018-6.

References

[1] C. H. Papadimitriou. The euclidean travelling salesman problem is np-complete. Theoretical Computer Science, 4(3):237–244, 1977.

[2] S. S. Rao and S. S. Rao. Engineering optimization: theory and practice. John Wiley & Sons, 2009.

[3] R. L. Rardin. Optimization in operations research, volume 166. Prentice Hall, 1998.

[4] H. Konno and H. Yamazaki. Mean-absolute deviation portfolio optimization model and its applications to tokyo stock market. Management Science, 37(5):519–531, 1991.

[5] V. Barone, M. Cossi, and J. Tomasi. Geometry optimization of molecular structures in solution by the polarizable continuum model. Journal of Computational Chemistry, 19(4):404–417, 1998.

[6] D. P. Bertsekas. Nonlinear programming. Athena Scientific, 1999.

[7] X.-S. Yang. Review of meta-heuristics and generalised evolutionary walk algorithm. International Journal of Bio-Inspired Computation, 3(2):77–84, 2011.

[8] G. H. Rosa, J. P. Papa, A. N. Marana, W. Scheirer, and D. D. Cox. Fine-tuning convolutional neural networks using harmony search. In Progress in Pattern Recognition, Image Analysis, Computer Vision, and Applications. Springer International Publishing, 2015.

[9] J. P. Papa, G. H. Rosa, A. N. Marana, W. Scheirer, and D. D. Cox. Model selection for discriminative restricted boltzmann machines through meta-heuristic techniques. Journal of Computational Science, 9:14–18, 2015.

[10] X.-S. Yang. Engineering Optimization: An Introduction with Metaheuristic Applications. Wiley Publishing, 1st edition, 2010.

[11] B. K. Oh, K. J. Kim, Y. Kim, H. S. Park, and H. Adeli. Evolutionary learning based sustainable strain sensing model for structural health monitoring of high-rise buildings. Applied Soft Computing, 58:576–585, 2017.

[12] S. Klein, M. Staring, and J. Pluim. Evaluation of optimization methods for nonrigid medical image registration using mutual information and b-splines. IEEE transactions on image processing, 16(12):2879–2890, 2007.

[13] N. Dey, S. Samanta, S. Chakraborty, A. Das, S. Chaudhuri, S. Sheli, and J. Suri. Firefly algorithm for optimization of scaling factors during embedding of manifold medical information: an application in ophthalmology imaging. Journal of Medical Imaging and Health Informatics, 4(3):384–394, 2014.

[14] X-S. Yang and S. Deb. Engineering optimisation by cuckoo search. International Journal of Mathematical Modelling and Numerical Optimisation, 1:330–343, 2010.

[15] P. Roos, R. J. Carr, and D. S. Nau. Evolution of state-dependent risk preferences. ACM Trans. Intell. Syst. Technol., 1(1):6:1–6:21, October 2010.

[16] J. P. Papa, G. H. Rosa, K. A. P. Costa, A. N. Marana, W. Scheirer, and D. D. Cox. On the model selection of bernoulli restricted boltzmann machines through harmony search. In Proceedings of the Genetic and Evolutionary Computation Conference, GECCO ’15, pages 1449–1450, New York, USA, 2015. ACM.

[17] J. P. Papa, W. Scheirer, and D. D. Cox. Fine-tuning deep belief networks using harmony search. Applied Soft Computing, 46:875–885, 2016.

[18] O. Reyes and S. Ventura. Evolutionary strategy to perform batch-mode active learning on multi-label data. ACM Trans. Intell. Syst. Technol., 9(4):46:1–46:26, January 2018.

[19] M. Fenton, J. McDermott, D. Fagan, S. Forstenlechner, E. Hemberg, and M. O’Neill. Ponyge2. Proceedings of the Genetic and Evolutionary Computation Conference Companion on - GECCO ’17, 2017.

[20] F.-A. Fortin, F.-M. De Rainville, M.-A. Gardner, Marc P., and C. Gagné. DEAP: Evolutionary algorithms made easy. Journal of Machine Learning Research, 13:2171–2175, jul 2012.

[21] J. P. Papa, G. H. Rosa, D. Rodrigues, and X.-S. Yang. Libopt: An open-source platform for fast prototyping soft optimization techniques, 2017.

[22] D. Karaboga and B. Basturk. A powerful and efficient algorithm for numerical function optimization: Artificial bee colony (ABC) algorithm. Journal of Global Optimization, 39(3):459–471, 2007.

[23] A. Nickabadi, M. M. Ebadzadeh, and R. Safabakhsh. A novel particle swarm optimization algorithm with adaptive inertia weight. Applied Soft Computing, 11(4):3658–3670, 2011.

[24] X.-S. Yang and A. H. Gandomi. Bat algorithm: a novel approach for global engineering optimization. Engineering Computations, 29(5):464–483, 2012.

[25] A. Hatamlou. Black hole: A new heuristic optimization approach for data clustering. Information sciences, 222:175–184, 2013.

[26] X.-S. Yang. Firefly algorithm, stochastic test functions and design optimisation. International Journal Bio-Inspired Computing, 2(2):78–84, 2010.

[27] S.-S. Yang, M. Karamanoglu, and X. He. Flower pollination algorithm: A novel approach for multiobjective optimization. Engineering Optimization, 46(9):1222–1237, 2014.

[28] J. R. Koza. Genetic Programming: On the Programming of Computers by Means of Natural Selection. MIT Press, Cambridge, MA, USA, 1992.

[29] Z. W. Geem, J. H. Kim, and G. V. Loganathan. A new heuristic optimization algorithm: harmony search. simulation, 76(2):60–68, 2001.

[30] M. Mahdavi, M. Fesanghary, and E. Damangir. An improved harmony search algorithm for solving optimization problems. Applied mathematics and computation, 188(2):1567–1579, 2007.

[31] J. Kennedy and R.C. Eberhart. Swarm Intelligence. M. Kaufman, 2001.

[32] H. Eskandar, A. Sadollah, A. Bahreininejad, and M. Hamdi. Water cycle algorithm–a novel metaheuristic optimization method for solving constrained engineering optimization problems. Computers & Structures, 110:151–166, 2012.