Я должен использовать алгоритм оптимизации роя частиц для назначения, в котором частицы представлены матрицами с целочисленными элементами - каждая строка представляет собой перестановку целых чисел от 1 до N (N - размер матрицы).
Формула, которую я использую для обновления частицы, является стандартной (я думаю?) (Я использую Python)
w
- коэффициент инерции
c1
- коэффициент когнитивного обучения
c2
- коэффициент социального обучения
r1, r2
- 2 случайно сгенерированных числа из (0, 1)
new_velocity = w * position + r1 * c1 * (personal_best - position) + r2 * c2 * (neighborhood_best - position)
position = position + new_velocity
Так что position
, personal_best
и neighborhood_best
- это все матрицы NxN перестановок, такие как:
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
Проблема, с которой я сталкиваюсь, заключается в том, что полученные результаты не соответствуют Стандарты решения. Идеальными решениями являются матрицы, для которых столбцы также образуют перестановки, и на этом основана функция пригодности для частицы (+1 для каждого столбца, который является перестановкой). Так что проблема в том, что, поскольку я использую числа с плавающей точкой между (0, 1) для w, c1, c2, мои решения больше не являются перестановками, а представляют собой реальные числа, которые плавают вокруг перестановки.
Проблема, вероятно, связана с тем, что функция пригодности не работает для этих матриц с плавающей точкой, и они получают более высокие оценки пригодности, чем нормальные матрицы, что приводит к тому, что весь рой движется к этим решениям. .
Так есть идеи, как я могу изменить фитнес-функцию? Должен ли я просто округлять текущую позицию вверх / вниз всякий раз, когда я вычисляю фитнес? Или этот метод обновления стоит продолжать вообще? Как еще можно получить матрицу скоростей, которая учитывает эти ограничения?