UPDATE: This article has now been integrated into the GAF documentation. The documentation can be found here.
A piece of research completed in conjunction with the De Montfort University in 2013 demonstrated how the Genetic Algorithm Framework (GAF) could be used with a Software Defined Radio (SDR) system, to provide automatic frequency control (AFC).
The aim of AFC is to ensure that a radio system stays tuned to the desired frequency in conditions where the frequency is subject to change. The research demonstrated that a genetic algorithm (GA) can perform this task. In addition, the research showed how the GA can also handle very large changes in frequency such as the channel hopping nature of Cognitive Radio systems.
During the research, a Memory Operator was used in conjunction with an Auto-Mutate operator in order to improve the algorithm. The operator was subsequently added to the Genetic Algorithm Framework (GAF). This post describes how the can be used to improve GA performance.
How it Works
The operator maintains a ‘memory’ of solutions and ensures that the best solution in that memory is included in the GA population if it is better than the best in the population. The memory is kept up to date with good solutions during the GA run.
In an intelligent radio system such as the one described in the research cited above, a GA is used to search for and track a radio signal that is jumping around the radio spectrum (channel hopping). A GA without the memory operator needs to re-converge on the new frequency for each channel hop of the radio transmitter. Adding the memory operator tries to ensures that if a channel is reused it will be found in memory and will be added to the population causing the GA to instantly converge on the new frequency. If the current channel hasn’t been used before, the GA will try and converge in the normal manner.
If the GA landscape is constantly changing such that the GA has to re-converge on a new solution, the memory operator could be used to improve the performance. As with all of these things experimentation will determine the best usage.
The following code adds the memory operator to the GA, sets the memory capacity to 100 ‘memories’ and specifies that the memory will be updated every 10 generations. The code may be more easily understood if read in conjunction with articles GAF Part 2 and GAF Part 3
var memory = new Memory(100, 10); ga.Operators.Add(memory);