2016-06-26 6 views
0

Я не могу найти хороший сайт, чтобы объяснить GA (который я совершенно новым для), но я читал книгу, и она говорит, что:Генетический алгоритм двоичного представления

Если мы ограничиваем возможные значения перехват диапазона [-5, 1.5] и линейное преобразование диапазона в двоичный диапазон [0, 2^8 - 1], то значение 0,74 будет переведено на 10011110, а значения параметров [.74, -.11 ] может быть представлена ​​10011110110010.

может кто-нибудь объяснить мне
1) Как линейное преобразование диапазона работ, и
2) Как 0,74, представленные 1001111 0

Мой грубый знание двоичном бы перевел это, как

2^8 0 0 2^5 2^4 2^3 2^2 2^1 

который 318.

Если вы знаете, любой сайт, который мог бы объяснить это как хорошее введение, что помогло бы. Благодаря!

ответ

1

Линейное преобразование диапазона довольно просто. Скорее всего, проще работать с целыми числами.

Допустим, у вас есть диапазон [0, 10], и вы хотите перевести его в диапазон [0, 20]. Каждое значение просто умножается на 2, поэтому 0 => 0, 1 => 2, 2 => 4, 3 => 6 и т. Д.

Теперь давайте возьмем еще один пример, который вы хотите перевести [1, 10] в [2, 11]. Для этого вы просто вычитаете 1 (для нижней части первого диапазона), а затем добавьте 2 (для минимума второго диапазона). Поэтому просто добавьте 1 к каждому числу, поэтому 1 => 2, 2 => 3, 3 => 4 и т. Д.

Теперь, что произойдет, если вы хотите их объединить. Допустим, вы хотите перевести 10,110 в 30,230. Сначала вы вычитаете минимум первого числа, 10, поэтому минимум равен 0. Затем умножьте на коэффициент масштабирования. В этом случае 110-10 = 100 и 230-30 = 200, поэтому коэффициент масштабирования равен 200/100 = 2. Затем вы добавляете минимум второго диапазона, который равен 30. Поэтому для преобразования i1 в i2 у вас есть i2 = (i1 - 10) * 2 + 30, что вы можете упростить.

Если вы хотите преобразовать [-5, 1.5] в [0, 255], вы вычитаете -5 (т.е. добавьте 5), умножьте на 256, разделите на 6.5 (от 1.5 до -5 = 6.5), а затем добавьте 0. Тогда, поскольку вы имеете дело с целыми значениями, вам нужно округлить результат до ближайшего целого числа.

Кроме того, у вас есть небольшая ошибка в вашем двоичном расчете, самая низкая цифра составляет 2^0, а не 2^1. Поэтому вам нужно разделить 318 на 2, чтобы получить правильный ответ.

1

Я написал несколько простых генетических алгоритмов для оптимизации функций в C++. Вот исходный код:

https://github.com/mihaioltean/genetic-algorithms

Есть 2 реализаций: один для реального кодирования и один для двоичного представления, которое также показывает, как преобразование из двоичной строки в режиме реального интервала.

В коде есть много комментариев, вам нужно больше, пожалуйста, сообщите мне, что не ясно, и я добавлю больше.

приветствие, mihai

Смежные вопросы