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 ...
随机推荐
- c++(线性队列)
这里的线性结构实际上指的就是连续内存的意思,只不过使用“线性”这个词显得比较专业而已.前面一篇博客介绍了现象结构的处理方法,那么在这个基础之上我们是不是添加一些属性形成一种新的数据结构类型呢?答案是肯 ...
- 高可用高性能分布式文件系统FastDFS实践Java程序
在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...
- H5基础浏览器兼容性
<!DOCTYPE HTML><html><body> <video width="320" height="240" ...
- vuex的使用
vue现在越来越火,不单单可以写简单的小项目,也可以写大中型的项目.但是项目大了,项目之间的数据传递就会变得复杂,那么问题来了?在一个大型项目中,多个组件要公用同一个或多个数据,我们如何保证每个组件获 ...
- 十二个 ASP.NET Core 例子——IOC
目录 简单介绍 core自带IOC的实现解释 1.简单介绍 (个人理解) 是什么:IOC是一种设计原则,而非设计模式,是对流程控制,当你注入你需要的定制化类时,流程就确定了 怎么用:和IOC容器说你这 ...
- 怎样实现给DEDE的栏目增加栏目图片(1)
http://www.genban.org/news/dedecms-7577.html 前两天用DEDE做二次开发的时候,遇到一个问题,领导让给每个栏目增加一个栏目图片的功能,网上找了些东西,结合自 ...
- dedecms v5.7 图片集“图集内容”无法调用的解决办法
在dedecms的图片集模型或者基于图片集模型修改的自定义模型中 内容页模板使用 {dede:field.body/} 方式来调用body字段是没有输出的(原因不明,未继续深入) 但有些时候当需要在内 ...
- zabbix入门知识
zabbix入门知识 zabbix中文手册 https://www.zabbix.com/documentation/3.4/manual/ 1.zabbix介绍 Zabbix 是一个企业级的分布式开 ...
- Windows核心编程&内核对象
1. 一个进程在初始化时,系统将会他分配一个空的句柄表,这个句柄表仅供内核对象使用,不供用户对象和GDI对象使用.进程在首次 初始化时,该句柄表为空.句柄表是一个由数据结构组成的数组,包含一个内核对象 ...
- Windows核心编程&错误处理
知识概要 (1) MAKELANGID Windows宏,用一个来主语言标识和从语言标识创建一个语言标识符 MAKELANGID(ushort usPrimaryLanguage, ushort us ...