Я не буду представлять подробные принципы и конкретные определения генетических алгоритмов здесь. Если вы хотите знать, вы можете использовать Baidu, чтобы узнать его. Здесь я кратко представлю ваше понимание генетических алгоритмов. В этой статье используются бинарные правила для кодирования генов.
Алгоритм идеи:
Генетический алгоритм относится к теории эволюции Дарвина и считает, что виды развиваются в позитивном направлении (выживание наиболее подходящего), поэтому можно считать, что после достаточного количества алгебры полученное максимальное значение очень близко к фактическому максимальному значению.
Алгоритм шаги:
Алгоритм реализация гена
1. Индивидуальная популяция (здесь рассматривалась в хромосомах), у людей мы добавляем два атрибута к этому индивидуумам: пригодность (значение функции), соответствующую гену и гену индивидуума.
Общедоступная хромосома класса {private Boolean [] Gene; // последовательность генов частная двойная балла; // Соответствующая оценка функции} 2. Сгенерировать последовательности генов случайным образом. Независимо от того, является ли каждая позиция гена 0 или 1, это совершенно случайный способ его достижения.
public Chromosome (int size) {if (size <= 0) {return; } initGenesize (size); for (int i = 0; i <size; i ++) {gene [i] = math.random ()> = 0,5; }} private void initgenesize (int size) {if (size <= 0) {return; } gene = new Boolean [size]; } 3. Преобразование гена в соответствующее значение, например, число, соответствующее 101, равно 5, а операции битов используются здесь для его реализации.
public int getNum () {if (gene == null) {return 0; } int num = 0; for (boolean bool: gene) {num << = 1; if (bool) {num += 1; }} return num; } 4. Если происходит мутация гена, местоположение мутации полностью реализуется случайным образом. Принцип мутации состоит в том, чтобы измениться от 1 до 0 и 0 на 1.
public void -мутация (int num) {// разрешить мутацию int size = gene.length; for (int i = 0; i <num; i ++) {// ищите местоположение мутации int at at = ((int) (math.random () * size)) % size; // значение после мутации Boolean Bool =! Gene [AT]; ген [at] = bool; }} 5. Гены клонирования используются для получения следующего поколения. Этот шаг - скопировать существующие гены.
Публичный статический клон хромосомы (конечная хромосома C) {if (c == null || c.gene == null) {return null; } Хромосомная копия = new Chromosome (); copy.initgenesize (c.gene.length); for (int i = 0; i <c.gene.length; i ++) {copy.gene [i] = c.gene [i]; } return Copy; } 6. Оба родителя производят следующее поколение, и здесь два человека производят два отдельных потомства. Какой специфический ген отличается от студента, совершенно случайный.
Публичный статический список <Хромосома> генетическая (хромосома P1, хромосома P2) {if (p1 == null || p2 == null) {// Есть одна из хромосом, которая пуста и не производит возврата следующего поколения NULL; } if (p1.gene == null || p2.gene == null) {// Существует одна из хромосом, которая не имеет последовательности генов и не производит возврата следующего поколения NULL; } if (p1.gene.length! = p2.gene.length) {// Длина последовательности гена хромосомы не производит возврата следующей поколения NULL; } Хромосома C1 = клон (P1); Хромосома C2 = клон (P2); // Создать положения поперечного замены случайным образом int size = c1.gene.length; int a = ((int) (math.random () * size)) % размер; int b = ((int) (math.random () * size)) % размер; int min = a> b? Б: А; int max = a> b? A: B; // гены CroMex в позициях для (int i = min; i <= max; i ++) {boolean t = c1.gene [i]; c1.gene [i] = c2.gene [i]; c2.gene [i] = t; } List <chromosome> list = new ArrayList <chromosome> (); list.add (c1); list.add (c2); вернуть список; } Алгоритм реализованный алгоритм
1. Для генетических алгоритмов нам необходимо иметь соответствующие популяции и некоторые константы, которые мы должны установить: номер популяции, длина гена, количество мутаций генов, скорость мутаций генов и т. Д. Для получения подробной информации, пожалуйста, обратитесь к следующему коду:
Публичный абстрактный класс Geneticalgorithm {Private List <chromosome> популяция = новый ArrayList <Hromosome> (); // Popult Private Int Popsize = 100; // Число чистого генового генового; // максимальная длина частной int maxiternum = 500; // максимальная иерация частной двойной мутации = 0,01; // вероятность мутации геновой мутации privatation privatation int -максимация/3; Асинхронная длина частная генерация int = 1; // Сколько поколений в настоящее время унаследовано? BestScore; // Best Score Private Double ShodScore; // худший балл частного двойного TotalScore; // Общий балл частного двойного среднего значения; // Средний балл частного двойного x; // Записать лучшее значение x в историческом населении частного двойного Y; // Записывает наилучшее значение Y в исторической популяции частной int in genei; // алгебра, где находится XY} 2. Инициализируйте население. В начале генетического алгоритма нам нужно инициализировать первоначальную популяцию, которая является первоначальным первым поколением.
private void init () {for (int i = 0; i <popsize; i ++) {popult = new ArrayList <chromosome> (); Хромосома Chro = новая хромосома (генесализация); Население. Адд (Chro); } cacultescore (); } 3. После того, как первоначальная популяция существует, нам необходимо рассчитать пригодность населения, а также лучшую пригодность, худшую пригодность и среднюю физическую форму и т. Д.
private void cacultescore () {setchromosomescore (population.get (0)); bestscore = population.get (0) .getScore (); худший шкал = популяция. Get (0) .getScore (); TotalScore = 0; для (хромосома chro: популяция) {setchromosomescore (chro); if (chro.getScore ()> bestScore) {// установить лучшее значение гена bestScore = chro.getScore (); if (y <bestscore) {x = changex (Chro); y = bestScore; Genei = поколение; }} if (chro.getScore () <owdscore) {// Установить наихудшее значение гена hiseScore = chro.getScore (); } totalscore += chro.getScore (); } vageragescore = totalscore / popsize; // Среднее значение, вызванное проблемами точности, превышает наилучшее значение, установите среднее значение для наилучшего значения среднего значения = средние значения> BestScore? BestScore: среднее значение; } 4. При расчете индивидуальной пригодности нам необходимо рассчитать соответствующее значение y на основе гена. Здесь мы установили два абстрактных метода для реализации конкретной реализации путем реализации класса.
private void setchromosomescore (Chromosome Chro) {if (chro == null) {return; } Double x = Changex (Chro); Double y = caculatey (x); chro.setscore (y); } / ** * @param chro * @return * @description: преобразовать двоичный в соответствующий x * / public abstract double changex (Chromosome Chro); / ** * @param x * @return * @description: вычислить значение y на основе x y = f (x) */ public abstract double caculatey (double x); 5. После расчета фитнеса населения нам необходимо использовать метод азартных игр, чтобы выбрать людей, которые могут создать следующее поколение. Здесь существует условие, которое только в том случае, если физическая пригодность не меньше, чем средняя пригодность, будет родиться следующее поколение (самое подходящее выживание).
Частная хромосома getParentChromosome () {Double Slice = math.random () * totalscore; двойная сумма = 0; для (хромосома chro: популяция) {sum += chro.getScore (); // перейти к соответствующей позиции, а пригодность не меньше средней пригодности, если (sum> slice && chro.getScore ()> = ageragescore) {return chro; }} return null; } 6. После выбора людей, которые могут производить следующее поколение, вы должны спариваться, чтобы создать следующее поколение.
private void evolve () {list <chromosome> childpopulation = new ArrayList <Hromosome> (); // генерировать популяцию следующего поколения, в то время как (ChildPopulation.Size () <popSize) {хромосома P1 = getParentChroMosome (); Хромосома P2 = getParentChromosome (); Список <Хромосома> дети = хромосома. Генетическая (P1, P2); if (дети! = null) {for (Chromosome Chro: дети) {ChildPopulation.Add (Chro); }}} // Заменить старую популяцию новым списком населения <Хромосома> t = популяция; Население = детскоепопуляция; t.clear (); t = null; // мутация генной мутации (); // рассчитать пригодность нового населения Cacultescore (); } 7. Генетические мутации могут возникать в процессе продуцирования следующего поколения.
private void mutation () {для (хромосома chro: популяция) {if (math.random () <mutationrate) {// гена мутации возникает int mutationnum = (int) (math.random () * maxmutionnum); Chro.muth (мутация); }}} 8. Повторите вышеуказанные шаги один за другим.
public void caculte () {// Инициализировать генерацию популяции = 1; init (); while (поколение <maxiternum) {// популярная генетическая эволюция (); print (); поколение ++; }}Напишите классы реализации
Поскольку класс вышеуказанного генетического алгоритма является абстрактным классом, нам необходимо написать класс реализации для конкретного случая, предполагая, что мы рассчитываем максимальное значение y = 100-log (x) на [6,106].
1. Мы предполагаем, что длина гена составляет 24 (длина гена определяется эффективной длиной необходимого результата), поэтому соответствующий двоичный максимум составляет 1 << 24. Мы делаем следующие настройки
public class GeneticalGorithMtest Extends GeneticalGorithm {public Static Final int num = 1 << 24; public genecitygorithmtest () {super (24); }} 2. Реализуйте абстрактный метод значения x
@Override Public Double Changex (Chromosome Chro) {// TODO Автопогенетированный метод return ((1,0 * chro.getnum () / num) * 100) + 6; } 3. Реализуйте абстрактный метод Y
@Override public Double Caculatey (Double x) {// todo Автопогенерированный метод return return 100 - math.log (x); }Результаты бега
Думать о генетических алгоритмах
Я прочитал много знакомств в генетических алгоритмах. Оптимальные решения, упомянутые выше, являются наиболее значениями последнего поколения. У меня есть вопрос. Почему я знаю, что большинство значений среди всех приведенных выше полос, то есть значений XY в программе, почему я не могу использовать значения XY в качестве конечного значения результата генетического алгоритма?
Полный код
1. Класс хромосом
/ ***@Описание: генетическая хромосома*/ package com.lulei.genetic.algorithm; импортировать java.util.arraylist; импортировать java.util.list; Общедоступная хромосома {private boolean [] gene; // последовательность генов частная двойная балла; // Соответствующая оценка функции public getScore () {return Score; } public void setScore (двойная оценка) {this.Score = scord; } / *** @param size* случайно сгенерированная последовательность генов* / public Chromosome (int size) {if (size <= 0) {return; } initGenesize (size); for (int i = 0; i <size; i ++) {gene [i] = math.random ()> = 0,5; }} / *** Сгенерировать новый ген* / public Chromosome () {} / *** @param c* @return* @description: клонирование гена* / public static хромосома (окончательный хромосома c) {if (c == null || c.gene == null) {return null; } Хромосомная копия = new Chromosome (); copy.initgenesize (c.gene.length); for (int i = 0; i <c.gene.length; i ++) {copy.gene [i] = c.gene [i]; } return Copy; } / *** @param size* @description: инициализировать длину гена* / private void initgenesize (int size) {if (size <= 0) {return; } gene = new Boolean [size]; } /** * @param c1 * @param c2 * @description: генетическое поколение для производства следующего поколения * /public static <Хромосома> генетическая (хромосома P1, хромосома P2) {if (p1 == null || p2 == null) {// Существует один из хромосомов, который является пустым, и не производит следующую генерацию; } if (p1.gene == null || p2.gene == null) {// Существует одна из хромосом, которая не имеет последовательности генов и не производит возврата следующего поколения NULL; } if (p1.gene.length! = p2.gene.length) {// Длина последовательности гена хромосомы не производит возврата следующей поколения NULL; } Хромосома C1 = клон (P1); Хромосома C2 = клон (P2); // Создать положения поперечного замены случайным образом int size = c1.gene.length; int a = ((int) (math.random () * size)) % размер; int b = ((int) (math.random () * size)) % размер; int min = a> b? Б: А; int max = a> b? A: B; // гены CroMex в позициях для (int i = min; i <= max; i ++) {boolean t = c1.gene [i]; c1.gene [i] = c2.gene [i]; c2.gene [i] = t; } List <chromosome> list = new ArrayList <chromosome> (); list.add (c1); list.add (c2); вернуть список; } /*** @param num* @description: вариация возникает в положениях Num of Gene num* /public void mutation (int num) {// разрешать мутацию int size = gene.length; for (int i = 0; i <num; i ++) {// Поиск положения мутации int at = ((int) (math.random () * size)) % size; // значение после мутации Boolean Bool =! Gene [AT]; ген [at] = bool; }} / *** @return* @description: преобразовать гены в соответствующие числа* / public int getNum () {if (gene == null) {return 0; } int num = 0; for (boolean bool: gene) {num << = 1; if (bool) {num += 1; }} return num; }} 2. Geneticalgorithm Class
/ ** *@Описание: */ package com.lulei.genetic.algorithm; импортировать java.util.arraylist; импортировать java.util.list; Public Abstract Class GeneticalGorithm {Private List <chromosome> популяция = новый ArrayList <Hromosome> (); private int popsize = 100; // Популярное число private int genesize; // максимальная длина гена private int maxiternum = 500; // максимальное количество итераций частного двойного мутации = 0,01; // Вероятность мутации генов частной int maxmutionnum = 3; // Максимальная вариантная асинхронная длина Private Double BestScore; // Best Bypat Private Double HoerdScore; // худший балл Private Double TotalScore; // Общий балл частного двойного среднего значения; // Средний балл частного двойного двойного X; // Записать лучшее значение x в историческом населении частного двойного Y; // Записывает наилучшее значение y в исторической популяции частной int genei; // алгебра, где xy расположена в общественной генетической версии (int genesize) {this.genesize = genesize; } public void caculte () {// Инициализировать генерацию популяции = 1; init (); while (поколение <maxiternum) {// популярная генетическая эволюция (); print (); поколение ++; }} / *** @description: результат вывода* / private void print () { System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println («Худший фитнес:» + System.out.out.println («Средняя пригодность:». @Description: Инициализировать популяцию*/ private init () {for (int i = 0; i <popsize; i ++) {population = new Arraylist <chromosome> (); void evolve () {list <chromosome> Childpopulation = new Arraylist <chromosome> (); P2); @return * @description: Routte Mephonde выбирает хромосомы, которые могут укорениться в следующем поколении */ Средство) {return chro; Популяция) {setchromosomescor = chro.getscore (); (Chromosome CHRO: Populty) {if (math.random () <MutationRate) {// Мутация гена возникает int mutationnum = (int) (math.random () * maxmutenum); Setchromosomescore (Chromosome Chro) {if (chro == null) {return; x * @return * @description: Рассчитайте значение y на основе x y = f (x) */ public abass double caculate (двойной x); Genesize; getBestScore () {returnscore; 3
/ ** *@Описание: */ package com.lulei.genetic.algorithm; public class GeneticalGorithMtest Extends GeneticalGorithm {public Static Final int num = 1 << 24; public genecitygorithmtest () {super (24); } @Override public double изменение (Chromosome Chro) {// TODO Автогенерированный метод return ((1.0 * chro.getnum () / num) * 100) + 6; } @Override public Double Caculatey (Double x) {// todo Автопогенетированный метод return return 100 - math.log (x); } public static void main (string [] args) {geneticalgorithmtest test = new GeneticalGorithMtest (); test.caculte (); }}Выше приведено подробное введение в генетический алгоритм Java. Я надеюсь, что всем будет полезно изучать Java Genetic Algorithm.