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