Как превратить наиболее похожую сгенерированную rand строку в основную строку, изменить случайную строку через поколения, чтобы получить исходную строку? - PullRequest
1 голос
/ 29 мая 2020

Я сгенерировал N случайных последовательностей длины L из букв A, C, G, T (например, N = 10, L = 21) и создал функцию, которая вычисляет расстояние между двумя словами из 21 буквы,

введите описание изображения здесь

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

Проблема в том, что я хотел бы иметь возможность выбирать случайную последовательность, которая имеет минимальное расстояние до 21-буквенной главной последовательности GATACCAATTACCAGATACCA. Альтернативный подход к тому же - найти случайную последовательность с максимальным перекрытием с основной последовательностью. Это мера пригодности для этих случайных последовательностей, и вы выбираете случайную последовательность с наибольшей пригодностью. Напишите функцию, которая измеряет это совпадение / соответствие между случайной 21-буквенной последовательностью и основной последовательностью. (например, 1/100) для каждой из 21 буквы, которая должна быть случайным образом превращена в случайную букву алфавита (мутация).

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

Я хотел бы иметь возможность повторять этот процесс для ряда поколений G, пока исходный главный геном не будет достигнут посредством эволюции- и сколько поколений на это ушло - должно получиться примерно так:

введите описание изображения здесь

1 Ответ

0 голосов
/ 28 июня 2020
master = list('AATTATGTACCGGGAGCTCCG')
mutation = list('GTATCACGATGTCATCATCAA')
nucleotides = ("A", "C", "G", "T")

def hamming_distance(mutation, x = 0):
    list = []
    if mutation != master:
        for i, nuc in enumerate(mutation):
            if nuc != master[i]:
                list.append(i)
        print(f'Mutated: {"".join(mutation)}, {len(mutation) - len(list)}, {x}')
        for num in list:
            y = random.choice(nucleotides)
            mutation[num] = y
        x += 1
        hamming_distance(mutation, x = x)
    elif mutation == master:
        print(f'Mutated: {"".join(mutation)}, {len(mutation) - len(list)}, {x}')
        print("Master sequence has been achieved")

print(f'Master:  {"".join(master)}')
hamming_distance(mutation)

Example output:

Master:  AATTATGTACCGGGAGCTCCG
Mutated: GTATCACGATGTCATCATCAA, 4, 0
Mutated: GGATCGGAAGACCACCCTCTG, 7, 1
Mutated: CTATCAGCAGAAGTTGCTCCG, 10, 2
Mutated: GCCTACGGAGTGGAAGCTCCG, 13, 3
Mutated: GCCTAGGCATGGGGAGCTCCG, 14, 4
Mutated: CTGTAGGAATCGGGAGCTCCG, 15, 5
Mutated: TGGTAAGCACCGGGAGCTCCG, 16, 6
Mutated: ATATATGTACCGGGAGCTCCG, 19, 7
Mutated: AGATATGTACCGGGAGCTCCG, 19, 8
Mutated: AACTATGTACCGGGAGCTCCG, 20, 9
Mutated: AACTATGTACCGGGAGCTCCG, 20, 10
Mutated: AAATATGTACCGGGAGCTCCG, 20, 11
Mutated: AATTATGTACCGGGAGCTCCG, 21, 12
Master sequence has been achieved

Это выполнит вашу первую задачу и получит желаемый результат в порядке измененной последовательности, расстояния Хэмминга и номера поколения. Это находит все позиции точечных мутаций в последовательности мутаций. Для каждой из этих позиций он заменяется другим случайным нуклеотидом. Используя рекурсию, я смог автоматически развить последовательность мутаций. Я добавил условие, чтобы он останавливался, как только обе последовательности были равны. Если вы хотите добавить еще один шанс мутации, скажем, с вероятностью 1/10, вы можете сделать что-то подобное перед той частью, которая фактически меняет местами каждый нуклеотид.

    for num in list:
        i = random.randint(1, 10)
        if i == 5: # The 5 is a random number that I chose
            y = random.choice(nucleotides)
            mutation[num] = y

Это очень наивный ответ, но он работает хорошо. Кроме того, я бы сделал последовательности и случайные целые числа вводом пользователем, чтобы сделать функцию более гибкой.

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