Какие типы данных для генетических алгоритмов в Python? - PullRequest
3 голосов
/ 28 марта 2012

Я реализую GA в Python и мне нужно хранить последовательность единиц и нулей, поэтому я представляю свои данные в виде двоичных файлов.Какова лучшая структура данных для этого?Простая строка?

Ответы [ 3 ]

5 голосов
/ 28 марта 2012

Если ваши хромосомы являются цепочками бит фиксированной длины, рассмотрите возможность использования 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.

0 голосов
/ 28 марта 2012

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

0 голосов
/ 28 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...