Name already in use
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
GAlib: A C++ Genetic Algorithm Library Copyright (c) 1994-1996 MIT, 1996-2005 Matthew Wall
GAlib is a C++ library of genetic algorithm objects. With GAlib you can add evolutionary algorithm optimization to almost any program using any data representation and standard or custom selection, crossover, mutation, scaling, and termination methods.
The library requires reasonable C++ compiler. I have tested GAlib on MacOS using Metrowerks and Symantec development environments, MacOSX using gcc2/3, DOS/Windows using Borland C++ and MS VC++, and various UNIX platforms using g++, egcs, CC, DCC, xlC, and aCC.
Graphic examples (XWindows/Motif and MS Windows) are available, as are parallel, distributed implementations using PVM. There are about 30 examples that illustrate various ways to use GAlib on a variety of problems.
There are two things to build: the library and the examples. Here is the short version of how to build and test everything:
On windows, with MS VC++,
On windows, with Borland,
If that does not work, then here are the files you might have to modify:
- ga/gaconfig.h — this contains the macros that control library options
- makevars — compiler and linker options for each compilier/os
- makefile — the actual build rules for putting everything together
If you still have problems, look at Installation.html in the doc directory.
Complete documentation in html format is available in the doc directory. The distribution site contains PDF and PostScript(tm) versions.
С++ библиотека компонентов генетических алгоритмов
Бессонов, Д. В. С++ библиотека компонентов генетических алгоритмов / Д. В. Бессонов. — Текст : непосредственный // Молодой ученый. — 2014. — № 6 (65). — С. 73-77. — URL: https://moluch.ru/archive/65/10815/ (дата обращения: 13.03.2023).
В статье дается начальное представление о библиотеке GAlib, которая позволяет решать задачи с помощью генетических алгоритмов. Рассматриваются основные возможности и классы библиотеки, также рассматриваются особенности установки и настройки библиотеки. Показан базовый пример работы генетического алгоритма.
Ключевые слова:генетические алгоритмы, библиотека GAlib.
В данной работе рассматривается С++ библиотека компонентов генетических алгоритмов (GAlib) [1]. Далее библиотека или GAlib. Рассматриваемая библиотека содержит множество различных генетических алгоритмов, а также вспомогательных инструментов для решения оптимизационных задач. GAlib разработана Мэтью Волом (Matthew Wall), затем разработка и поддержка переданы Массачусетскому технологическому институту (MIT). С тех пор библиотека стала свободно распространяемой с возможностью использования в коммерческих программных продуктах.
В начале работы с библиотекой следует изучить возможности и структуру всех классов [2]. Если изучить исходный код и документацию библиотеки, можно заметить строгое разделение классов по группам, а также обобщенность, что в дальнейшем позволяет применить библиотеку для различных видов задач. Первое что следует изучить это группу классов, реализующих генетические алгоритмы (рис. 1). Основным абстрактным классом является GAGeneticAlgorithm. В данном классе содержатся все необходимые методы для реализации генетических алгоритмов. Такими методами являются инициализация популяции, установка и извлечение функций кроссинговера и мутации, установка и извлечение функций выборки, и масштабирования и многие другие функции необходимые алгоритмам. Самая простая реализация генетического алгоритма в данной группе компонентов — это класс GASimpleGA. Простая реализация генетического алгоритма наследует все методы основного абстрактного класса GAGeneticAlgorithm. Также данный класс включает методы установки и извлечения параметра перехода новых решений в новое поколение. Согласно документации GAlib класс GASimpleGA реализует генетический алгоритм, где популяция не пересекающаяся, описанный Голдбергом. Следующий класс реализации генетического алгоритма. Класс GASteadyStateGA реализует алгоритм описанный Де Йонгом, согласно документации GAlib. В данном алгоритме применяется пересекающаяся популяция. В классе предусмотрены методы установки количества переходящих решений в новое поколение. В отличие от предыдущего класса, GAIncrementalGA применяет другой способ пересечения популяции, где за каждую генерацию нового поколения пересекаются одно или два решения. Данный алгоритм также описан Де Йонгом. Последний класс GADemeGA содержит мульти популяцию или независимые популяции, т. е. в данном классе реализуется параллельный генетический алгоритм. Все перечисленные классы позволяют решить достаточно большое количество задач. Но если имеющихся классов будет недостаточно для поставленной задачи, архитектура GAlib позволяет реализовать пользовательский генетический алгоритм на основе абстрактного класса GAGeneticAlgorithm или четырех перечисленных.

Рис. 1. Иерархия классов генетических алгоритмов
К следующей группе компонентов относятся классы, реализующие схемы масштабирования (рис. 2). В библиотеке таких схем всего 5, но есть возможность реализации пользовательских схем. Все схемы основываются на одном классе — GAScalingScheme. Данный класс устанавливается в объект популяции. Задача масштабирования — отслеживать оценку приспособленности каждого решения в популяции. GANoScaling — самый простой способ без отслеживания. GALinearScaling — линейный метод масштабирования описанный Голдбергом. GASigmaTruncationScaling — данный метод используется, когда предполагается, что оценочная функция будет отрицательной. GAPowerLawScaling — используется экспоненциальная зависимость. GASharing — данный метод используется, чтобы производить видообразование.

Рис. 2. Иерархия классов масштабирования популяции
Методы выборки служат для генерации пула решений, чтобы производить над ним генетические операторы. В библиотеке существуют 6 методов выборки (рис. 3). Хотя данных набор методов достаточен для решения любых задач, в библиотеке предусмотрено создание пользовательских методов выборки. GARankSelector — ранговый способ выборки производит отбор лучшего решения каждый раз при выполнении данной операции. GARouletteWheelSelector — классический метод выборки, работает по принципу рулетки. Для каждого решения в текущей популяции вычисляется функция приспособленности, на круговой диаграмме отмечается вероятность выборки, в конце производится случайный выбор решений. GATournamentSelector — другой способ выборки, для своей работы производит отбор двух решений с помощью выборки методом рулетки (GARouletteWheelSelector), затем выбирает одно решение с высокой оценкой приспособленности. GADSSelector — детерминированная дискретная выборка использует двухступенчатую процедуру отбора. На первом этапе вычисляется ожидаемое представление каждого решения. Временная популяция наполняется решениями с самой высокой ожидаемой оценкой. Любые оставшиеся позиции заполняются первыми отсортированными оригинальными решениями, затем выбирается самое лучшее решение в списке. На втором этапе производится универсальный случайный выбор из временной популяции. GASRSSelector — метод стохастической выборки остатка. Этапы работы алгоритма такие же, как у предыдущего метода, за исключением того, что любые дробные представления решений используют функцию правдоподобия. GAUniformSelector — стохастическая универсальная выборка.

Рис. 3. Иерархия классов методов выборки
В библиотеке GAlib представлено большое количество классов для кодирования решений. Все классы основываются на абстрактном классе GAGenome. Способы кодирования представлены практически для любых видов задач (рис. 4). Классы GA1DBinaryStringGenome, GA2DBinaryStringGenome, GA3DBinaryStringGenome представляют классическое представление решений в виде бинарной строки, т. е. один элемент решения представляет собой «0» или «1». Каждый из классов реализует одномерную строку, двухмерную строку или трехмерную строку соответственно. Также все 3 класса основываются на заранее подготовленном классе GABinaryString. Классы GA1DArrayGenome, GA2DArrayGenome, GA3DArrayGenome представляют массивы решений, одномерный, двухмерный, трехмерный массивы соответственно. Каждый из этих классов могут содержать произвольный объект. Также все 3 класса основываются на заранее подготовленном классе GAArray. Для упрощения определенных задач на основе класса GA1DArrayGenome созданы GAStringGenome и GARealGenome, которые представляют собой массив символов (строка) и массив вещественных чисел. GATreeGenome — представляет бинарное дерево, в котором кодируется решение. GAListGenome — представляет однонаправленный список. Как видно из перечисленных классов библиотека содержит достаточно большое количество способов кодирования. Поэтому с помощью библиотеки GAlib можно решать задачи, начиная от простейшего поиска экстремума функции до обучения искусственной нейронной сети.

Рис. 4. Иерархия классов методов кодирования решений
Чтобы начать работать с библиотекой GAlib, необходимо выполнить следующие действия [3]. Т. к. библиотека распространяется исключительно в исходных кодах, предварительно необходимо произвести компиляцию. Последняя версия библиотеки располагается на официальном сайте. После загрузки zip-архива, архив необходимо разархивировать в каталог, например в «C:\galib247». Библиотеку можно скомпилировать практически под любую операционную систему, где существуют компиляторы C++. В данной работе, чтобы произвести компиляцию библиотеки, используется среда разработки Visual Studio Express 2013 под управлением Windows 7. В среде разработки создается новый проект с названием «Library», размещение проекта в каталоге «C:\galib247», тип проекта «Visual C++/Win32/Static library». Т. к. библиотека уже отлажена и готова к применению, выбирается тип компиляции «Release». В проект добавляются все файлы исходного кода с расширением «*.C» из каталога «C:\galib247\ga». В настройках проекта в VC++ Directories указывается путь к заголовочным файлам в поле Include Directories. Здесь указывается «C:\galib247». Также в настройках проекта в разделе Code Generation в поле Runtime Library указывается параметр \MT. В настройках проекта в разделе C/C++ — Advanced в поле Calling Convention указывается параметр /Gz. В Language Enable Run-Time Type Information указывается No (/GR-). В Command Line указывается дополнительный параметр /c. В Advanced в поле Compile As указывается /TP. После всех выставленных настроек можно собрать проект. Если все значения в настройках корректно выставлены, то библиотека собирается без ошибок, а итоговый собранный файл Library.lib должен располагаться в каталоге C:\galib247\Library\Release\. Готовый файл библиотеки теперь доступен для решения оптимизационных задач с помощью генетических алгоритмов. Чтобы решать задачи с помощью данной библиотеки, создается новый проект, подключается файл библиотеки Library.lib, подключаются заголовочные файлы GAlib, а затем можно работать с библиотекой GAlib с помощью API.
Простейшая программа на языке С++ выглядит следующим образом:
GA2DBinaryStringGenome genome(width, height, Objective);
std::cout << ga.statistics() << std::endl;
Objective представляет целевую функцию, где производится подсчет приспособленности каждого решения. В данном примере используется простейший генетический алгоритм с представлением решения в виде двухмерной бинарной строки. Вызов ga.evolve(); производит активацию алгоритма, после завершения работы можно вывести информацию о найденном решении с помощью вызова ga.statistics(). Работать с библиотекой GAlib достаточно просто, основные задачи пользователя определить целевую функцию, выбрать подходящий алгоритм и задать необходимые параметры. Например, параметры могут быть следующими:
Из примера видно, что для некоторого генетического алгоритма задается способ масштабирования GASigmaTruncationScaling, устанавливается размер популяции popsize, устанавливается количество поколений ngen для алгоритма и устанавливается вероятность мутации pmut и кроссинговера pcross. Здесь показан простой пример работы алгоритма, для детального изучения всех возможностей в документации библиотеки представлен большой набор примеров различной сложности [4].
В заключении стоит отметить, что работать с библиотекой достаточно легко, несмотря на сложную установки и настройку библиотеки GAlib. В библиотеке содержатся практически все необходимые для работы генетические алгоритмы. Но в случае нехватки нужного алгоритма, библиотека позволяет расширить основной набор алгоритмов за счет парадигмы объектно-ориентированного программирования. Т. к. библиотека распространяется в виде исходных кодов, появляется возможность собрать библиотеку и работать с ней на любой операционной системе. Также стоит отметить, что подобная архитектура библиотеки существует только в GAlib, но сама библиотека написана на языке программирования С++, поэтому программист должен уметь работать с таким языком программирования, в противном случае стоит изучить другую библиотеку генетических алгоритмов.
GALib
GALib is an arterial intelligence hobby project I created in 2010. It provides a foundation for genetic algorithm driven algorithms. It is written in C#, completely open source and available under the GNU General Public License.
Latest version: 0.1 (2010-01-22)
Download
You can also download the code directly via SVN from the SourceForge source code repository, at https://csgalib.svn.sourceforge.net/svnroot/csgalib. From a command line, you can call the following:
svn checkout https://csgalib.svn.sourceforge.net/svnroot/csgalib
Background
I created this library while working on Skynet, an application that solves the Travelling Salesman Problem. The idea for creating that application came to me after reading the first part of Bio-Inspired Artificial Intelligence by Dario Floreano and Claudio Mattiussi. I figured I needed to do an implementation of what I’ve read to test myself. All work was done in my free time.
Using the library
This section explains how to create your own GA implementations using GALib. If you are not familiar with how genetic algorithms work, you are advised to first have a good look at this Wikipedia article and related pages. This section will first introduce you how the actual evolution is done, and then how to create your own specific implementation by specifying an individual type.
Class diagram
Population class
The Population class is the core of GALib. It is a collection of individuals of a type you specify, on which evolution (selection and reproduction) can be done. The evolution of the population is done on a background thread, and can be done with rank based selection, truncated rank based selection, roulette wheel selection and tournament selection. Events are fired every time a new generation has been created, a new fittest individual has been found or the evolution is complete.
Constructor
The constructor allows you to specify some general properties that are likely to be different in multiple use cases. These are:
- size — Optional. Int32. The size of the population (# of individuals). Defaults to 100.
- generations — Optional. Int64. The maximum amount of generations in the evolution. Defaults to 100000.
- stagnationLimit — Optional. Int64. The maximum amount of generations with no fitness improvement. Defaults to 10000.
Population will automatically populate itself with size amount new individuals. Since Population is a list of individuals, you can add, remove, and manipulate members yourself. This is however highly discouraged once the evolution is running.
Evolution methods
You can choose between several selection algorithms.
1. Rank based selection
Rank based selection allocates reproduction slots to individuals based on their fitness rank. You can initiate rank based selection with the DoRankBasedSelection method. Similarly you can do truncated rank selection, rank selection that only holds into account the n first individuals, by calling the DoTruncatedRankSelection method, which accepts an Int32 parameter indicating n.
2. Roulette wheel based selection
Roulette wheel selection allocates reproduction slots to individuals proportional to their fitness. You can initiate roulette wheel selection with the DoRouletteWheelSelection method.
3. Tournament based selection
Tournament based selection consists of allocating reproduction slots to the best individuals of a randomly chosen subsets. Population contains several overloaded DoTournamentBasedSelection methods, allowing you holds tournaments of a fixed size, or a variable size between two bounds, both specified either as amount of individuals, or percentage of the population size.
You can stop the evolution by calling the CancelEvolution method. The worker thread on which evolution is done will finish after the current generation has been completed.
After every generation, the individuals will be sorted according to their fitness, fittest first. This means that populationInstance[0] will yield you the fittest individual for that generation, and populationInstance[populationInstance.Count — 1] will get you the least fit member. You can also use GetFittest to get a range of fittest individuals. It accepts an Int32 indicating the size of the range, and a Boolean indicating whether elites should be included.
Events
The Population class contains 3 events that will be fired at various points through the evolutionary process.
- GenerationComplete (Object sender, GenerationCompleteEventArgs<IndividualType> e)
Occurs every time a generation is complete. This means selection, reproduction and fitness determination have happened, in that order. GenerationCompleteEventArgs contains the current generation number and fittest individual of the generation.
- NewFittest (Object sender, NewFittestEventArgs<IndividualType> e)
Occurs when a new overall fittest individual is found. NewFittestEventArgs contains the current generation number and overall fittest individual.
- EvolutionComplete (Object sender, EvolutionCompleteEventArgs<IndividualType> e)
Occurs when the evolution stops, either by reaching the maximum amount of generations, the stagnation limit, or user cancellation. EvolutionCompleteEventArgs contains the current generation number, the overall fittest individual and a boolean indicating whether the evolution was cancelled by the user.
Properties
The underneath list contains the most important public properties of the Population class, which allow you to drastically change the working of the algorithm.
| Property name | Type | Summary | Requirements |
|---|---|---|---|
| Size | Int32 | Gets or sets the size of the population (# of individuals). | >0 |
| MaximunGenerations | Int64 | Gets or sets the maximum amount of generations in the evolution. | >0 |
| StagnationLimit | Int64 | Gets or sets the maximum amount of generations with no fitness improvement. | >0 |
| MutationRatio | Int32 | Gets or sets the percentage of mutation applied to the genotype of every individual during every generation. | [0,100[ |
| ElitismPercentage | Int32 | Gets or sets the percentage of elites in the population. Elites are the best individuals in a population, and are granted survival into the next generation. | [0,100] |
| ElitistsAmount | Int32 | Gets or sets the amount of elites in the population. Elites are the best individuals in a population, and are granted survival into the next generation. | [0, pop size] |
| RemoveDuplicates | Boolean | Gets or sets if duplicates (identical individuals) should be prevented during the evolution. | |
| RemoveTwins | Boolean | Gets or sets if duplicate twins (identical individuals from the same parents) should be prevented during crossover. | |
| OverallFittest | IndividualType | Gets or sets if overall fittest individual. |
Individuals
For your own implementation, you need to specify your own individual type(s). The definitions for these types contain initialization, mutation and crossover methods, as well as the genotype specification and fitness function. GALib provides scaffolding in the form of an IIndividual interface and Individual abstract class. You MUST implement the interface in your individual type definition to be able to create a population of your type. You CAN (most likely should) inherit from Individual, which will spare you some basic work, and implement IIndividual for you.
Islands
I started creating an IslandGroup class to enable simultaneous but separated evolution on multiple ‘islands’. However, I did not finish this class
Points of Interest
Since my main motivation for creating this library was exercise, I learned a lot from building it. This is the first C# library I’ve ever written, as well as the first time I’ve done any GA programming (or AI in general). Abstracting the library in a way so that it can be used for GA in general was very interesting, and required me to expanded my knowledge of how to use interfaces and inheritance and use generics in a non-basic way for the first time.
Galib c как работать
Возможно, у вас все заработает с этим файлом ga.lib. Если нет, то эта инструкция для вас.
- Скачать библиотеку отсюда
- Распаковать архив
- Запустить командную строку MSVC
- Перейти в папку, куда был распакован архив.
- Выполнить команду nmake /f makefile.vcpp
- После выполнения команды в папке ga появится файл ga.lib , который вам и нужен
Действия
© Олег Дашевский со товарищи, 2010–2023. Сайт работает на платформе Coursette