<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">EvoLP.jl: A playground for Evolutionary Computation in Julia</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Xavier</forename><forename type="middle">F C</forename><surname>Sánchez-Díaz</surname></persName>
							<email>xavier.sanchezdz@ntnu.no</email>
							<affiliation key="aff0">
								<orgName type="institution">Norwegian University of Science and Technology</orgName>
								<address>
									<settlement>Trondheim</settlement>
									<country key="NO">Norway</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Ole</forename><forename type="middle">Jakob</forename><surname>Mengshoel</surname></persName>
							<email>ole.j.mengshoel@ntnu.no</email>
							<affiliation key="aff0">
								<orgName type="institution">Norwegian University of Science and Technology</orgName>
								<address>
									<settlement>Trondheim</settlement>
									<country key="NO">Norway</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">EvoLP.jl: A playground for Evolutionary Computation in Julia</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">43E5359938950E961F9536D2FABE46FE</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-12-29T08:04+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Evolutionary Algorithms</term>
					<term>Genetic Algorithms</term>
					<term>Particle Swarm Optimisation</term>
					<term>Evolutionary Computation Software Tools</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Optimisation is highly relevant in many problems in artificial intelligence, machine learning, engineering and statistics. In these situations, optimisation by means of evolutionary computation becomes especially relevant as it makes few assumptions (such as differentiability) about the objective function. Problems such as these represent various research opportunities, both in the Norwegian and European contexts. In this work we present an open-source software framework, EvoLP.jl, as an effort to support the research in this niche. EvoLP.jl is a Julia package that implements reusable pieces of code for experimenting with single-objective evolutionary computation algorithms and its components. The framework is composed of blocks that span the separate phases of the evolutionary process: population initialisation, selection, crossover, and mutation. These blocks can be put together to create a modular solver, where each of the components can easily be swapped for testing. In addition, we provide some built-in algorithms and a few optional utilities for analysis (like benchmark test functions, result reporting and statistics logging). EvoLP.jl is an effort of the Norwegian Open Artificial Intelligence Lab and strives to comply with the guidelines of the Julia scientific community. It is well-tested, provides extensive documentation and is free-available for everyone to use under an open-source license. It is our intention that EvoLP.jl becomes a useful tool not only for research in evolutionary computation but also in the education and innovation scenarios.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">Introduction</head><p>The concept of Artificial Intelligence (AI) was originally used to refer to the science and engineering of intelligent agents <ref type="bibr" target="#b0">[1]</ref>. In the last decade, however, the dominant research topic-Machine Learning (ML) and its applications-has overshadowed other areas of AI research. In Norway, for example, the trend has been similar. In the last three annual reports from the Norwegian Research Center for AI Innovation (NorwAI), several publications and projects in AI are described but none of them mention any optimisation techniques, let alone any of those belonging to the Evolutionary Computation (EC) family <ref type="bibr" target="#b1">[2,</ref><ref type="bibr" target="#b2">3,</ref><ref type="bibr" target="#b3">4]</ref>.</p><p>A quick search in the project bank of The Research Council of Norway shows 375 projects when searching for "artificial intelligence", "AI" or their Norwegian translation, between 2018 and 2023 <ref type="bibr" target="#b4">[5]</ref>. In contrast, performing a similar search for the same period using the keyword "evolutionary" (or its Norwegian translation) yields only 14 projects <ref type="bibr" target="#b5">[6]</ref>. We believe there is potential in delving deeper in this line of research and its methods, as they can also be used for (and in conjunction with) AI algorithms <ref type="bibr" target="#b6">[7]</ref>.</p><p>As an effort to increase the interest in optimisation by means of EC in the Norwegian scientific community, we propose a software package in Julia that provides reusable computing patterns for experimenting and analysing several components for single-objective EC algorithms. The framework focuses on the idea of using small building blocks that can be put together, and encompass the different stages of an evolutionary process: initialisation of the population, parent selection, recombination, mutation and survival. In addition, it provides a few built-in algorithms-namely the 1+1 Evolutionary Algorithm (EA), a generational Genetic Algorithm (GA) and a Particle Swarm Optimisation (PSO) solver-and test functions to try them out. We aimed our attention to the components and their connections: how to put together the different tools available to play around (as in a playground) with a new solver.</p><p>Our framework, EvoLP.jl-which is a short form of Evolusjonaer Lekeplass <ref type="foot" target="#foot_0">1</ref> -is free and opensource, and is also accessible via the General Julia Registry: it can be installed from the package manager in a couple of instructions. Fully guided tutorials and short examples are available in the documentation, which can be browsed through the Julia REPL as well, and are detected by most linting services in IDEs.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Related Work</head><p>Research on EC can take on many different forms and paths, and the differences between solvers can become very specific. Nevertheless, many modular software tools have succeeded in creating abstractions that are general enough to apply to several of the algorithms they include. For Java, JCLEC <ref type="bibr" target="#b7">[8]</ref> and its multi-objective variation JCLEC-MO <ref type="bibr" target="#b8">[9]</ref> are two examples. More recently, JGEA <ref type="bibr" target="#b9">[10]</ref> continued with this similar modular design. HeuristicLab <ref type="bibr" target="#b10">[11]</ref> is another framework developed entirely in C# and employing a graphical user interface. DEAP <ref type="bibr" target="#b11">[12]</ref>, developed in Python 2.0, posed many interesting components that we wanted to include in our design. However, the framework has not been entirely rewritten to Python 3, so it suffers from many compatibility issues.</p><p>Python running times are not competitive against compiled languages, but several frameworks have found solutions around that fact. For example, EvoJax <ref type="bibr" target="#b12">[13]</ref> uses hardware acceleration for neuroevolution, or LEAP <ref type="bibr" target="#b13">[14]</ref> which uses Dask for building a computational graph that is easy to parallelise. Another example in this category is pygmo which is a Python wrapper for the pagmo C++ optimisation library <ref type="bibr" target="#b14">[15]</ref>.</p><p>Julia has been a rapidly growing programming language in the scientific community due to its performance and simple syntax, and offers similar software tools. The optimisation landscape in Julia consists of many different packages, for example SciML <ref type="bibr" target="#b15">[16]</ref> which encompasses a whole scientific environment for machine learning and optimisation, JuMP <ref type="bibr" target="#b16">[17]</ref> for mathematical optimisation, and Metaheuristics <ref type="bibr" target="#b17">[18]</ref> and BlackBoxOptim <ref type="bibr" target="#b18">[19]</ref> for non-convex and non-differentiable problems. Specific solutions for EC also exist (like EBIC.jl <ref type="bibr" target="#b19">[20]</ref>, Cambrian <ref type="bibr" target="#b20">[21]</ref> and Evolutionary <ref type="bibr" target="#b21">[22]</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Design Principles</head><p>The decision of developing EvoLP.jl in Julia comes from different standpoints. First is the performance against Python (which is the go-to scripting language for AI). Although scientific libraries (like numpy or scipy in Python) have been compiled for faster performance, they require that the code is vectorisable. This is not an easy task for EC algorithms, where many stochastic decisions are taken in an iterative manner. Another consideration about the programming language was the paradigm they use. Although iterative in nature, each of the phases of the evolutionary process can be abstracted to a single function modifying an object at a time (as opposed to an object being modified by its own methods). The functional paradigm also fits better with the scientific notation used in this line of research. EvoLP.jl takes advantage of these features of the Julia programming language along with polymorphism by multiple dispatch. Unlike C++ or Java, Julia uses structs (also known as types in other functional programming languages) instead of objects. Therefore, all procedures and operations that manipulate such types need to be implemented as functions instead of being methods inside an object. In this way, abstraction is easier to achieve since a single function represents a single step in the evolutionary process.</p><p>The polymorphic nature of Julia allows functions to behave differently using multiple dispatch. This enables the programmer to create multiple 'versions' of a function, for example the mutate function, which will behave differently depending on the type of mutation in an algorithm and the arguments passed. By doing so, we encapsulate all the specifics of a given operator inside a single function. This is useful for maintenance as there are no complicated program flows in a big mutate function, but rather several small mutate functions. The other advantage is extensibility: to add a new mutator one needs only to add a new function.</p><p>The framework is built to capitalise on these features, and provides small, reusable pieces of code that we refer to as blocks. These blocks can be either one of two kinds: type or function blocks, and can be put together to generate evolutionary algorithms in a few lines of code, where swapping components is simple and easy. EvoLP.jl started as an extension to the GA and PSO implementations presented by Kochenderfer and Wheeler <ref type="bibr" target="#b22">[23]</ref>. We later added important features that are common in an analysis work flow (e.g., result reporting or logging of statistics) and extended most of the functions to ensure reproducibility when dealing with stochastic components. In this way, experiments are easy to reproduce and share, which makes EvoLP.jl a good alternative when designing and analysing EC algorithms.</p><p>After creating a development cycle we were content with, the first version of EvoLP.jl was published and registered as an official Julia package. The code, along with documentation, examples and the development roadmap can be found in the GitHub repository. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Examples</head><p>This section includes complete, illustrative examples where blocks are coupled together in a single work flow for two well-known optimisation problems. A detailed description of the framework components is included in posterior sections.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1.">The Rosenbrock function</head><p>In this example, we solve a minimisation benchmark for continuous optimisation, the Rosenbrock function <ref type="bibr" target="#b23">[24]</ref>. For this problem, the following components are used:</p><p>• Generator: Continuous normal, i.e., with a population of 2D vectors x ∈ 𝑋 such that</p><formula xml:id="formula_0">𝑋 ∼ 𝒩 (𝜇, 𝜎 2 ) with 𝜇 = [︀ 0 0 ]︀ and 𝜎 2 = [︀ 1 0 0 1 ]︀</formula><p>• Selector (S): Rank-based, generational.</p><p>• Recombinator (C): Interpolation crossover with 𝜆 = 0.5</p><p>• Mutator (M): Gaussian mutation with 𝜎 = 0.5</p><formula xml:id="formula_1">• Objective function: 2-dimensional version of the Rosenbrock built-in test function, i.e. 𝑓 (x) = (𝑎 − 𝑥 1 ) 2 + 𝑏(𝑥 2 − 𝑥 2 1 ) 2 with default values of 𝑎 = 1 and 𝑏 = 5. The optimum is 𝑓 ([𝑎, 𝑎 2 ]) = 0.</formula><p>• Logbook: Calculating maximum, minimum, mean and median fitness values of the population at every iteration. • Algorithm: Built-in generational GA, with a population size |𝑋| = 500 and termination after 100 generations. Both crossover and mutation probabilities are 100%. • Result: The return value of the algorithm, available for further inspection.</p><p>The code can be implemented in a single file: using EvoLP, OrderedCollections, Statistics X_size = 500 k_max = 100 X = normal_rand_vector_pop(X_size, [0, 0], [1 0; 0 1]) S = RankBasedSelectionGenerational() C = InterpolationCrossover(0.5) M = GaussianMutation(0.5) statnames = ["mean_f", "max_f", "min_f", "median_f"] fns = [mean, maximum, minimum, median] log_dict = LittleDict(statnames, fns) statsbook = Logbook(log_dict) result = GA(statsbook, rosenbrock, X, k_max, S, C, M) @show optimum(result) @show optimizer(result) @show f_calls(result) @show statsbook.records <ref type="bibr">[end]</ref> Here is one possible output of the example above: </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2.">The 8-queen problem</head><p>This example deals with a classical combinatorial problem in AI where the goal is to place eight queens in a chess board such that no queen checks each other <ref type="bibr" target="#b0">[1]</ref>. Figure <ref type="figure" target="#fig_2">1</ref> shows three configurations where the constraints and possible clashes are highlighted. For this example, we use the following components:</p><p>• Generator: random permutation, i.e., with a population of 8D vectors x ∈ 𝑋 such that 𝑋 ∼ 𝒰(𝒮 8 ) where 𝒮 8 is the set of permutations of [8] = {1, 2, . . . , 8}</p><p>• Selector (S): Random tournament selection of size 𝑇 𝑠 = 5.</p><p>• Recombinator (C): Order one crossover for permutation vectors.</p><p>• Mutator (M): Swap mutation.</p><p>• Objective function:</p><formula xml:id="formula_2">𝑓 (x) = ∑︀ 𝑖=8 𝑖=1 DiagConstraints(𝑞 𝑖 )</formula><p>where DiagConstraints is a custom procedure (coded separately) which counts the number of conflicts of each queen 𝑞 𝑖 .</p><p>• Logbook: Calculating maximum, minimum, mean and median fitness values of the population at every iteration.</p><p>• Algorithm: Custom steady-state GA that generates two offspring per generation, with a population size |𝑋| = 100, and termination after 500 generations. Crossover probability is 100% while mutation probability is 80%. • Result: The return value of the algorithm, available for further inspection.</p><p>The code can be implemented in a single file, although it needs three parts: an objective function DiagConstraints, an algorithm, and a wrapper script. For simplicity, we show the last two components below: Here is one possible output of the example above: A visual representation of this specific solution is shown in Figure <ref type="figure" target="#fig_2">1c</ref>. The full example (described at a greater detail) is available in the documentation of EvoLP.jl. <ref type="foot" target="#foot_3">4</ref></p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">The Framework</head><p>In this section, we detail the blocks of EvoLP.jl, some of which were showcased in the examples section.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.1.">Block Taxonomy in EvoLP.jl</head><p>Every basic block in EvoLP.jl is categorised into one of the following essential steps of EC:</p><p>• Generators. Function blocks for randomly initialising the population.</p><p>• Selectors. Type blocks for selecting parents for recombination via the select function.</p><p>• Recombinators. Type blocks for performing crossover via the cross function.</p><p>• Mutators. Type blocks for performing mutation on a single individual via the mutate function.</p><p>Extra functionality is also provided in EvoLP.jl through a few optional blocks:</p><p>• Result. A type block for reporting the results of algorithms.</p><p>• Logbook. A type block for computing and storing statistics throughout a run.</p><p>• Test functions. A curated list of pseudoboolean and continuous benchmark functions from the literature <ref type="bibr" target="#b22">[23,</ref><ref type="bibr" target="#b24">25,</ref><ref type="bibr" target="#b25">26]</ref> to test an algorithm. • Built-in algorithm. A small selection of algorithms (1+1 EA <ref type="bibr" target="#b26">[27]</ref>, GA <ref type="bibr" target="#b27">[28]</ref> and PSO <ref type="bibr" target="#b28">[29]</ref>) that are ready to use, all in function block form.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.2.">Initialisation</head><p>To initialise the population in EvoLP.jl, we provide several population generators. These blocks generate random individuals and put them in a vector (known as the population). The population can be of different data types depending on the type of generator invoked:</p><p>• Binary. Generates a population of 𝑛 random boolean vectors.</p><p>• Continuous uniform. Generates a population of 𝑛 floating point vectors, from random values uniformly sampled between a lower and upper bound. • Continuous Gaussian. Similar to the continuous uniform, this generator returns a population of floating point vectors but instead sampled from a normal distribution with known means and variances. • Discrete combination/permutation. Returns a random sample from a discrete domain, set or container. Sampling can be performed with or without replacement.</p><p>Continuous generators (both uniform and normal variants) for Particles are provided as well, which generate a Particle population that can be used with the PSO built-in algorithm.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.3.">Parent Selection</head><p>In EvoLP.jl, the selection phase is performed in two steps:</p><p>1. Choose one of the available selection operators (or selectors) and instantiate it. 2. Then, use it to perform the selection. This is achieved using the select function.</p><p>The select function uses the chosen selector to obtain indices from a vector (which is usually the vector of fitness evaluations of all individuals in the population). EvoLP.jl implements these selectors as if solving a minimisation problem, so every selector is comparable to an arg min function with some degree of stochasticity. The available selectors are:</p><p>• Roulette wheel. This selector uses a fitness proportionate probability of selection.</p><p>• Rank-based. The probability of selection considers the rank of the fitness instead of its values. • Random tournament. A winner is obtained from a tournament among a random sample of size 𝑘. This process is repeated a second time to determine the second parent. • Truncation. Two random indices are selected from the top 𝑘 individuals.</p><p>The selection is commonly performed once (known in the literature as steady-state). However, sometimes it may be desirable to perform the selection 𝑛 times (i.e., once per every individual in the population), especially when working with generational algorithms. EvoLP.jl provides both variants for each selector.</p><p>After the desired selector has been instantiated, the user can call the select function inside the main loop of an algorithm (as was showcased in the examples in Section 4). Here is an illustrative snippet featuring the rank based selector in its steady-state variant: The same select function can behave differently depending on the chosen selector (thanks to polymorphism). Continuing with the rank-based selector example, here is the implementation of its select function: function select(::RankBasedSelectionSteady , y; rng=Random.GLOBAL_RNG) ranks = ordinalrank(y, rev = true) cat = Categorical(normalize(ranks, 1)) return rand(rng, cat, 2) end Additional selectors can be added by creating a new selector type and implementing its corresponding select function (see Section 5.6).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.4.">Crossover</head><p>In a similar fashion to the selection process, the crossover step of an EA is performed in two parts in EvoLP.jl: first choose a crossover operator (or recombinator) and then invoke the appropriate function to carry out the crossover. The function in this case is called cross, and generates one offspring only. The latest version of EvoLP.jl (v1.0 at the time of writing of this article) provides recombinators only for vector-based populations. The available recombinators are the following:</p><p>• Single point crossover (1PX). Select a random index and combine the parents at that point. Works on numeric vectors (i.e. boolean, integer or continuous) and combination of discrete values. • Two-point crossover. Similar to 1PX, but using two cutting points instead. Works on the same types of vectors as 1PX. • Uniform crossover. For numeric vectors and combination of discrete values. Each value is randomly selected between the parents. • Interpolation crossover. For continuous vectors. The result is a scaled addition of both parents. • Order One crossover. For discrete permutation-based individuals. This operator ensures that values remain unique after the crossover.</p><p>After choosing one of the recombinators, the crossover takes place when the appropriate cross function is called inside the main loop of the algorithm.</p><p>Currently, the recombinators do not check against the type of the individuals they are working on. This is important to consider, since using a numeric-only recombinator on a permutationbased problem (where values of an individual need to be unique) could result in generating an unfeasible solution. In future versions of EvoLP.jl, we plan to introduce a type for solution encoding, to ensure that only compatible blocks can be connected.</p><p>It is also important to note that some recombinators (as well as some selectors and mutators) have parameters that modify their behaviour. When instantiating this kind of operators, the desired value is passed as an argument to the constructor method.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.5.">Mutation</head><p>As with selection and crossover, the mutation phase in an EA is performed in EvoLP.jl by using the same two-step approach: choosing a mutator first and then calling the mutate function in the algorithm. The available mutators for numeric vectors in EvoLP.jl are:</p><p>• Bitwise mutator. For boolean vectors only. It has a controlling parameter which modifies the probability 𝜆 of independently flipping each bit. • Gaussian mutator. For continuous vectors only. Adds Gaussian noise with a standard deviation 𝜎 which is controlled via a parameter.</p><p>Mutators for permutation-based individuals are also provided:</p><p>• Swap mutator. Swaps the values of two randomly chosen positions in the chromosome.</p><p>• Insert mutator. Inserts a value in another position, shifting the rest of the chromosome.</p><p>• Scramble mutator. Randomly selects a sub-string and then shuffles it.</p><p>• Inversion mutator. Randomly selects a sub-string and reverses it.</p><p>When one of the mutation operators has been instantiated outside of the algorithm, the mutate function can be invoked in the main loop of a solver to perform the mutation. As with recombinators, some mutators work on numeric vectors only, and using them on permutationbased individuals could lead to generating an unfeasible solution.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.6.">Custom Operators</head><p>EvoLP.jl was designed to be extensible, with the idea that a user can add custom blocks if needed. This process is, again, a two-step task (in line with the operators described in previous sections). To create a new operator block, the user needs to provide:</p><p>1. A subtype for the desired block 2. An appropriate function to operate on such subtype For example, let us consider that the user wants to implement a new mutation operator, CrazyMutation. All mutator blocks are subtypes of the abstract MutationMethod supertype. By creating a new type that is derived from MutationMethod, the user is creating a new type block (i.e. CrazyMutation) and essentially completing the first step. As with the other blocks, this new mutator would need a special case of the mutate function. This is the second step: create a new mutate function that can receive the CrazyMutation block as an argument and modifies the individual as desired. To implement new selectors or recombinators, a similar process is followed. The three abstract types that EvoLP.jl provides for extending the type blocks are the following:</p><p>• SelectionMethod. The base of all selectors. It is used along with select.</p><p>• CrossoverMethod. The base of all recombinators. It is used along with cross.</p><p>• MutationMethod. The base of all mutators. It is used along with mutate.</p><p>Since generators and algorithm blocks are function blocks, they do not have an abstract supertype (unlike selectors, recombinators and mutators). To add a new generator or algorithm, the user needs only to provide a new function.</p><p>Regardless of the kind of functionality a user wishes to add, it is recommended to consider reproducibility. In EvoLP.jl, all blocks that deal with stochastic components (i.e., generators, selectors, recombinators and mutators) posses a keyword argument that can receive a Random Number Generator (RNG) instance. Using a StableRNG object (provided by the StableRNGs.jl package <ref type="bibr" target="#b29">[30]</ref>), we can ensure that a fixed seed will always return the same results. With this addition in mind, experiments become reproducible and can be shared in an executable form.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.7.">Extra Utilities</head><p>As mentioned in Section 5.1, EvoLP.jl includes as well additional blocks that provide useful functionality for designing, testing and analysing EAs. For a description of its capabilities and usage, we invite the reader to refer to the full documentation.<ref type="foot" target="#foot_4">5</ref> </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.">Conclusion and Future Work</head><p>In this paper we presented EvoLP.jl, a framework focused on providing reusable computing patterns for whenever scientists design and analyse multiple components for single-objective EC solvers. By using the metaphor of building blocks, we developed an abstraction that is easy for the user to understand. In this way, both using the framework and extending it becomes a user-friendly experience. We described all basic blocks that the framework includes, covering all phases of an evolutionary process-initialisation, selection, crossover and mutation-as well as referred to further reading for its optional features. The quality of the framework is ensured by following the conventions and sticking to the requirements of the Julia scientific community: unit testing, version control, extensive documentation and availability of the source code for everyone to use and modify. We believe that this is one of the strengths of the software tool (in addition to the EC niche it tackles inside the Julia community), and plan to continue the development of the package further in hopes that it becomes a useful tool for research, education and innovation.</p><p>For future releases of EvoLP.jl we contemplate the addition of more test functions, mostly in the pseudoboolean domain. Support for key-word arguments in constructors is also planned, as well as introducing support for multi-objective problems. Types for solution encoding, survival and replacement (niching, crowding and other diversity-preserving mechanisms) are being considered as potential block additions although further experimentation is required. Finally, a predefined set of metrics for the logbook block is also in the works. Since EvoLP.jl is a free and open-source project, the code is available for anyone to try. We invite the reader to play around and contribute through any of the available channels in the repository.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>2</head><label>2</label><figDesc></figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head></head><label></label><figDesc>optimum(result) = 0.0015029528354023858 optimizer(result) = [1.0367119356341026, 1.0803427525882299] f_calls(result) = 50050 (mean_eval = 3.7839504926952294, max_f = 22.281919411164413, min_f = 0.0015029528354023858, median_f = 2.429775485243721)˓→This full example is available as a guided tutorial in the documentation of EvoLP.jl.3   </figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: The 8-queen problem. 1a shows the constraints (in pink) imposed by the placement of a single queen piece (in blue). 1b highlights the conflicts arising from a possible configuration of the board. 1c illustrates one possible solution with no conflicts.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head></head><label></label><figDesc>function 8QSteadyGA(statsbook, f, X, k_max, S, C, M, mrate) n = length(X) # Generation loop for _ in 1:k_max fitnesses = f.(X) parents = select(S, fitnesses) # this will return 2 parents parents = vcat(parents, select(S, fitnesses)) # add 2 more offspring = [cross(C, X[parents<ref type="bibr" target="#b0">[1]</ref>], X[parents<ref type="bibr" target="#b1">[2]</ref>])] # get first offspring = vcat(offspring, [cross(C, X[parents<ref type="bibr" target="#b2">[3]</ref>], X[parents<ref type="bibr" target="#b3">[4]</ref>])])˓→ X = vcat(X, offspring) # add to population # Mutation loop for i in eachindex(X) if rand() &lt;= mrate X[i] = mutate(M, X[i]) end end fitnesses = f.(X) compute!(logbook, fitnesses)# Find worst and remove, twice for _ in 1:2 worst = argmax(fitnesses) deleteat!(X, worst) deleteat!(fitnesses, worst) end end # Result reporting best, best_i = findmin(f, X) n_evals = 2 * k_max * n + n result = Result(best, X[best_i], X, k_max, n_evals) return result end Then, the wrapper script which uses the 8QSteadyGA algorithm to solve the problem using the remaining blocks: using EvoLP, OrderedCollections, Statistics X_s = 100 T_s = 5 X = permutation_vector_pop(X_s, 8, 1:8) S = TournamentSelectionSteady(T_s) C = OrderOneCrossover() M = SwapMutation() statnames = ["mean_f", "max_f", "min_f", "median_f"] fns = [mean, maximum, minimum, median] log_dict = LittleDict(statnames, fns) statsbook = Logbook(log_dict) f = diag_constraints(x) result = mySteadyGA(statsbook, diag_constraints, X, 500, S, C, M, 0.8) ˓→ @show optimum(result) @show optimizer(result) @show f_calls(result) @show statsbook.records[end]    </figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head></head><label></label><figDesc>optimum(result) = 0 optimizer(result) = Any [5, 1, 8, 6, 3, 7, 2, 4] f_calls(result) = 100100 (mean_eval = 9.392156862745098, max_f = 20, min_f = 0, median_f = 8.0)</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>#</head><label></label><figDesc>Instantiate outside the algorithm S = RankBasedSelectionSteady() ... function exampleAlgorithm(S, ...) ... # Main loop for gen in 1:k_max ... # Do something parents = select(S, fitnesses) end ... end</figDesc></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">Although EVOLP (Evolving Logic Programs) is an acronym already in use, package names in Julia are case-sensitive and must include .jl in the name, making EvoLP.jl unique during web search and indexing.</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_1">See https://github.com/ntnu-ai-lab/EvoLP.jl/</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_2">See https://ntnu-ai-lab.github.io/EvoLP.jl/stable/tuto/ga_rosenbrock.html</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_3">See https://ntnu-ai-lab.github.io/EvoLP.jl/stable/tuto/8_queen.html</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="5" xml:id="foot_4">See https://ntnu-ai-lab.github.io/EvoLP.jl/stable/</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Acknowledgments</head><p>We would like to acknowledge the financial support for EvoLP.jl, partly funded by Project no. 311284 of the Research Council of Norway, as well as access to computing resources from the Department of Computer Science of the Norwegian University of Science and Technology.</p><p>We would also like to thank the Norwegian Open Artificial Intelligence Lab for the promotion and hosting of the framework in its GitHub organisation.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<author>
			<persName><forename type="first">S</forename><surname>Russell</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Norvig</surname></persName>
		</author>
		<title level="m">Artificial Intelligence: A Modern Approach, Pearson Series in Artificial Intelligence</title>
				<imprint>
			<publisher>Pearson</publisher>
			<date type="published" when="2020">2020</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">A</forename><surname>Gulla</surname></persName>
		</author>
		<idno>01</idno>
		<ptr target="https://www.ntnu.edu/documents/1294735055/1298789471/NorwAi+annual+report+2020_Final_06-04-21.pdf" />
		<title level="m">Norwegian Research Center for AI Innovation</title>
				<imprint>
			<date type="published" when="2020">2020</date>
		</imprint>
	</monogr>
	<note type="report_type">Technical Report</note>
	<note>NorwAI Annual Report 2020</note>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">A</forename><surname>Gulla</surname></persName>
		</author>
		<idno>03</idno>
		<ptr target="https://www.ntnu.edu/documents/1294735055/1298789471/NorwAi+annual+report+2021_Final_31-03-22.pdf" />
		<title level="m">Norwegian Research Center for AI Innovation</title>
				<imprint>
			<date type="published" when="2021">2021</date>
		</imprint>
	</monogr>
	<note type="report_type">Technical Report</note>
	<note>NorwAI Annual Report 2021</note>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">A</forename><surname>Gulla</surname></persName>
		</author>
		<idno>02</idno>
		<ptr target="https://www.ntnu.edu/documents/1294735055/1298789471/NorwAi+annual+report+2022_Final_Web.pdf" />
		<title level="m">NorwAI Annual Report 2022</title>
				<imprint>
			<date type="published" when="2022">2022</date>
		</imprint>
		<respStmt>
			<orgName>Norwegian Research Center for AI Innovation</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Technical Report</note>
</biblStruct>

<biblStruct xml:id="b4">
	<monogr>
		<ptr target="https://prosjektbanken.forskningsradet.no/en/explore/projects?Kilde=FORISS&amp;distribution=Ar&amp;chart=bar&amp;calcType=funding&amp;Sprak=no&amp;sortBy=score&amp;sortOrder=desc&amp;resultCount=30&amp;offset=0&amp;source=FORISS&amp;Fritekst=artificial%20intelligence&amp;Ar=2018&amp;Ar=2019&amp;Ar=2020&amp;Ar=2021&amp;Ar=2022&amp;Ar=2023&amp;LTP.1=LTP2%20IKT%20og%20digital%20transformasjon" />
		<title level="m">Statistics about AI -Prosjektbanken</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
		<respStmt>
			<orgName>Forskningsrådet</orgName>
		</respStmt>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<author>
			<persName><surname>Forskningsrådet</surname></persName>
		</author>
		<ptr target="https://prosjektbanken.forskningsradet.no/en/explore/projects?Kilde=FORISS&amp;distribution=Ar&amp;chart=bar&amp;calcType=funding&amp;Sprak=no&amp;sortBy=score&amp;sortOrder=desc&amp;resultCount=30&amp;offset=0&amp;source=FORISS&amp;Fritekst=evolutionary&amp;Ar=2018&amp;Ar=2019&amp;Ar=2020&amp;Ar=2021&amp;Ar=2022&amp;Ar=2023&amp;LTP.1=LTP2%20IKT%20og%20digital%20transformasjon" />
		<title level="m">Statistics about EAs -Prosjektbanken</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Evolutionary Machine Learning: A Survey</title>
		<author>
			<persName><forename type="first">A</forename><surname>Telikani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Tahmassebi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Banzhaf</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">H</forename><surname>Gandomi</surname></persName>
		</author>
		<idno type="DOI">10.1145/3467477</idno>
	</analytic>
	<monogr>
		<title level="j">ACM Computing Surveys</title>
		<imprint>
			<biblScope unit="volume">54</biblScope>
			<biblScope unit="page">35</biblScope>
			<date type="published" when="2021">2021</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">JCLEC: A Java framework for evolutionary computation</title>
		<author>
			<persName><forename type="first">S</forename><surname>Ventura</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Romero</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Zafra</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">A</forename><surname>Delgado</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Hervás</surname></persName>
		</author>
		<idno type="DOI">10.1007/s00500-007-0172-0</idno>
	</analytic>
	<monogr>
		<title level="j">Soft Computing</title>
		<imprint>
			<biblScope unit="volume">12</biblScope>
			<biblScope unit="page" from="381" to="392" />
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">JCLEC-MO: A Java suite for solving many-objective optimization engineering problems</title>
		<author>
			<persName><forename type="first">A</forename><surname>Ramírez</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">R</forename><surname>Romero</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>García-Martínez</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Ventura</surname></persName>
		</author>
		<idno type="DOI">10.1016/j.engappai.2019.02.003</idno>
	</analytic>
	<monogr>
		<title level="j">Engineering Applications of Artificial Intelligence</title>
		<imprint>
			<biblScope unit="volume">81</biblScope>
			<biblScope unit="page" from="14" to="28" />
			<date type="published" when="2019">2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">JGEA: A modular java framework for experimenting with evolutionary computation</title>
		<author>
			<persName><forename type="first">E</forename><surname>Medvet</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Nadizar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Manzoni</surname></persName>
		</author>
		<idno type="DOI">10.1145/3520304.3533960</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the Genetic and Evolutionary Computation Conference Companion, GECCO &apos;22</title>
				<meeting>the Genetic and Evolutionary Computation Conference Companion, GECCO &apos;22<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>Association for Computing Machinery</publisher>
			<date type="published" when="2022">2022</date>
			<biblScope unit="page" from="2009" to="2018" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<monogr>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">A L</forename><surname>Heurstic</surname></persName>
			<affiliation>
				<orgName type="collaboration">HEAL</orgName>
			</affiliation>
		</author>
		<ptr target="https://github.com/heal-research/HeuristicLab" />
		<title level="m">Heuristiclab</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">DEAP: A python framework for evolutionary algorithms</title>
		<author>
			<persName><forename type="first">F.-M</forename><surname>De Rainville</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F.-A</forename><surname>Fortin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M.-A</forename><surname>Gardner</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Parizeau</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Gagné</surname></persName>
		</author>
		<idno type="DOI">10.1145/2330784.2330799</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 14th Annual Conference Companion on Genetic and Evolutionary Computation, GECCO &apos;12</title>
				<meeting>the 14th Annual Conference Companion on Genetic and Evolutionary Computation, GECCO &apos;12<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>Association for Computing Machinery</publisher>
			<date type="published" when="2012">2012</date>
			<biblScope unit="page" from="85" to="92" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">EvoJAX: Hardware-Accelerated Neuroevolution</title>
		<author>
			<persName><forename type="first">Y</forename><surname>Tang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Tian</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Ha</surname></persName>
		</author>
		<idno type="DOI">10.1145/3520304.3528770</idno>
		<idno type="arXiv">arXiv:2202.05008</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the Genetic and Evolutionary Computation Conference Companion</title>
				<meeting>the Genetic and Evolutionary Computation Conference Companion</meeting>
		<imprint>
			<date type="published" when="2022">2022</date>
			<biblScope unit="page" from="308" to="311" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">Library for evolutionary algorithms in Python (LEAP)</title>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">A</forename><surname>Coletti</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">O</forename><surname>Scott</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">K</forename><surname>Bassett</surname></persName>
		</author>
		<idno type="DOI">10.1145/3377929.3398147</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2020 Genetic and Evolutionary Computation Conference Companion, GECCO &apos;20</title>
				<meeting>the 2020 Genetic and Evolutionary Computation Conference Companion, GECCO &apos;20<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>Association for Computing Machinery</publisher>
			<date type="published" when="2020">2020</date>
			<biblScope unit="page" from="1571" to="1579" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">A parallel global multiobjective framework for optimization: Pagmo</title>
		<author>
			<persName><forename type="first">F</forename><surname>Biscani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Izzo</surname></persName>
		</author>
		<idno type="DOI">10.21105/joss.02338</idno>
	</analytic>
	<monogr>
		<title level="j">Journal of Open Source Software</title>
		<imprint>
			<biblScope unit="volume">5</biblScope>
			<biblScope unit="page">2338</biblScope>
			<date type="published" when="2020">2020</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title/>
		<author>
			<persName><forename type="first">C</forename><surname>Rackauckas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Sciemon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><forename type="middle">S</forename><surname>Vaverka</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><forename type="middle">L</forename><surname>Zhu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Strouwen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">P</forename><surname>Sanders</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Sterpu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Ling</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><forename type="middle">E</forename><surname>Catach</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Monticone</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Dey</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Churavy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Edelman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Haslam</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Lenail</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Kaushal</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Laforte</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Wang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Cucchietti</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Bhogaonker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Milechin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><forename type="middle">C</forename><surname>White</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Payne</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Schaub</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Fu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Meijer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Kirchgässner</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Jain</surname></persName>
		</author>
		<idno type="DOI">10.5281/zenodo.7347643</idno>
		<ptr target="https://doi.org/10.5281/zenodo.7347643.doi:10.5281/zenodo.7347643" />
	</analytic>
	<monogr>
		<title level="j">Sciml/scimlbook</title>
		<imprint>
			<biblScope unit="issue">1</biblScope>
			<date type="published" when="2022">2022</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<monogr>
		<author>
			<persName><forename type="first">M</forename><surname>Lubin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">O</forename><surname>Dowson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">D</forename><surname>Garcia</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Huchette</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Legat</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">P</forename><surname>Vielma</surname></persName>
		</author>
		<idno type="DOI">10.48550/arXiv.2206.03866</idno>
		<idno type="arXiv">arXiv:2206.03866</idno>
		<title level="m">JuMP 1.0: Recent improvements to a modeling language for mathematical optimization</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Metaheuristics: A Julia Package for Single-and Multi-Objective Optimization</title>
		<author>
			<persName><forename type="first">J.-A</forename><surname>Mejía-De-Dios</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Mezura-Montes</surname></persName>
		</author>
		<idno type="DOI">10.21105/joss.04723</idno>
	</analytic>
	<monogr>
		<title level="j">Journal of Open Source Software</title>
		<imprint>
			<biblScope unit="volume">7</biblScope>
			<biblScope unit="page">4723</biblScope>
			<date type="published" when="2022">2022</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<monogr>
		<author>
			<persName><forename type="first">R</forename><surname>Feldt</surname></persName>
		</author>
		<ptr target="https://github.com/robertfeldt/BlackBoxOptim.jl" />
		<title level="m">Blackboxoptim.jl</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">An efficient implementation of evolutionary biclustering algorithm in Julia</title>
		<author>
			<persName><forename type="first">P</forename><surname>Renc</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Orzechowski</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Byrski</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Wăs</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">H</forename><surname>Moore</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ebic</forename><surname>Jl</surname></persName>
		</author>
		<idno type="DOI">10.1145/3449726.3463197</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the Genetic and Evolutionary Computation Conference Companion</title>
				<meeting>the Genetic and Evolutionary Computation Conference Companion<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>Association for Computing Machinery</publisher>
			<date type="published" when="2021">2021</date>
			<biblScope unit="page" from="1540" to="1548" />
		</imprint>
	</monogr>
	<note>GECCO &apos;21</note>
</biblStruct>

<biblStruct xml:id="b20">
	<monogr>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">G</forename><surname>Wilson</surname></persName>
		</author>
		<ptr target="https://github.com/d9w/Cambrian.jl" />
		<title level="m">Cambrian.jl</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b21">
	<monogr>
		<author>
			<persName><forename type="first">Art</forename></persName>
		</author>
		<ptr target="https://github.com/wildart/Evolutionary.jl" />
		<title level="m">Evolutionary</title>
				<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b22">
	<monogr>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">J</forename><surname>Kochenderfer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><forename type="middle">A</forename><surname>Wheeler</surname></persName>
		</author>
		<title level="m">Algorithms for Optimization</title>
				<imprint>
			<publisher>Mit Press</publisher>
			<date type="published" when="2019">2019</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b23">
	<analytic>
		<title level="a" type="main">An Automatic Method for Finding the Greatest or Least Value of a Function</title>
		<author>
			<persName><forename type="first">H</forename><forename type="middle">H</forename><surname>Rosenbrock</surname></persName>
		</author>
		<idno type="DOI">10.1093/comjnl/3.3.175</idno>
		<ptr target="https://doi.org/10.1093/comjnl/3.3.175.doi:10.1093/comjnl/3.3.175" />
	</analytic>
	<monogr>
		<title level="j">The Computer Journal</title>
		<imprint>
			<biblScope unit="volume">3</biblScope>
			<biblScope unit="page" from="175" to="184" />
			<date type="published" when="1960">1960</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b24">
	<monogr>
		<title level="m" type="main">Virtual library of simulation experiments: Test functions and datasets</title>
		<author>
			<persName><forename type="first">S</forename><surname>Surjanovic</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Bingham</surname></persName>
		</author>
		<ptr target="http://www.sfu.ca/~ssurjano,2013" />
		<imprint>
			<date type="published" when="2023-04-11">April 11, 2023</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b25">
	<monogr>
		<title level="m" type="main">An Extended Jump Functions Benchmark for the Analysis of Randomized Search Heuristics</title>
		<author>
			<persName><forename type="first">H</forename><surname>Bambury</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Bultel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Doerr</surname></persName>
		</author>
		<idno type="DOI">10.1007/s00453-022-00977-1</idno>
		<ptr target="http://arxiv.org/abs/2105.03090.doi:10.1007/s00453-022-00977-1.arXiv:2105.03090" />
		<imprint>
			<date type="published" when="2022">2022</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b26">
	<analytic>
		<title level="a" type="main">A rigorous complexity analysis of the (1+1) evolutionary algorithm for linear functions with Boolean inputs</title>
		<author>
			<persName><forename type="first">S</forename><surname>Droste</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Jansen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Wegener</surname></persName>
		</author>
		<idno type="DOI">10.1109/ICEC.1998.700079</idno>
	</analytic>
	<monogr>
		<title level="m">IEEE International Conference on Evolutionary Computation Proceedings. IEEE World Congress on Computational Intelligence (Cat. No.98TH8360</title>
				<imprint>
			<date type="published" when="1998">1998. 1998</date>
			<biblScope unit="page" from="499" to="504" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b27">
	<monogr>
		<title level="m" type="main">Genetic Algorithms in Search, Optimization and Machine Learning</title>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">E</forename><surname>Goldberg</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1989">1989</date>
			<publisher>Addison-Wesley Longman Publishing Co., Inc</publisher>
			<pubPlace>USA</pubPlace>
		</imprint>
	</monogr>
	<note>1st ed</note>
</biblStruct>

<biblStruct xml:id="b28">
	<analytic>
		<title level="a" type="main">Particle swarm optimization</title>
		<author>
			<persName><forename type="first">J</forename><surname>Kennedy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Eberhart</surname></persName>
		</author>
		<idno type="DOI">10.1109/ICNN.1995.488968</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ICNN&apos;95 -International Conference on Neural Networks</title>
				<meeting>ICNN&apos;95 -International Conference on Neural Networks</meeting>
		<imprint>
			<date type="published" when="1995">1995</date>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="page" from="1942" to="1948" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b29">
	<monogr>
		<title/>
		<author>
			<persName><surname>Juliarandom</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Juliarandom</forename><surname>Stablerngs</surname></persName>
		</author>
		<ptr target="https://github.com/JuliaRandom/StableRNGs.jl" />
		<imprint>
			<date type="published" when="2023">2023</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
