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

StackOverflow https://stackoverflow.com/questions/1692418

Вопрос

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

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

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

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

Ответом будет x = 1/2 и y = 1/4.

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

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

Это было полезно?

Решение

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

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

Другие советы

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

const int n = 100;

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

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

Удачи!

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top