Какие типы данных для генетических алгоритмов в Python?
Я реализую GA в Python и мне нужно хранить последовательность единиц и нулей, поэтому я представляю свои данные в виде двоичных файлов. Какова лучшая структура данных для этого? Простая строка?
3 ответа
Если ваши хромосомы представляют собой цепочки битов фиксированной длины, рассмотрите возможность использования массивов Numpy и векторизованных операций над ними вместо списков. Они могут быть намного быстрее, чем списки Python. Например, одноточечный кроссовер может быть сделан с
def crossover(a, b):
"""Return new individual by combining parents a and b
with random crossover point"""
c = np.empty(a.shape, dtype=bool)
k = np.random.randint(a.shape[0])
c[:k] = a[:k]
c[k:] = b[k:]
return c
Если вы не хотите использовать Numpy, то строки выглядят вполне уместно; они гораздо более компактны, чем списки, в которых хранятся указатели на элементы, а не на реальные элементы.
Наконец, обязательно посмотрите, как Pyevolve представляет хромосомы; похоже, это делается с помощью Numpy.
Я думаю, что придерживаться строк это хорошая идея. Вы можете легко нарезать струны на кусочки. если вам нужно использовать их как список, вы можете преобразовать его с помощью "list(str)". Получив список, вы можете изменить его и превратить в строку, используя "".join (lst).
Лично я бы не использовал long или другой целочисленный тип для хранения в виде битов. Это может быть более экономно, но головная боль при работе с данными, когда вы хотите выполнить рекомбинацию, была бы значительной. Мутации также будут проблематичными, если мутация будет состоять из чего-то другого, а не из-за переворота. Кроме того, код будет намного сложнее для чтения.
Просто мои 2 цента. Надеюсь, это поможет вам.