Package org.moeaframework.core
Class AdaptiveGridArchive
java.lang.Object
org.moeaframework.core.Population
org.moeaframework.core.NondominatedPopulation
org.moeaframework.core.AdaptiveGridArchive
- All Implemented Interfaces:
Iterable<Solution>
,Stateful
,Displayable
,Formattable<Solution>
Adaptive grid archive. Divides objective space into a number of grid cells, maintaining a count of the number of
solutions within each grid cell. When the size of the archive exceeds a specified capacity, a solution from the
most crowded grid cell is selected and removed from the archive.
This implementation currently stores the density of each grid cell in an array. As such,
pow(numberOfDivisions, numberOfObjectives)
can not exceed the storage capacity of an array, or
pow(2, 32)
. We may consider at some point using sparse arrays to remove this limitation.
References:
- Knowles, J.D. and Corne, D.W., "Approximating the Nondominated Front using the Pareto Archived Evolution Strategy," Evolutionary Computation, vol. 8, no. 2, pp. 149-172, 2000.
- Knowles, J.D. and Corne, D.W., "Properties of an Adaptive Archiving for Storing Nondominated Vectors," IEEE Transactions on Evolutionary Computation, vol. 7, no. 2, pp. 100-116, 2003.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.moeaframework.core.NondominatedPopulation
NondominatedPopulation.DuplicateMode
-
Field Summary
Modifier and TypeFieldDescriptionprotected final int
The maximum capacity of this archive.protected int[]
The number of solutions in each grid cell.protected double[]
The maximum objective value for each dimension.protected double[]
The minimum objective value for each dimension.protected final int
The number of divisions this archive uses to split each objective.protected final Problem
The problem for which this archive is used.Fields inherited from class org.moeaframework.core.NondominatedPopulation
comparator, duplicateMode
-
Constructor Summary
ConstructorDescriptionAdaptiveGridArchive
(int capacity, Problem problem, int numberOfDivisions) Constructs an adaptive grid archive with the specified capacity with the specified number of divisions along each objective. -
Method Summary
Modifier and TypeMethodDescriptionprotected void
Computes new lower and upper bounds and recalculates the densities of each grid cell.boolean
IfnewSolution
is dominates any solution or is non-dominated with all solutions in this population, the dominated solutions are removed andnewSolution
is added to this population.void
clear()
Removes all solutions from this population.copy()
Returns a copy of this population.protected int
Returns the index of the grid cell with the largest density.int
Returns the index of the specified solution in this adaptive grid archive, or-1
if the solution is not within the current lower and upper bounds.int
Returns the equivalent number of bisections to produce the number of divisions.int
Returns the maximum number of solutions stored in this archive.int
getDensity
(int index) Returns the density of the solution at the given index.static int
getMaximumBisections
(int numberOfObjectives) Calculates the largest possible value for thebisections
parameter.int
Returns the number of divisions this archive uses to split each objective.Returns the problem for which this archive is used.void
loadState
(ObjectInputStream stream) Loads the state of this object from the stream.protected Solution
Returns a solution residing in the densest grid cell.void
remove
(int index) Removes the solution at the specified index from this population.boolean
Removes the specified solution from this population, if present.void
saveState
(ObjectOutputStream stream) Writes the state of this object to the stream.Methods inherited from class org.moeaframework.core.NondominatedPopulation
forceAddWithoutCheck, getComparator, isDuplicate, loadReferenceSet, loadReferenceSet, replace
Methods inherited from class org.moeaframework.core.Population
addAll, addAll, asList, asTabularData, contains, containsAll, containsAll, filter, get, getLowerBounds, getUpperBounds, indexOf, isEmpty, iterator, loadBinary, loadBinary, loadObjectives, loadObjectives, removeAll, removeAll, removeAll, saveBinary, saveBinary, saveObjectives, saveObjectives, size, sort, truncate
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.moeaframework.util.format.Displayable
display
Methods inherited from interface org.moeaframework.util.format.Formattable
display, display, display, save, saveCSV
Methods inherited from interface java.lang.Iterable
forEach, spliterator
-
Field Details
-
capacity
protected final int capacityThe maximum capacity of this archive. -
problem
The problem for which this archive is used. -
numberOfDivisions
protected final int numberOfDivisionsThe number of divisions this archive uses to split each objective. -
minimum
protected double[] minimumThe minimum objective value for each dimension. -
maximum
protected double[] maximumThe maximum objective value for each dimension. -
density
protected int[] densityThe number of solutions in each grid cell.
-
-
Constructor Details
-
AdaptiveGridArchive
Constructs an adaptive grid archive with the specified capacity with the specified number of divisions along each objective.- Parameters:
capacity
- the capacity of this archiveproblem
- the problem for which this archive is usednumberOfDivisions
- the number of divisions this archive uses to split each objective- Throws:
FrameworkException
- ifpow(numberOfDivisions, numberOfObjectives)
exceeds the storage capacity of an array
-
-
Method Details
-
getMaximumBisections
public static int getMaximumBisections(int numberOfObjectives) Calculates the largest possible value for thebisections
parameter. This is limited by the available Java heap size and the maximum integer value (2^31-1), whichever is smaller.- Parameters:
numberOfObjectives
- the number of objectives- Returns:
- the maximum number of bisections
-
getBisections
public int getBisections()Returns the equivalent number of bisections to produce the number of divisions.- Returns:
- the number of bisections
-
getCapacity
public int getCapacity()Returns the maximum number of solutions stored in this archive.- Returns:
- the maximum number of solutions stored in this archive
-
getNumberOfDivisions
public int getNumberOfDivisions()Returns the number of divisions this archive uses to split each objective.- Returns:
- the number of divisions this archive uses to split each objective
-
getProblem
Returns the problem for which this archive is used.- Returns:
- the problem for which this archive is used
-
add
Description copied from class:NondominatedPopulation
IfnewSolution
is dominates any solution or is non-dominated with all solutions in this population, the dominated solutions are removed andnewSolution
is added to this population. Otherwise,newSolution
is dominated and is not added to this population.- Overrides:
add
in classNondominatedPopulation
- Parameters:
solution
- the solution to be added- Returns:
true
if the population was modified as a result of this method;false
otherwise.
-
remove
public void remove(int index) Description copied from class:Population
Removes the solution at the specified index from this population.- Overrides:
remove
in classPopulation
- Parameters:
index
- the index of the solution to be removed
-
remove
Description copied from class:Population
Removes the specified solution from this population, if present.- Overrides:
remove
in classPopulation
- Parameters:
solution
- the solution to be removed- Returns:
true
if this population was modified as a result of this method;false
otherwise
-
clear
public void clear()Description copied from class:Population
Removes all solutions from this population.- Overrides:
clear
in classPopulation
-
findDensestCell
protected int findDensestCell()Returns the index of the grid cell with the largest density.- Returns:
- the index of the grid cell with the largest density
-
pickSolutionFromDensestCell
Returns a solution residing in the densest grid cell. If there are more than one such solution or multiple cells with the same density, the first solution encountered is returned.- Returns:
- a solution residing in the densest grid cell
-
adaptGrid
protected void adaptGrid()Computes new lower and upper bounds and recalculates the densities of each grid cell. -
findIndex
Returns the index of the specified solution in this adaptive grid archive, or-1
if the solution is not within the current lower and upper bounds.- Parameters:
solution
- the specified solution- Returns:
- the index of the specified solution in this adaptive grid archive, or
-1
if the solution is not within the current lower and upper bounds
-
getDensity
public int getDensity(int index) Returns the density of the solution at the given index.- Parameters:
index
- the solution index- Returns:
- the density of the solution at the given index
-
copy
Description copied from class:Population
Returns a copy of this population. This can be thought of as a "deep copy", which creates a copy of both the population itself and copies of the individual solutions in the population. Consequently, the returned copy is completely independent, such that any modifications to the contents or order will not impact the original.Since creating such a "deep copy" can be expensive, prefer using the constructor
Population(Iterable)
orPopulation.addAll(Iterable)
whenever possible. These alternatives are useful when filtering or reordering the solutions, but the solutions themselves are left unchanged.- Overrides:
copy
in classNondominatedPopulation
- Returns:
- the copy of this population
-
saveState
Description copied from interface:Stateful
Writes the state of this object to the stream. The order that objects are written to the stream is important. We recommend first callingsuper.saveState(stream)
followed by writing each field.- Specified by:
saveState
in interfaceStateful
- Overrides:
saveState
in classPopulation
- Parameters:
stream
- the stream- Throws:
IOException
- if an I/O error occurred
-
loadState
Description copied from interface:Stateful
Loads the state of this object from the stream. The order for reading objects from the stream must match the order they are written to the stream inStateful.saveState(ObjectOutputStream)
.- Specified by:
loadState
in interfaceStateful
- Overrides:
loadState
in classPopulation
- Parameters:
stream
- the stream- Throws:
IOException
- if an I/O error occurredClassNotFoundException
- if the stream referenced a class that is not defined
-