Я пытаюсь написать некоторый код для построения графа DeBruijn из набора klerers (k буквенных длинных строк, чтения последовательности ДНК) в Python, выводятся как совокупность ребер, соединяющих тот же узел к другим.Алгоритм построения графика DeBruijn дает неправильные результаты
Когда я запускаю мой код на входе образца:
['GAGG','CAGG','GGGG','GGGA','CAGG','AGGG','GGAG']
я получаю:
CAG -> AGG
GAG -> AGG
Вместо:
AGG -> GGG
CAG -> AGG,AGG
GAG -> AGG
GGA -> GAG
GGG -> GGA,GGG
Любой намек на то, что я делаю неправильно?
Вот код:
import itertools
inp=['GAGG','CAGG','GGGG','GGGA','CAGG','AGGG','GGAG']
y=[a[1:] for a in inp]
z=[b[:len(b)-1] for b in inp]
y.extend(z)
edjes=list(set(y))
w=[c[1:] for c in edjes]
v=[d[:len(d)-1] for d in edjes]
w.extend(v)
nodes=list(set(w))
graph={}
new=itertools.product(edjes,edjes)
for node in nodes:
for edj in new:
edje1,edje2=edj[0],edj[1]
if edje1[1:]==node and edje2[:len(edje2)-1]==node:
if edje1 in graph:
graph[edje1].append(edje2)
else:
graph[edje1]=[edje2]
for val in graph.values():
val.sort()
for k,v in sorted(graph.items()):
if len(v)<1:
continue
else:
line=k+' -> '+','.join(v)+'\n'
print (line)
Можете ли вы объяснить свой алгоритм? Здесь вы «сбрасываете» кусок кода, тогда как он может помочь узнать, что происходит на каждом шаге. –
@CommuSoft, Спасибо за ваши отзывы, так что я пытался: 1. получить набор k-1 mers, с удалением первой или последней буквы без повторений, результат называется edjes 2, выполните то же самое для edjes результат называется узлами, 3, для каждого edje в edjes находят edudant edjes (разделенные только одним узлом), то есть они одинаково совпадают в начале или в конце (совпадение длины узла). –