Closed HeuristicLab-Trac-Bot closed 8 years ago
r12533 Re-added MaximumGenerations property based on the generations terminator.
r12548 Moved updating of terminators to concrete ALPS implementation instead of abstract base class.
r12863: Added EvaluatedSolutionsHistoryAnalyzer to keep track of the number of evaluated solutions when the analyzers are called.
pfleck's TODO list:
- Change Population Size from array to int
- LayerAnalyzer should get all analyzers, but deactivates them by default. Also add ALPS-specific analyzers.
- Provide a sample for the start page
- Change AgeInheritance to a double value
- Set sensible default parameters
- Remove AgeInheritanceReduction parameter because only standard alps will be integrated in trunk
- Replace MatingPoolRange/MatingPoolSelectionPercentage with placeholder and own operator
- Unhide PlusSelection parameter
- Remove unused operators in GA main loop
- Remove EvaluatedSolutionsHistoryAnalyzer
- Changed PopulationSize from array to int.
- Removed obsolete
LayerUniformSubScopesProcessor
.
r12993 Removed
Alps
base class and integrated the code inAlpsGeneticAlgorithm
.
- Updated item and plugin descriptions.
- Set
Creatable
attributes.
- Added age progression and distribution analyzers per default but disabled.
- Added all regular analyzers as layer analyzers but disabled.
- Removed obsolete
EvaluatedSolutionsHistoryAnalyzer
.
- Removed
AgeInheritance
enum and used a double [0-1] instead.- Added a
WeightingReducer
that uses the new double-weight for weighting between the lower and higher value.
- Removed unused operators in modified GA mainloop.
- Unhide PlusSelection parameter.
r13037 When creating a new layer, reset the old results (e.g. quality chart) to NaN to symbolize that the layer did not exist during that time.
- Changed the age type from int to double.
- Changed
EldersSelector
to make use of aScopeTreeLookupParameter
.- Removed unused operators in
LayerUpdator
.
r13079 Removed
ShiftToRightMigrator
and usedUnidirectionalRingMigrator
instead
- Added the possibility of continuous reseeding (percentage based reseeding of layer 0).
- Restructured operator graph.
- Deleted
LayerUpdator
(replaced byLayerOpener
)- Deleted
LayerSorter
.- Moved preparing of
GeneticAlgorithmMainLoop
toAlpsGeneticAlgorithmMainOperator
.
- Simplified operator graph in MainOperator.
- Added item descriptions.
- Removed unnecessary code.
- Removed ContinuousReseeding because it does not bring any improvements and makes reseeding more complicated.
- Adapted changes from UnidirectionalRingMigrator.
- Instead of hidden execution scope change logic in
LayerReseeder
, the newReseedingController
makes the scope change more obvious by using anOperatorParameter
.- Instead of the classes for
EldersEmigrator
,LayerOpener
andLayerReseeder
the operator graph is created in theAlpsGeneticAlgorithmMainLoop
usingCombinedOperator
.
r13117 Added ReduceToPopulationSize parameter to control if the population is reduced to the PopulationSize after elder migration (default) or the layer can have more than PopulationSize individuals until the next generation.
- Implemented full wiring of ALPS.
- Created new
AlpsGeneticAlgorithmMainOperator
instead of using a modifiedGeneticAlgorithmMainLoop
because of wiring issues.- Separated
LayerCreator
into genericLastScopeCloner
andResultsHistoryWiper
.
r13125 Fixed wrong EvaluatedSolutions count when reevaluating elites.
- Added some missing wiring.
- Unified some parameter properties.
- Removed some operators.
Here is the first part of the review. I did have a look at the operator graph and all operators except the Analyzers and the AlpsGeneticAlgorithm* operators:
AlpsGeneticAlgorithm initializes layer 0 and then, at the end, calls AlpsGeneticAlgorithmMainLoop. AlpsGeneticAlgorithmMainLoop again does some initialization in layer 0. This could be done in one step in my opinion so that the functionality for initializing layer 0 would then be in one place.
I think that the default parameters of the algorithm are set reasonably. I only have a question concerning the selector: Is there a reason why you chose the GeneralizedRankSelector? If there is then it's ok, otherwise I would choose the ProportionalSelector just to be consistent to the other GA variants.
Update version in AssemblyInfo.cs.frame and Plugin.cs.frame to 3.3.12
Adapt project file for Mono (Prebuildevent in .csproj file, open any other HL project file with a text editor)
MatingPoolCreator:
- There is a bug in the description: "An operator which creating mating pools ..." -> should be "creates"
- The description of the MatingPoolRange parameters is missing a ")"
- In the summary comment: "n previous scopeS"
EldersSelector:
- Fix description: "toO old"
- In the parameter descriptions: "layer" and "layers" should be written in lower case
In EmigrateElders, in the UnidirectionalRingMigrator, also write "layer" in lower case to be more consistent
EldersEmigrator
- ReduceToPopulationSize == false: Do we get a problem if a layer is empty? Or is it impossible to generate such a case?
- ReduceToPopulationSize == true is how it is described in the paper?
OpenNewLayer: So this is done if Generations >= AgeLimits[OpenLayers-1]? Shouldn't this condition check if any of the individuals in the layer has reached the age limit and then a new layer is created? Or are there always in the last layer old-enough individuals at the time the age limit for the next layer hits generation?Or from a different angle: If I set AgeInheritance very low, couldn't I produce a case where I would not reach a certain age in a certain number of generations?
LastScopeCloner:
- NewScopeOperator description: "Operator" should be lower case
- Though this is called a scope cloner, it probably only makes sense for layers: It assumes that the name is the layer number and increments it by 1 and also, the ArgumentExcpetion that may be thrown talks about a layer that has to exist. I therefore suggest to rename it to LastLayerCloner and also rename the NewScopeOperator to NewLayerOperator.
ReseedingController:
- FirstLayerOperator: Parameter description: "Operator" -> lower case
Just a few more points:
Description of the PopulationSize parameter: "... IN each layer"
Description of the AgeLimits parameter:
- Layer -> lower case. Please check for all other operator names.
- Maybe more precise: "The maximum age an individual can reach in a certain layer." ?
In the name for the operators: Be consistent and either use "Init" or "Initialize"
The global DiversityAnalyzer does not work. You should remove it from this collection because we should not offer something to the user where we know it won't work.
Ok, and that's it. I played a little bit around with the algorithm, seems to work so far. Reproducibility of results seems to be ok, also with parallel engine. I did not check in detail if the implementation of the algorithm is exactly like in the paper. So overall I think this is a good, HL-style implementation of ALPS.
r13206 Fixed typos and renamed some stuff suggested by ascheibe and adapted project for mono.
- The initialization of layer 0 is done similar to other algorithms where general initialization is done in the algorithm itself and variables used and produced during the main-loop is initialized in the main-loop-operator.
- The GeneralizedRankSelector is used as default selector because it generally works the best (rank compensates the large quality range of multiple layers and high selection pressure via pressure-parameter). Proportional selection performs very badly because the selection pressure is too low for ALPS.
- Concerning ReduceToPopulationSize in the EldersEmigrator, the behavior it is not completely clear in the original paper. Reducing the population to the population size seems the more logical way, therefore it is default. An empty layer could happen in extremely rare situations, but it never happens to me so far.
- Concerning opening a new layer, when taking a closer look at the ages, all individual tends to be as old as possible, in the standard version with AgeInheritance==1. That means they usually get too old in exactly after the generation the AgeLimits for the current last layer states. This way it is not necessary to check if any individual becomes too old for the current last layer. For AgeInheritance<1 it can happen that there would actually be no need to open a new layer; however, it will be opened anyway.
Ok, thanks for implementing the review comments. I also again read the paper because of the thing with opening new layers. So it is ok that the layer is opened and that the individuals are copied from the previous layer. But it is assumed in the paper that AgeInheritance == 1.
r13215 (not migrated) deleted ALPS branch
TODO
Decide if we should remove AgeInheritance parameter. We should discuss this. We could then also remove the WeightingReducer operator?Write unit testAdd sample for start page
Issue migrated from trac ticket # 2269
milestone: HeuristicLab 3.3.13 | component: Algorithms | priority: medium | resolution: done
2014-10-29 09:05:52: @NimZwei created the issue