DNA序列组装(贪婪算法)
生物信息学原理作业第四弹:DNA序列组装(贪婪算法)
原理:生物信息学(孙啸)
大致思想:
1. 找到权值最大的边;
2. 除去以最大权值边的起始顶点为起始顶点的边;
3. 除去以最大权值边为终点为终点的边;
4. 重复上述步骤,得到所有符合条件的边;
5. 拼接得到的边;
6. 加入孤立点(如果有)。
附上Python代码,如果有问题我会及时更正(确实不太熟算法)
转载请保留出处!
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 4 15:04:39 2017
@author: zxzhu
python3.6
"""
from functools import reduce
def get_weight(s1,s2): #通过两条序列的overlap计算出权值
l = min(len(s1),len(s2))
while l>0:
if s2[:l] == s1[-l:]:
return l
else:
l-=1
return 0 def print_result(s1,s2): #将两条序列去除首尾overlap后合并
weight = get_weight(s1,s2)
s = s1 + s2[weight:]
#print(s)
return s def dir_graph(l,t=3): #得到满足条件的有向图(权值大于等于t)
graph = {}
for i in l:
for j in l:
if i!=j:
weight = get_weight(i,j)
if weight >= t:
key = (i,j)
graph[key] = weight
return graph def rm_path(graph,path): #贪婪算法加入一条边后应该去除与该边首尾顶点相同的边
key = graph.keys()
rm_key = []
for i in key:
if i[1] == path[1] or i[0] == path[0]:
rm_key.append(i)
for i in rm_key:
graph.pop(i)
return graph def get_path(graph,path = []): #得到满足条件的所有边
while graph:
max_weight = 0
for i in graph.keys():
if graph[i] > max_weight:
max_weight = graph[i]
cur_path = i
path.append(cur_path)
graph = rm_path(graph,cur_path)
get_path(graph,path)
return path def out_num(path,V): #计算某顶点的出度
count = 0
for i in path:
if i[0] == V:
count+=1
return count def get_last_V(path,last_V = None): #得到最后一条边
index = 0
if last_V: #非随机寻找出度为0的顶点
for i in path:
if i[1] == last_V:
return i,index
else:
index+=1
return None #没有找到指向last_V的顶点(一条路径结束)
else: #随机寻找出度为0的顶点
for i in path:
if out_num(path,i[1]) == 0:
return i,index
else:
index+=1
return -1 #首尾相连 def assemble(cur_V,path,new_path = []): #给满足条件的边排序
while path:
path.pop(cur_V[1])
new_path.insert(0,cur_V[0])
cur_V = get_last_V(path,last_V = cur_V[0][0])
if cur_V:
assemble(cur_V,path,new_path)
else:
cur_V = get_last_V(path)
assemble(cur_V,path,new_path)
return new_path def align_isolated(path,sequence): #加入孤立顶点
new_path = reduce(lambda x,y:x+y,path)
for i in sequence:
if i not in new_path:
new_path.append(i)
return new_path x = 'CCTTTTGG'
y = 'TTGGCAATCACT'
w = 'AGTATTGGCAATC'
u = 'ATGCAAACCT'
z = 'AATCGATG'
v = 'TCACTCCTTTT'
a = w
b = y
c = 'TCACTAGTA'
sequence = [x,y,w,u,z]
sequence1 = [a,b,c]
graph = dir_graph(sequence1,t=3)
print(graph)
path = get_path(graph)
path = [list(i) for i in path] #将path中的tuple元素换成list
#print(path)
start = get_last_V(path) #起始出度为0的顶点所在的边
if start == -1: #序列首尾相连
new_path = reduce(lambda x,y:x+y, path)
new_path = new_path[:-1]
result = reduce(print_result,new_path)
else:
new_path = assemble(start,path) #排序后的边
new_path = align_isolated(new_path,sequence1) #加入孤立顶点
#print(new_path)
result = reduce(print_result,new_path) #组装
#print(new_path)
print(result)
DNA序列组装(贪婪算法)的更多相关文章
- 简单DNA序列组装(非循环子图)
生物信息学原理作业第四弹:DNA序列组装(非循环子图) 原理:生物信息学(孙啸) 大致思想: 1. 这个算法理解细节理解比较困难,建议看孙啸的生物信息学相关章节. 2. 算法要求所有序列覆盖整个目标D ...
- [LeetCode] Repeated DNA Sequences 求重复的DNA序列
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- 利用Python【Orange】结合DNA序列进行人种预测
http://blog.csdn.net/jj12345jj198999/article/details/8951120 coursera上 web intelligence and big data ...
- 华为OJ平台——DNA序列
题目描述: 一个DNA序列由A/C/G/T四个字母的排列组合组成.G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度).在基因工程中,这个比例非 ...
- 环状DNA序列
大意: 一个DNA序列是环状的,这意味着有N个碱基的序列有N种表示方法(假设无重复).而这N个序列有一种最小的表示,这个最小表示的意思是这个序列的字典序最小(字典序的意思是在字典中的大小 比如ABC& ...
- DNA序列对齐问题
问题描述: 该问题在算法导论中引申自求解两个DNA序列相似度的问题. 可以从很多角度定义两个DNA序列的相似度,其中有一种定义方法就是通过序列对齐的方式来定义其相似度. 给定两个DNA序列A和B,对齐 ...
- DNA序列局部比对(Smith–Waterman algorithm)
生物信息原理作业第三弹:DNA序列局部比对,利用Smith–Waterman算法,python3.6代码实现. 实例以及原理均来自https://en.wikipedia.org/wiki/Smith ...
- 利用Needleman–Wunsch算法进行DNA序列全局比对
生物信息学原理作业第二弹:利用Needleman–Wunsch算法进行DNA序列全局比对. 具体原理:https://en.wikipedia.org/wiki/Needleman%E2%80%93W ...
- HDU 1560 DNA sequence(DNA序列)
HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K ...
随机推荐
- UEP-弹窗给选中数据赋值
弹窗给选中数据赋值:t/** * 设置分派员 */ function onDispatchMan(){ var rec=ajaxgrid.getCheckedRecords(); if(rec.len ...
- ReentrantLock与Condition构造有界缓存队列与数据栈
通过ReentrantLock与Condition的设计,以数组为基础,可以实现简单的队列和栈的数据结构,临界阻塞的效果. ReentrantLock相对于synchronized比较大的一个区别是有 ...
- 属性getter和setter
我们知道,对象属性是由名字.值和一组特性(attribute)构成的.在ECMAScript5 中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter.由getter和sette ...
- 解决不同操作系统下git换行符一致性问题
一.不同操系统下的换行符CR回车 LF换行Windows/Dos CRLF \r\nLinux/Unix LF \nMacOS CR \r二.解决方法 打卡git bash,设置core.autocr ...
- VS的无用文件
目录:C:\ProgramData\Microsoft Visual Studio\10.0\TraceDebugging 每次调试程序都会产生30MB左右大小的Debug文件.如何禁止? Tools ...
- 织梦dedecsm系统"企业简介"类单栏目模版如何修改和调用
2013-1-12 14:46 | 发布者: moke | 栏目:dedecms教程 我们的模版里应该都有article_article.htm这个模版,这个模版是文章内容页模板,也就是 ...
- 急!!ftp登录错误,提示 530 not logged in,连接失败 ,,是怎么回事啊
愤怒地青鸟 | 浏览 68533 次 发布于2017-04-11 00:44 最佳答案 核心提示:Ftp登陆不了是很经常碰到的事,很多人常常是不加分析就发贴询问.老实说,这样既浪费自己时间,又浪费别人 ...
- CC2650LaunchPad 运行contiki hello-world示例程序
最近做毕设,开始接触contiki. 下载并运行Instant Contiki 3.0 这是官方制作的虚拟机镜像,直接用vmware等工具就可以运行. 从这里下载. 下载并解压后,用vmware运行. ...
- Oracle问题之ORA-01609、ORA-00362
Oracle问题之ORA-01609: 日志 4 是线程 1 的当前日志 - 无法删除成员 Oracle问题之ORA-00362: 要求输入成员以组成组 4 中的有效日志文件
- mybatis_helloword(1)
摘录自:http://blog.csdn.net/y172158950/article/details/16979391 新的项目中用到mybatis,虽然不用自己写ORM的代码,但是借这个机会,学习 ...