Генетический алгоритм решения квадратного уравнения

У меня проблемы с пониманием процесса создания генетических алгоритмов. Я нашел примеры максимизации функции за интервал, и я думаю, что понимаю их, но как можно использовать генетический алгоритм для решения, например, квадратного уравнения?

Предполагая, что мы хотим найти решение длиной до 4 цифр, как правильно кодировать числа? Что можно использовать в качестве функции пригодности для оценки каждого числа?

Любая помощь приветствуется


person Farzad    schedule 08.12.2016    source источник


Ответы (2)


Если вы хотите решить квадратное уравнение

a * x^2 + b * x + c = 0

тогда вам понадобится только одна переменная x в качестве представления. Вы можете использовать

f(x) = abs(a * x^2 + b * x + c)

как функция пригодности, которая тогда совпадает с точностью, поэтому ее необходимо минимизировать.

Но с помощью только одной переменной сложно делать пересечения, вы можете использовать 10 чисел для каждого человека, а затем взять среднее значение, чтобы получить x, или просто взять среднее из двух чисел при пересечении. Также для мутации вместо полного переопределения x вы можете умножить его на случайное число, например, от 0,5 до 2.

person maraca    schedule 08.12.2016
comment
Спасибо за ответ, а что происходит с требованием, чтобы нам нужно было найти решение с 4 цифрами? Как я могу интегрировать это в проблему? - person Farzad; 09.12.2016
comment
@Farzad вы можете использовать числа с плавающей запятой, и если f (x) ‹0,0001 * x, вы можете округлить до 4 цифр. - person maraca; 09.12.2016

Первый шаг - выбрать представление решений. Наиболее широко используется двоичное кодирование. Например, ваш x может выглядеть:

1 0 0 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 1 1 1

Первые 8 битов кодировали целую часть числа, оставшиеся 13 битов кодировали часть числа после точки. В этом примере двоичная строка, кодирующая число 158.0007.

Кроссовер может выглядеть

1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 - 158.0007

1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 - 225.0008

Самый простой оператор кроссовера - это одна точка разделения. Вы генерируете одно число от 1 до длины строки - 1. И до этого момента вы получаете биты из одной строки, а с этой точки - из второй строки. В этом примере мы выбираем для точки разделения 4 позицию. Потомство будет выглядеть так:

1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 - 145.0008

Мутация меняется с выбранной вероятностью на несколько бит.

Функция пригодности может быть значением функции квадратного уравнения (если вы попытаетесь найти максимум) в x, а x получается как декодирование строки битов.

И немного теории под конец. У вас есть два набора. Один набор - это пространство поиска (пространство с двоичными строками), а второй набор - пространство с решением. Индивидуальный объект из области поиска декодируется в решение в пространстве решений (в нашем случае значение x закодировано двоичной строкой). Пространство поиска представляет генотип, а расшифрованное решение - фенотип. Операторы генетики работают с индивидуальным пространством поиска (в данном случае с двоичной строкой) и функцией пригодности, используя декодированное решение.

person viceriel    schedule 12.12.2016
comment
Спасибо за подробное объяснение. Не могли бы вы подробнее рассказать о функции пригодности в нашем случае, которая находит решение квадратного уравнения - person Farzad; 13.12.2016
comment
Хорошо, вы, например, попытаетесь найти максимум квадратичной функции на интервале 0-256.xxxx. Квадратное уравнение может выглядеть так: 2 * x ^ 2 - 5x + 3. Вы декодируете двоичную строку и получаете, например, 5. fitness_of_binary_string = 2 * 5 ^ 2-25 + 3 = 28. Таким образом, соответствие этой строки составляет 43. Вы декодируете другую строку и получаете значение 10. Таким образом, соответствие этой строки будет 2 * 10 ^ 2-50 + 3 = 153. И строка, которая декодирует значение 10, имеет большую пригодность :) - person viceriel; 13.12.2016
comment
Извините, фитнес первой нитки будет 28. - person viceriel; 13.12.2016