Как решать линейные уравнения с использованием генетического алгоритма?

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

У меня возникают трудности при определении операции кроссовера, поскольку решение может состоять из значений с плавающей запятой. Как мне поступить? Это кажется возможным, но это моя первая встреча с генетическими алгоритмами.

Предположим, мы должны решить

 x + 2y = 1
2x + 8y = 3

Ответ будет х = 1/2 и у = 1/4.

Как мы моделируем проблему?

Обновление: посмотрите, сможете ли вы расшифровать что-нибудь из статьи http://www.masaumnet.com/archives/mjbas/volume1/issue2/mjbas010205.pdf.

4 ответа

Решение

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

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

Ваша хромосома может быть n числами с плавающей точкой (doubles), или вы можете интерпретировать их как строки битов, используя объединение:

const int n = 100;

union Chromosome {
  double val[n];
  unsigned char bits[n * sizeof(double)];
};

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

Удачи!

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

Обычно вы решаете линейные системы, используя факторизации (QR, LU) или итерационные алгоритмы (Gauß-Seidel, CG, ...)

Вам нужно будет подумать об использовании реального генетического алгоритма, а не двоичного генетического алгоритма, как предлагается в статье, на которую вы ссылались. На самом деле, если вы используете двоичный кодированный генетический алгоритм, то вы не сможете найти решение уравнений, если ваши 'x', 'y' могут принимать отрицательные значения.

Следовательно, вам нужно использовать настоящий закодированный генетический алгоритм. Либо вы можете кодировать весь генетический алгоритм самостоятельно, либо вы можете просто использовать хороший существующий код RGA для решения вашей проблемы. Вам просто нужно настроить фитнес-функцию для ваших нужд. Здесь вы можете использовать тот, который предлагается в статье. Это было довольно легко!

Вы можете рассмотреть возможность использования реализации RGA по http://www.iitk.ac.in/kangal/codes.shtml.

Другие вопросы по тегам