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 ...
随机推荐
- js根据出生年月日换算年龄
function age_Conversion(date) { debugger var age = ''; var str = date.replace(/年|月/g, "-") ...
- 防止ajax重复提交
在jquery中防止ajax重复提交
- TCP协议中三次握手
TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...
- parsing XML document from class path resource [config/applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [config/applicationContext.xml] 解决方案
parsing XML document from class path resource [config/applicationContext.xml]; nested exception is j ...
- 利用JAVA API远程进行HDFS的相关操作
学习HDFS有一段时间了,现在把自己总结的HDFS的相关操作代码展示给大家. 主要有HDFS的增删改查,文件的追加,windows本地文件的上传,hdfs文件的下载,文件重命名,创建目录,文件是否存在 ...
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address
http://blog.csdn.net/ownfire/article/details/7966645 今天在做LNMP的时候,启动nginx服务,无法开启,导致网页打不开.把服务从起一下发现提示错 ...
- 手机WebApp是什么?
手机WebApp是基于HTML5+css3开发的,一次开发,可以兼容许多的平台(android/iphone),调用本地功能(比如照相),可以用phonegap去实现,所以,是一个趋势.相比每个平台定 ...
- html5移动端meta自动适应标签
控制显示区域各种属性: <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sc ...
- intellij-项目目录隐藏无用的文件和文件夹
File-->Editor-->File Types
- linux_系统调优
linux如何调优? 1. 关闭SELLinux功能,美国国家安全局对于强制访问控制实现,生产场景也是关闭 cat /etc/selinux/config | grep '^SELINUX=' # 查 ...