В этой статье мы выполним реализации генетического алгоритма с пакетом GA в R. Пакет GA - это пакет, написанный на C ++. В качестве первого примера давайте попробуем оценить число Эйлера, которое в математике известно как е, с помощью генетического алгоритма. Число Эйлера - это фиксированное число, которое занимает важное место в инженерных приложениях, оно встречается во многих местах в задачах сложных процентов, теории вероятностей и даже в университетах, таких как вычисление колоколообразной кривой, оно состоит из миллионов цифр и он продолжается как 2.71828182845…

Во-первых, давайте воспользуемся следующей командой для установки пакета GA.

install.packages(“GA”)

Теперь, когда мы загрузили пакет, давайте вызовем его.

require(“GA”)

Самая важная часть применения генетического алгоритма - определение функции приспособленности. Чтобы определить эту функцию, сначала давайте кратко объясним, откуда берется число e. Допустим, у нас есть 1 TL. Если мы положим деньги в банк, который дает 100% годовых, через год у нас будет 2 TL. Если эта годовая процентная ставка составляет 50% -50% два раза в год, наши деньги будут составлять 2,25 турецких лир в конце года. Точно так же, если процентная ставка составляет 25% четыре раза в год, наши деньги в конце года составляют 2,441… TL. Если мы сократим период обработки процентов, и проценты, начисляемые каждую неделю, будут 2 692… в конце года, а проценты, которые начисляются каждый день, будут 2 714… в конце года. Мы видим, что это число близко к числу e. Если мы запишем это как формулу (1 + 1 / n), мы можем записать ее как (1 + 1 / n) ^ n. Теперь мы можем создать нашу фитнес-функцию. Во-первых, мы можем определить форму нашей хромосомы в двоичном кодировании. Давайте сделаем количество генов 10. Если мы вычтем только что найденную формулу из действительного числа e и умножим абсолютное значение на «минус», мы получим функцию пригодности, которую ищем. Мы умножаем на минус, потому что по умолчанию пакет GA настроен на максимальное увеличение, но мы пытаемся уменьшить разницу до нуля, поэтому мы минимизируем.

fitness_function<-function (ch){
n<-binary2decimal(ch[1:10])
return (-abs(2.718281-(1+(1/n))^n))}

Поскольку мы определили функцию приспособленности, давайте определим тип хромосомы, функцию приспособленности, количество генов, из которых будет состоять хромосома, максимальную итерацию, тип отбора, размер популяции и элитарность. Элитарность относится к копированию лучших хромосом или хромосом в популяции, как они есть для новой популяции. Я не применял его для этого примера, но можно указать такие значения, как 1–2. Коэффициент кроссовера составляет 0,8, а частота мутаций - 0,1. Мы можем изменить эти значения, если захотим. Тип выбора - колесо рулетки, тип кроссовера - одноточечный, а тип мутации - однородный случайный.

gaControl(“binary”=(list(selection=”ga_rwSelection”,
crossover=”gabin_spCrossover”,
mutation=”gabin_raMutation”)))
myga<-ga(type = “binary”,
fitness = fitness_function,
nBits = 10,
maxiter = 3000,
pcrossover = 0.8,
pmutation = 0.1,
maxFitness = 0,
popSize = 100,
elitism = 0)

Теперь, когда мы определили наши операторы, мы можем запустить модель.

«Средние» значения показывают среднее значение пригодности для текущей популяции, «Наилучшие» значения справа указывают на значение пригодности для текущего лучшего человека. А теперь давайте посмотрим на ценность лучшей хромосомы.

bestch<-myga@solution
n<-binary2decimal(bestch[1:10])
print((1+(1/n))^n)
[1] 2.715632

Как видите, у нас значение, близкое к 2,718281. Мы можем запросить сводную таблицу и построить график нашего решения, если захотим.

summary(myga)
plot(myga)

Генетический алгоритм может не дать наилучшего решения с первого раза. Для лучшего решения может потребоваться изменить операторы, количество итераций или скорость кроссовера и мутаций.

Теперь второй пример - это функция Griewank, которая содержит множество локальных оптимумов, которые обычно используются при тестировании оптимизации в математике. На следующих двух рисунках эта функция показана с разными интервалами. На первом рисунке он выглядит законченным, а на втором - приближенным.

Снова определим фитнес-функцию.

fitness_function<-function(ch){
i<-c(1:length(ch))
sum<-sum(ch²/4000)
multi<-prod(cos(ch/sqrt(i)))
return (-(sum-multi+1))}

Теперь мы можем построить нашу модель. На этот раз давайте определим хромосомы как реальные значения, нижние-верхние пределы - 50 и 50, размер популяции - 100, а количество поколений - 4000. Если мы сами не определяем операторы, линейное масштабирование для выбора, арифметика кроссовер для кроссовера и равномерный случайный для мутации установлены по умолчанию. Функцию gacontrol () можно использовать для проверки значений по умолчанию. Давайте попробуем запустить наш алгоритм, не меняя настройки по умолчанию.

myga<-ga(type=”real-valued”,
fitness = fitness_function,
lower=c(-50,-50),
upper=c(50,50),
popSize = 100,
maxiter = 4000,
maxFitness = 0)
summary(myga)

Как и ожидалось, нам удалось получить очень близкие к нулю значения. Опять же, лучшие результаты можно получить, изменив такие значения, как оператор, размер популяции, количество итераций. Вы можете запустить код виньетки («GA») для получения дополнительной информации о пакете GA и его использовании.

Для документации по пакету GA:

Https://cran.r-project.org/web/packages/GA/GA.pdf

Для кодов ресурсов пакета GA:

Https://github.com/luca-scr/GA

ССЫЛКИ

Изображение функции Griewank: https://www.sfu.ca/~ssurjano/griewank.html

Информация о числе Эйлера: https://tr.wikipedia.org/wiki/E_sayısı

Ферхат Метин