生物信息学原理作业第四弹:DNA序列组装(贪婪算法)

原理:生物信息学(孙啸)

大致思想:

      1. 找到权值最大的边;

      2. 除去以最大权值边的起始顶点为起始顶点的边;

      3. 除去以最大权值边为终点为终点的边;

      4. 重复上述步骤,得到所有符合条件的边;

      5. 拼接得到的边;

      6. 加入孤立点(如果有)。

附上Python代码,如果有问题我会及时更正(确实不太熟算法)

DNA序列组装(贪婪算法)

转载请保留出处!

 # -*- 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序列组装(贪婪算法)的更多相关文章

  1. 简单DNA序列组装(非循环子图)

    生物信息学原理作业第四弹:DNA序列组装(非循环子图) 原理:生物信息学(孙啸) 大致思想: 1. 这个算法理解细节理解比较困难,建议看孙啸的生物信息学相关章节. 2. 算法要求所有序列覆盖整个目标D ...

  2. [LeetCode] Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  3. 利用Python【Orange】结合DNA序列进行人种预测

    http://blog.csdn.net/jj12345jj198999/article/details/8951120 coursera上 web intelligence and big data ...

  4. 华为OJ平台——DNA序列

    题目描述: 一个DNA序列由A/C/G/T四个字母的排列组合组成.G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度).在基因工程中,这个比例非 ...

  5. 环状DNA序列

    大意: 一个DNA序列是环状的,这意味着有N个碱基的序列有N种表示方法(假设无重复).而这N个序列有一种最小的表示,这个最小表示的意思是这个序列的字典序最小(字典序的意思是在字典中的大小 比如ABC& ...

  6. DNA序列对齐问题

    问题描述: 该问题在算法导论中引申自求解两个DNA序列相似度的问题. 可以从很多角度定义两个DNA序列的相似度,其中有一种定义方法就是通过序列对齐的方式来定义其相似度. 给定两个DNA序列A和B,对齐 ...

  7. DNA序列局部比对(Smith–Waterman algorithm)

    生物信息原理作业第三弹:DNA序列局部比对,利用Smith–Waterman算法,python3.6代码实现. 实例以及原理均来自https://en.wikipedia.org/wiki/Smith ...

  8. 利用Needleman–Wunsch算法进行DNA序列全局比对

    生物信息学原理作业第二弹:利用Needleman–Wunsch算法进行DNA序列全局比对. 具体原理:https://en.wikipedia.org/wiki/Needleman%E2%80%93W ...

  9. HDU 1560 DNA sequence(DNA序列)

    HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K  ...

随机推荐

  1. Spring框架学习笔记(5)——自动装配

    1.通过bean标签的autowire属性可以实现bean属性的自动装配. 创建一个新的Spring配置文件beans-autowire.xml,这里我们配置了3个bean,Address.Car.P ...

  2. [国嵌攻略][061][2440LCD驱动设计]

    LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...

  3. Linux中安装opencv-3.3.1

    在ubuntu16.04中安装opencv3.3.1的过程中踩了许多坑.一开始直接安装还挺顺利但运行程序时总是提示libgtk2.0-dev和pkg-config没有安装,在安装这两个包的过程中也不顺 ...

  4. C# 内置 DateTime类详解

    C# 内置 DateTime类详解 摘抄自微软官方文档,用来方便自己查阅:网址:https://msdn.microsoft.com/zh-cn/library/system.datetime(v=v ...

  5. 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结

    刚刚AC的pj普及组第四题就是一种单源最短路. 我们知道当一个图存在负权边时像Dijkstra等算法便无法实现: 而Bellman-Ford算法的复杂度又过高O(V*E),SPFA算法便派上用场了. ...

  6. PID算法笔记2

    总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...

  7. hexo部署github和gitment操作简单介绍

    优点: 快速高效 支持markdown 布局自定义简单,无广告 部署简单 因为想开始写博客,但又找不到好的博客平台,平时都看博客园和开源中国看博客文章,但博客园的那个皮肤是真有点难受,所以就想自己打个 ...

  8. SpringMVC之GET请求参数中文乱码

    server.xml 文件中的编码过滤器设置是针对POST请求的,tomacat对GET和POST请求处理方式是不同的,要处理针对GET请求的编码问题,则需要改tomcat,conf目录下的serve ...

  9. ImmutableMap

    不可变集合,为什么使用它呢?线程安全\更有效的利用内存\可作为常量 ImmutableMap.<String, Object> builder().put("yananList& ...

  10. WebSphere--定制配置

    本节介绍如何启动和使用 WebSphere应用服务器的管理器(一个图形界面)为 Servlet 活动和 WebSphere应用服务器的组件定制基本设置参数.    1.启动 WebSphere应用服务 ...