Реализация базового бинарного генетического алгоритма в Java




Эти примеры строятся на Java. Если вы не установили Java, и вы хотите следовать вместе, пожалуйста, перейдите на страницу загрузки Java, https:// www.oracle.com/technetwork/java/javase/downloads/index.html

Давайте взглянем на классы, которые мы собираемся создать для нашей GA:

  • Население-управляет всеми людьми населения
  • Individual-управляет личностями
  • Алгоритм-управляет нашими эволюционными алгоритмами, такими как кроссовер и мутация
  • FitnessCalc-позволяет нам установить решение кандидата и рассчитать физическую форму человека

 

Население.ява

пакет simpleGa;

население общественного класса {

Individual [] Individual;

/ *
* Конструкторы
* /
/ / Создать популяцию
public Population (int populationSize, boolean initialise) {
individuals = new Individual [populationSize];
/ / Initialise population
if (initalise) {
//Loop and create individuals
for (int i = 0; i < size (); I++) {
Individual newIndividual = новый индивид();
newIndividual.generateIndividual ();
saveIndividual (I, newIndividual);
}
}
}

/ * Геттеры * /
публичное физическое лицо getIndividual (int index) {
return физические лица [индекс];
}

публичное лицо getFittest () {
Individual fittest = individuals[0];
/ / Loop through individuals to find fittest
for (int i = 0; i < size (); I++) {
if (fittest.getFitness() getFitness ()) {
fittest = getIndividual (i);
}
}
возвращение сильнейших;
}

/ * Публичные методы * /
/ / Get population size
public int size () {
return individuals.длина;
}

/ / Сохранить отдельные
публичные пустоты saveindivual (int index, Indiv Indiv Indiv) {
individuals[index] = indiv;
}
}

 

Человек.ява

пакет simpleGa;

общественный класс индивидуальное {

статические инт defaultGeneLength = 64;
отдельный байт[] гены = новый байт[defaultGeneLength];
// кэш
частная инт фитнес = 0;

// создать случайный отдельных
общественных пустоту generateIndividual() {
для (тип int я = 0; я < размер(); я++) {
байт ген = (байт) математика.round (Math.random ());
genes [I] = gene;
}
}

/ * Геттеры и сеттеры *
/ / используйте это, если вы хотите создавать людей с разными длинами генов
public static void setDefaultGeneLength (int length) {
defaultGeneLength = длина;
}

публичный байт getGene (int index) {
возвращает гены[index];
}

публичная пустота setGene (индекс int, значение байта) {
genes[index] = значение;
fitness = 0;
}

/ * Публичные методы * /
public int size () {
возвращаемые гены.длина;
}

public int getFitness () {
if (fitness == 0) {
fitness = FitnessCalc.getFitness (this);
}
вернуть фитнес;
}

@ Override
public String toString () {
Строка geneString ="";
for (int i = 0; i < size (); I++) {
geneString + = getGene(i);
}
вернуть генестринг;
}
}

 

Алгоритм.ява

пакет simpleGa;

общественный класс алгоритм {

/* га параметров */
частный статический окончательный двойной uniformRate = 0.5;
частный статический окончательный двойной mutationRate = 0.015;
частный статический окончательный инт tournamentSize = 5;
частный статический окончательный логический элитарность = истина;

/* методы государственного */

// развития населения
общественных статические населения evolvePopulation(население поп) {
Population newPopulation = новая популяция (pop.размер (), false);

/ / сохраняйте нашего лучшего персонажа
if (elitism) {
ньюпопуляция.saveindivual (0, pop.getFittest ());
}

/ / Перекрестная популяция
int elitismOffset;
if (elitism) {
elitismOffset = 1;
} else {
elitismOffset = 0;
}
/ / Loop over the population size and create new individuals with
/ / crossover
for (int i = elitismOffset; i size (); I++) {
Individual1 = tournamentSelection(pop);
Individu2 = tournamentSelection(pop);
Individual newIndiv = crossover (indiv1, indiv2);
ньюпопуляция.saveIndividual (I, newIndiv);
}

/ / Мутировавшая популяция
для (int i = elitismOffset; i size (); I++) {
мутировать (newPopulation.getIndividual (i));
}

вернуть ньюпопуляцию;
}

// Crossover individuals
private static Individual crossover (Individual indiv1, Individual indiv2) {
Individual newSol = new Individual ();
/ / Loop through genes
for (int i = 0; i size (); I++) {
//Crossover
if (Math.random () < = uniformRate) {
newSol.setGene (I, indiv1.getGene(i));
} else {
newSol.setGene (I, indiv2.getGene(i));
}
}
вернуть newSol;
}

/ / Mutate an individual
private static void mutate (Indiv Indiv) {
//петля через гены
для (int i = 0; i size (); I++) {
if (Math.random()) {
// Создание случайного гена
byte gene = (byte) Math.round (Math.random ());
индив.setGene (I, gene);
}
}
}

/ / Выбор лиц для кроссовера
private static individual tournamentSelection (Population pop) {
//создание турнирной совокупности
Population tournament = New Population(tournamentSize, false);
/ / за каждое место в турнире получают случайного персонажа
за (int i = 0; i < tournamentSize; I++) {
int randomId = (int.random () * pop.размер ());
турнир.saveindivual (I, pop.getIndividual (randomId));
}
/ / Получить наиболее приспособленных
Индивидуальные сильнейшие = турнир.getFittest ();
возвращение наиболее приспособленных;
}
}

 

FitnessCalc.ява

пакет simpleGa;

открытый класс FitnessCalc {

static byte [] solution = new byte [64];

/ * Public методы * /
/ Set a candidate solution as a byte array
public static void setSolution (byte [] newSolution) {
решение = newSolution;
}

/ / Чтобы сделать его проще, мы можем использовать этот метод, чтобы установить наше решение кандидата
/ / со строкой 0s и 1S
static void setSolution (string newSolution) {
решение = новый байт [newSolution.length ()];
/ / Loop через каждый символ нашей строки и сохранить его в наш байт
// массив
для (int i = 0; i длина (); I++) {
String character = newSolution.подстрока (i, i + 1);
if (character.содержит ("0") | | символ.содержит ("1")) {
решение [I] = Byte.parseByte (символ);
} else {
решение [i] = 0;
}
}
}

/ / Рассчитать inidividuals fittness путем сравнения его с нашим кандидатом решение
статический int getFitness (индивидуальный) {
int fitness = 0;
/ / Loop через наши индивидуумы генов и сравнить их с нашими кадидатами
для (int i = 0; i размер () & & i length; I++) {
if (individual.getGene (i) == решение[I]) {
fitness++;
}
}
вернуть фитнес;
}

/ / Get optimum fitness
static int getMaxFitness () {
int maxFitness = раствор.длина;
максфитнесс возвращения;
}
}


Теперь давайте создадим наш основной класс.

Во-первых, мы должны установить решение кандидата (не стесняйтесь, чтобы изменить это, если вы хотите).

FitnessCalc.setSolution("1111000000000000000000000000000000000000000000000000000000001111");


Теперь мы создадим наше первоначальное население, население 50 должно быть в порядке.

Популяция myPop = новая популяция (50, правда);


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

int generationCount = 0;
while(myPop.getFittest ().getFitness() getMaxFitness ()) {
generationCount++;
система.из.println ("Generation:" +generationCount+ "Fittest:" +myPop.getFittest ().getFitness ());
myPop = алгоритм.evolvePopulation (myPop);
}
система.из.println ("решение найдено!);
система.из.println ("Generation:" +generationCount);
система.из.println ("гены:");
система.из.println (myPop.getFittest());


Вот полный код для нашего основного класса:



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: