Какие типы данных для генетических алгоритмов в 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.

Вы можете попробовать использовать bitarray. Или вы можете играть с буферами.

Я думаю, что придерживаться строк это хорошая идея. Вы можете легко нарезать струны на кусочки. если вам нужно использовать их как список, вы можете преобразовать его с помощью "list(str)". Получив список, вы можете изменить его и превратить в строку, используя "".join (lst).

Лично я бы не использовал long или другой целочисленный тип для хранения в виде битов. Это может быть более экономно, но головная боль при работе с данными, когда вы хотите выполнить рекомбинацию, была бы значительной. Мутации также будут проблематичными, если мутация будет состоять из чего-то другого, а не из-за переворота. Кроме того, код будет намного сложнее для чтения.

Просто мои 2 цента. Надеюсь, это поможет вам.

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