Что не так с моим генетическим алгоритмом

Я пытаюсь понять, как работают генетические алгоритмы. Как и все, что я узнаю, пытаясь что-то написать на своей одежде; однако мои знания очень ограничены, и я не уверен, правильно ли я делаю это.

Цель этого алгоритма - увидеть, сколько времени потребуется половине стада, чтобы заразиться болезнью, если половина этого населения уже инфицирована. Это просто пример, который я придумал в своей голове, поэтому я не уверен, что это вообще жизнеспособный пример.

Было бы неплохо получить некоторые отзывы о том, как я могу улучшить свои знания.

Вот код:

import random

def disease():
    herd = []
    generations = 0
    pos = 0
    for x in range(100):
        herd.append(random.choice('01'))
    print herd
    same = all(x == herd[0] for x in herd)
    while same == False:
        same = all(x == herd[0] for x in herd)
        for animal in herd:
            try:
                if pos != 0:
                    after = herd[pos+1]
                    before = herd[pos-1]
                    if after == before and after == '1' and before == '1' and animal == '0':
                        print "infection at", pos
                        herd[pos] = '1'
            #print herd
                pos += 1
            except IndexError:
                pass
        pos = 0
        generations += 1
        random.shuffle(herd)
        #print herd
    print "Took",generations,"generations to infect all members of herd."
if __name__ == "__main__":
    disease()

person Max00355    schedule 09.02.2013    source источник
comment
В самом деле, что не так не так с вашим алгоритмом? Вы нам скажите. У вас есть ошибки? Это дает неожиданный результат?   -  person Volatility    schedule 09.02.2013
comment
Ошибок нет, я имею в виду логику своего кода. Я не уверен, что он на 100% точен. Логику отладить сложно.   -  person Max00355    schedule 09.02.2013
comment
Возможно, это лучше подходит для codereview.stackexchange.com   -  person tacaswell    schedule 09.02.2013
comment
Кроме того, это не генетический алгоритм, вы просто перебираете стадо, чтобы распространить инфекцию. генетические алгоритмы - это способ минимизировать в очень негладких фазовых пространствах. У вас есть некоторая фитнес-функция (которая определяет, насколько хорошо ваше текущее местоположение в фазовом пространстве), и вы выбираете и «размножаете» эти местоположения в последовательных поколениях. Короче говоря, генетические алгоритмы - это разновидность алгоритмов оптимизации, а это не так.   -  person tacaswell    schedule 09.02.2013
comment
Это тот тип обратной связи, который я искал. Я очень невежественен в этой теме, но мне она очень интересна. Я ценю обратную связь.   -  person Max00355    schedule 09.02.2013


Ответы (1)


Ваш код не реализует GeneticAlgorithm. Я предлагаю вам сначала начать с библиотеки с открытым исходным кодом, чтобы понять, как она работает, прежде чем реализовывать свою собственную (при необходимости)

Чтобы иметь генетический алгоритм, вам понадобится следующее:

1- Целевая функция, которую вы пытаетесь минимизировать

2- Представление хромосом (например, реальное значение), которое моделирует переменные решения в вашей целевой функции. Ваша цель - найти лучшую хромосому, минимизирующую целевую функцию.

3- Начальная популяция хромосом для начала поиска (может быть случайной)

4- Генетические операторы, то есть отбор, кроссовер и мутация, которые вы применяете к текущей популяции, чтобы перейти к следующему поколению.

5- Повторяйте, пока не достигнете критерия остановки, например. максимальное количество поколений или желаемое значение пригодности

Это всего лишь краткое описание того, что должна иметь реализация генетического алгоритма.

person iTech    schedule 09.02.2013
comment
Спасибо за отзыв, я знаю об ошибках в моем коде, поэтому разместил это! Можете ли вы предложить какие-нибудь библиотеки, в которые я могу заглянуть? - person Max00355; 09.02.2013
comment
Я знаю, что несколько библиотек Java видят этот вопрос stackoverflow.com/questions/3300423/ - person iTech; 09.02.2013