简单DNA序列组装(贪婪算法)

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

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

大致思想:

      1. 找到权值最大的边;

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

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

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

      5. 拼接得到的边;

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

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

简单DNA序列组装(贪婪算法)

转载请保留出处!

  1 # -*- coding: utf-8 -*-
  2 """
  3 Created on Mon Dec  4 15:04:39 2017
  4 @author: zxzhu
  5 python3.6
  6 """
  7 from functools import reduce
  8 def get_weight(s1,s2):              #通过两条序列的overlap计算出权值
  9     l = min(len(s1),len(s2))
 10     while l>0:
 11         if s2[:l] == s1[-l:]:
 12             return l
 13         else:
 14             l-=1
 15     return 0
 16
 17 def print_result(s1,s2):           #将两条序列去除首尾overlap后合并
 18     weight = get_weight(s1,s2)
 19     s = s1 + s2[weight:]
 20     #print(s)
 21     return s
 22
 23 def dir_graph(l,t=3):             #得到满足条件的有向图(权值大于等于t)
 24     graph = {}
 25     for i in l:
 26         for j in l:
 27             if i!=j:
 28                 weight = get_weight(i,j)
 29                 if weight >= t:
 30                     key = (i,j)
 31                     graph[key] = weight
 32     return graph
 33
 34 def rm_path(graph,path):           #贪婪算法加入一条边后应该去除与该边首尾顶点相同的边
 35     key = graph.keys()
 36     rm_key = []
 37     for i in key:
 38         if i[1] == path[1] or i[0] == path[0]:
 39             rm_key.append(i)
 40     for i in rm_key:
 41         graph.pop(i)
 42     return graph
 43
 44 def get_path(graph,path = []):     #得到满足条件的所有边
 45     while graph:
 46         max_weight = 0
 47         for i in graph.keys():
 48             if graph[i] > max_weight:
 49                 max_weight = graph[i]
 50                 cur_path = i
 51         path.append(cur_path)
 52         graph = rm_path(graph,cur_path)
 53         get_path(graph,path)
 54     return path
 55
 56 def out_num(path,V):             #计算某顶点的出度
 57     count = 0
 58     for i in path:
 59         if i[0] == V:
 60             count+=1
 61     return count
 62
 63 def get_last_V(path,last_V = None):           #得到最后一条边
 64     index = 0
 65     if last_V:                                #非随机寻找出度为0的顶点
 66         for i in path:
 67             if i[1] == last_V:
 68                 return i,index
 69             else:
 70                 index+=1
 71         return None                           #没有找到指向last_V的顶点
 72     else:                                     #随机寻找出度为0的顶点
 73         for i in path:
 74             if out_num(path,i[1]) == 0:
 75                 return i,index
 76             else:
 77                 index+=1
 78
 79 def assemble(cur_V,path,new_path = []):       #给满足条件的边排序
 80     while path:
 81         path.pop(cur_V[1])
 82         new_path.insert(0,cur_V[0])
 83         cur_V = get_last_V(path,last_V = cur_V[0][0])
 84         if cur_V:
 85             assemble(cur_V,path,new_path)
 86         else:
 87             cur_V = get_last_V(path)
 88             assemble(cur_V,path,new_path)
 89     return new_path
 90
 91 def align_isolated(path,sequence):          #加入孤立顶点
 92     new_path = reduce(lambda x,y:x+y,path)
 93     for i in sequence:
 94         if i not in new_path:
 95             new_path.append(i)
 96     return new_path
 97
 98
 99 x = ‘CCTTTTGG‘
100 y = ‘TTGGCAATCACT‘
101 w = ‘AGTATTGGCAATC‘
102 u = ‘ATGCAAACCT‘
103 z = ‘AATCGATG‘
104 v = ‘TCACTCCTTTT‘
105 a = ‘CATAA‘
106 b = ‘ATCA‘
107 c = ‘TGCAT‘
108 sequence = [x,y,w,u,z]
109 sequence1 = [a,b,c]
110 graph = dir_graph(sequence1,t=2)
111 path = get_path(graph)
112 path = [list(i) for i in path]              #将path中的tuple元素换成list
113 #print(path)
114 start = get_last_V(path)                    #起始出度为0的顶点所在的边
115 new_path = assemble(start,path)             #排序后的边
116 #print(new_path)
117 new_path = align_isolated(new_path,sequence1)   #加入孤立顶点
118 #print(new_path)
119 result = reduce(print_result,new_path)      #组装
120 print(result)
时间: 2024-08-30 13:40:45

简单DNA序列组装(贪婪算法)的相关文章

短序列组装Sequence Assembly(转载)

转载:http://blog.sina.com.cn/s/blog_4af3f0d20100fq5i.html 短序列组装(Sequence assembly)几乎是近年来next-generation sequencing最热门的话题.简单来说,就是把基因组长长的序列打断(shotgun sequencing),因为我们不知道基因组整条序列是如何排列(成一条链,最后成为一条染色体)组合(如何区分不同染色体)的,而我们又无法实现一次 把整条长序列完整测序(现在有单子测序可能是一个新的sunlig

python实现DNA序列字符串转换,互补链,反向链,反向互补链

在生物信息学分析中,经常对DNA序列进行一系列操作,包括子序列截取,互补序列获取,反向序列获取,反向互补序列获取.在python语言中,可编写如下函数完成这些简单功能. 子序列截取 python中对序列截取使用字符串切片功能就可以完成,例如: >>> seq="ATGATATAGtatatatgCAAGAGg" >>> subseq = seq[1:6] >>> subseq "TGATA" 注意,切片操作是“0

环状DNA序列

大意: 一个DNA序列是环状的,这意味着有N个碱基的序列有N种表示方法(假设无重复).而这N个序列有一种最小的表示,这个最小表示的意思是这个序列的字典序最小(字典序的意思是在字典中的大小 比如ABC<ACB,B<BCD,EF<G) 方法:在一个序列中从任意两个位置开始,产生的序列的大小是可以比较的.然后利用这种比较方法找出最小值 #include <iostream> using namespace std; #define MAX 105 int lessthan(char

HDU 1560 DNA sequence(DNA序列)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: center; font-family: 宋体; color: rgb(26,92,200); font-weight: bold; fo

2015年“深圳杯”数学建模夏令营 B题:DNA序列的k-mer index问题

这个问题来自 DNA序列的k-mer index问题. 给定一个DNA序列,这个系列只含有4个字母ATCG,如 S ="CTGTACTGTAT".给定一个整数值k,从S的第一个位置开始,取一连续k个字母的短串,称之为k-mer(如k= 5,则此短串为CTGTA), 然后从S的第二个位置, 取另一k-mer(如k= 5,则此短串为TGTAC),这样直至S的末端,就得一个集合,包含全部k-mer . 如对序列S来说,所有5-mer为 {CTGTA,TGTAC,GTACT,TACTG,ACT

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

http://blog.csdn.net/jj12345jj198999/article/details/8951120 coursera上 web intelligence and big data 终于布置了HW7,这一次的要求是对一系列DNA序列进行预测,具体说明如下: Data Analytics Assignment (for HW7) Predict the Ethnicity of Individuals from their Genes =====================

华为OJ平台——DNA序列

题目描述: 一个DNA序列由A/C/G/T四个字母的排列组合组成.G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度).在基因工程中,这个比例非常重要.因为高的GC-Ratio可能是基因的起始点. 给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列. 输入 输入一个string型基因序列,和int型子串的长度 输出 找出GC比例最高的字串 样例输入 AACTGTGCACGACCTGA

华为OJ:DNA序列

初始化两个数组,一个序列数值数组K[N],一个序列和数组SUM[N],先遍历一边序列,为C或者G则K[i]为1,否则则置为0,然后计算连续M个K[I]之和存入SUM就行. import java.util.Scanner; public class DNAsquence { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.next(); int n=input

2015年“深圳杯”数学建模夏令营-B题:DNA序列的k-mer index 问题

这是一个山科大的同学给我的一个问题,向我询问一下思路,对于数学建模,我没太多的了解,所以只能用计算机程序的方法来解答. 这是具体的问题: 这个问题来自 DNA序列的k-mer index问题. 给定一个DNA序列,这个系列只含有4个字母ATCG,如 S ="CTGTACTGTAT".给定一个整数值k,从S的第一个位置开始,取一连续k个字母的短串,称之为k-mer(如k= 5,则此短串为CTGTA), 然后从S的第二个位置, 取另一k-mer(如k= 5,则此短串为TGTAC),这样直至