当前位置: 首页 > news >正文

2022年第十一届数学建模国际赛小美赛B题序列的遗传过程解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛

B题 序列的遗传过程

原题再现:

  序列同源性是指DNA、RNA或蛋白质序列之间的生物同源性,根据生命进化史中的共同祖先定义[1]。DNA、RNA或蛋白质之间的同源性通常根据它们的核苷酸或氨基酸序列相似性来推断。显著的相似性是两个序列通过共同祖先序列的进化变化而相互关联的有力证据[2]。
  考虑RNA序列的遗传过程,其中核苷酸碱基的突变是偶然发生的。为简单起见,我们假设序列突变是由于单个碱基的改变(转换或转换)、插入和删除引起的。因此,我们可以通过突变点的数量来度量两个序列之间的距离。多个碱基序列紧密结合可以形成一个家族,它们被认为是同源的。
  您的团队被要求开发一个合理的数学模型来完成以下问题。

  1、请设计一种算法,快速测量两个足够长(>103个碱基)的碱基序列之间的距离。
  2、请可靠地评估算法的复杂度和准确性,并设计合适的例子加以说明。
  3、如果一个家族中的多个碱基序列是由一个共同的祖先序列进化而来,设计一个高效的算法来确定祖先序列,并映射系谱树。

整体求解过程概述(摘要)

  随着现代基因组学的发展,越来越多的基因序列被破译出来。基于如此庞大的基因数据库,高效地实现基因序列比对具有重要意义。碱基序列间的相似性不仅可用于基因性状分析,还可用于确定基因同源性和进化过程。
  为了量化基因同源性,我们提供了基因距离和相似性的明确定义。两个碱基序列之间的基因距离可以用将序列Sm转换为另一个序列Sn的代价来表示,在转换过程中,只允许使用一系列合格的编辑手段,如插入和替换字符。相似性是指两个序列之间相等的碱基数目。在遗传距离和相似性的计算中,基因比对是一个整体。
  基因比对的关键是找出碱基序列之间如何合理匹配,以减少单个碱基变异对整体比对的影响。将基因序列视为一个由a、G、T、C四个字符组成的字符串,其两两匹配问题等价于经典的LCS(最长公共子序列)问题,即通过增加空格使两个字符串对应位置的相等字符数最大化。
  由于单个字符的编辑操作受到限制,因此可以列出每个匹配的状态转移方程,然后使用动态规划算法:Needleman-Wunsch(NW)算法找到最佳匹配。经过结构分析,该算法的时间复杂度和空间复杂度均为O(mn)。通过和现有序列匹配工具的比较,表明该算法具有高效性、准确性和适用性,匹配度为86.71%。
  根据基因距离,我们可以在一组同源基因中反转共同的祖先序列,并绘制家谱树。对于系谱树,我们参考系统发育树的生成,并应用两种算法来重建一组基因之间的进化过程。邻域连接法(NJ)和算术平均无权对群法(UPGMA)采用不同的聚类原则,可以构造两个不同的系谱树。将系统发育树与序列比对算法相结合,有效地得到了原始序列。
  为了验证系谱树的准确性,我们还设计了一个自顶向下的生成程序来模拟基因进化过程。结果表明,回溯得到的祖先序列与生成序列的起始点具有很高的相似性,证明了该算法的准确性和实用性。

模型假设:

  为了简化问题,我们做了以下假设:

  •1.有限的基因突变
  我们假设序列突变只发生在单个碱基发生改变、插入和缺失的情况下。
  •2.所研究的序列对一般都具有全局最优比对,基因序列比对大致可分为全局比对和局部比对两类。为了简化情况,
  •3.尽管正、副同系物是同系物的两个重要概念,但它们之间的区别是可以忽略的,难以量化和区分。因此,我们忽略了这两个亚类之间的差异,只关注同源基因的遗传距离。
  •4.模拟的基因变异率高于实际的基因变异率,实际的基因变异率很低,约为50%。然而,在模拟程序中,我们假设每个变异率都略高于实际值,以使比较更加显著。

问题重述:

  为了更有效地解决问题,我们将课题的要求归纳为以下具体问题,并对如何回答这些问题进行了深入分析。

  •问题1:设计一种有效的算法来测量两个碱基序列之间的遗传距离。
  计算基因距离有两个关键点:
  1、确定基因距离的定量表示
  2、设计一种高效的算法实现两个字符串序列的对齐

  •问题2:评估算法的复杂性和准确性。
  对于复杂性,需要进行时间和空间复杂性分析;在准确性方面,我们设计了几个特殊的测试样本,以验证算法逻辑的严密性。

  •问题3:设计一种有效的算法来确定多个同源碱基序列的祖先序列。
  基于上述基因距离的确定,我们可以得到一组碱基序列中任意两个样本之间的相似性。通过不断寻找相似度最大的样本,并将它们合并得到它们的直系祖先,我们可以自下而上构造一棵系谱树。
  与问题2类似,我们可以生成一系列具有已知遗传关系的序列来检验算法的准确性。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

1 import sys
2 import time
3 import platform
4
5 def theta(a, b):
6 if a != b: # gap or mismatch
7 return1
8 if a == b: # match
9 return 1
10 if a == ’−’ or b == ’−’:
11 return1
12
13 def make_score_matrix(seq1, seq2):
14
15 seq1 = ’−’ + seq1
16 seq2 = ’−’ + seq2
17 score_mat = {}
18 trace_mat = {}
19
20 for i,p in enumerate(seq1):
21 score_mat[i] = {}
22 trace_mat[i] = {}
23 for j,q in enumerate(seq2):
24 if i == 0:
25 # first row, gap in seq1
26 score_mat[i][j] = −j
27 trace_mat[i][j] = 1
28 continue
29 if j == 0:
30 # first column, gap in seq2
31 score_mat[i][j] = −i
32 trace_mat[i][j] = 2
33 continue
34 ul = score_mat[i−1][j−1] + theta(p, q)
35 # from up−left, mark 0
36 l = score_mat[i][j−1] + theta(’−’, q)
37 # from left, mark 1, gap in seq1
38 u = score_mat[i−1][j] + theta(p, ’−’)
39 # from up, mark 2, gap in seq2
40 picked = max([ul,l,u])
41 score_mat[i][j] = picked
42 trace_mat[i][j] = [ul, l, u].index(picked)
43 # record which direction
44 print("SameNum:",score_mat[i][j])
45 return score_mat, trace_mat
46
47 def traceback(seq1, seq2, trace_mat):
48
49 seq1, seq2 = ’−’ + seq1, ’−’ + seq2
50 i, j = len(seq1)1, len(seq2)1
51 path_code = ’’
52 while i>0 or j > 0:
53 direction = trace_mat[i][j]
54 if direction == 0:
55 # from up−left direction
56 i = i−1
57 j = j−1
58 path_code =0+ path_code
59 elif direction == 1:
60 # from left
61 j = j−1
62 path_code =1+ path_code
63 elif direction == 2:
64 # from up
65 i = i−1
66 path_code =2+ path_code
67 return path_code
68
69 def print_m(seq1, seq2, m):
70 seq1 = ’−’ + seq1; seq2 = ’−’ + seq2
71 print()
72 print(’ ’.join([%3s’ % i for i in ’ ’+seq2]))
73 for i, p in enumerate(seq1):
74 line = [p] + [m[i][j] for j in range(len(seq2))]
75 print(’ ’.join([%3s’ % i for i in line]))
76 print()
77 return
78
79 def pretty_print_align(seq1, seq2, path_code):
80 align1 = ’’
81 middle = ’’
82 align2 = ’’
83 n=0
84 for p in path_code:
85 n=n+1
86 if p ==0:
87 align1 = align1 + seq1[0]
88 align2 = align2 + seq2[0]
89 if seq1[0] == seq2[0]:
90 middle = middle +|91 else:
92 middle = middle + ’ ’
93 seq1 = seq1[1:]
94 seq2 = seq2[1:]
95 elif p ==1:
96 align1 = align1 + ’−’
97 align2 = align2 + seq2[0]
98 middle = middle + ’ ’
99 seq2 = seq2[1:]
100 elif p ==2:
101 align1 = align1 + seq1[0]
102 align2 = align2 + ’−’
103 middle = middle + ’ ’
104 seq1 = seq1[1:]
105
106 if n==50:
107 print(’EMBOSS_001:+ align1)
108 print(’EMBOSS_002:+ align2+ ’\n’)
109 n=0
110 align1 = ’’
111 align2 = ’’
112 return
113
114 def usage():
115 print(’Usage:\n\t python nwAligner.py seq1 seq2\n’)
116 return
117
118 def main():
119 with open(’gene1.txt’,’r’,encoding=’utf−8) as f1:
120 seq1 = f1.read()
121 with open(’gene2.txt’,’r’,encoding=’utf−8) as f2:
122 seq2 = f2.read()
123 #
124 # print(’1: %s’ % seq1)
125 # print(’2: %s’ % seq2)
126
127 score_mat, trace_mat = make_score_matrix(seq1, seq2)
128 # print_m(seq1, seq2, score_mat)
129 # print_m(seq1, seq2, trace_mat)
130
131 path_code = traceback(seq1, seq2, trace_mat)
132 pretty_print_align(seq1, seq2, path_code)
133 # print(’ ’+path_code)
134
135 if __name__ == ’__main__’:
136 print(:, platform.system())
137 T1 = time.perf_counter()
138 main()
139 T2 =time.perf_counter()
140 print(:%s’ % ((T2 − T1)*1000))
 %−−−−−−−−−−−−−−− test1−−−−−−−−−−
2 % Runs example for UPGMA and NJ
3
4 clc
5 clear all
6
7 data = {’Anolis’ ’ATGACAATTACACGCAAATCCCACCCAATTTTC
8 AAAATTATTAACGACTCCTTTATTGAT’;
9 ’Basili’ ’ATGACAATCCTACGAAAATCCCACCC
10 AATCCTTAAAATAATCAACTCTTCATTCATCGAC’;
11 ’Chalar’ ’ATGACAATCATCCGAAAAACACACCC
12 AATTTTCAAAATTGTAAACGACTCATTCATTGAC’;
13 ’Gambel’ ’ATGACAATCACACGAAAATCCCACCCG
14 ATCATCAAAATCGTAAACAACTCATTTATTGAC’;
15 ’Leioce’ ’ATGACAATCACACGAAAAACTCACCCA
16 CTATTTAAAATCATCAATAACTCCTTTATTGAC’;
17 };
18 for ind = 1:length(data)
19 f(ind).Header = data{ind,1};
20 f(ind).Sequence = data{ind,2};
21 end
22
23 % UPGMA
24 distances = seqpdist(f,’Method’,’Jukes−Cantor’,’Alpha’,’DNA’);
25 UPGMAtree = seqlinkage(distances,’UPGMA’,f);
26 h = plot(UPGMAtree, ’orient’, ’top’);
27 title(’UPGMA Distance Tree of Iguanas
28 using Jukes−Cantor model’);
29 ylabel(’Evolutionary distance’)
30
31
32 % NJ
33 NJtree = seqneighjoin(distances,’equivar’,f);
34 h = plot(NJtree, ’orient’, ’top’);
35 title(’Neighbor−Joining Distance Tree of Iguanas using
36 Jukes−Cantor model’);
37 ylabel(’Evolutionary distance’)
38
39 %−−−−−−−−−−−−−−−− test2 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
40 % This test runs Branch and Bound and Exhaustive Search
41
42 clear all
43 clc
44 data_iguana = { ’Anolis’ ’ATGACAATTACACGCAAATCCCACCCAATTTT
45 CAAAATTATTAACGACTCCTTTATTGAT’;
46 ’Basili’ ’ATGACAATCCTACGAAAAT
47 CCCACCCAATCCTTAAAATAATCAACTCTTCATTCATCGAC’;
48 ’Chalar’ ’ATGACAATCATCCGAAAAA
49 CACACCCAATTTTCAAAATTGTAAACGACTCATTCATTGAC’;
50 ’Gambel’ ’ATGACAATCACACGAAAATCCC
51 ACCCGATCATCAAAATCGTAAACAACTCATTTATTGAC’;
52 ’Leioce’ ’ATGACAATCACACGAAAAACTCA
53 CCCACTATTTAAAATCATCAATAACTCCTTTATTGAC’;
54 ’Leioce1’ ’ATGACAATCACACGAAAAACTCAC
55 CCACTATTTAAAATCATCAATAACTCCTTTATTGAC’;
56 ’Leioce2’ ’ATGACAATCACACGAAATACT
57 CACCCACTATTTAAAATCATCAATAACTCCTTTATTGAC’;
58 ’222222’ ’ATGACAATCACACGAAATACTCA
59 CCCACTATTTAAAATCATCAATAACTCCTTTATTGAC’;
60 };
61
62 %Create a matrix with al sites with usefull information
63 [row, col] = size(data_iguana);
64 for i = 1:row
65 temp = data_iguana{i, 2};
66 matrix{i, :} = temp;
67 names = data_iguana{i, 1};
68 name_matrix{i, :} = names;
69 end
70
71 for i = 1:row
72 data(i, :) = matrix{i};
73 end
74
75 set_of_seq = non_inf_sites(data, 3);
76 %Search using improved Branch and Bound
77 tic
78 [optimal_score, optimal_model] = BrB(set_of_seq, name_matrix);
79 toc
80
81
82 %% Search using Exhaustive Search
83 tic
84 [optimal_score1, optimal_model1] = ExhaustiveSearch(set_of_seq,
85 name_matrix);
86 toc
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

相关文章:

2022年第十一届数学建模国际赛小美赛B题序列的遗传过程解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 B题 序列的遗传过程 原题再现: 序列同源性是指DNA、RNA或蛋白质序列之间的生物同源性,根据生命进化史中的共同祖先定义[1]。DNA、RNA或蛋白质之间的同源性通常根据它们的核苷酸或氨基酸序列相似性来推断。显著的相…...

【Linux】静态库与动态库制作及运行原理

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 本篇导航 0. 静态库与动态库1. 制作与使用静态库2. 制作与使用动态库3. 动态库是如何被加载到内存?3.1程序地址空间 0. 静态库…...

工具站推荐

自己搭了一个文本工具站 TextTool,包含了常用的文本功能。 我自己比较常用 行转列、列转行、下划线替换的功能。 欢迎各位大佬提意见和建议...

【JS】toFixed()无法精准保留小数的解决方案

情景复现: 发现用 toFiexd() 四舍五入保留小数有时不是很精确,接下来用 a 8.0345,b8.045,举例如下: var a 8.035; console.log(a.toFixed(2)) // 8.04 var b 8.045; console.log(b.toFixed(2)) // 8.04 不难看出…...

vue3版本学习

1,响应式ref或者reactive const aa ref(hello) const bb reactive({ aa: hello, ss: workd }) 2,计算属性 响应式属性经过计算得到的值(ref),放到模板中,只会随着响应式author.books属性变化而变化 const autor …...

【WPF.NET开发】创建简单WPF应用

本文内容 先决条件什么是 WPF?配置 IDE创建项目设计用户界面 (UI)调试并测试应用程序 通过本文你将熟悉在使用 Visual Studio 开发应用程序时可使用的许多工具、对话框和设计器。 你将创建“Hello, World”应用程序、设计 UI、添加代码并调试错误。在此期间&#…...

视频智能分析国标GB28181云平台EasyCVR加密机授权异常是什么原因?

国标GB28181视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等。 近期有用户选择使用加密机进行EasyCVR授…...

Mysql安全之基础合规配置

一、背景 某次某平台进行安全性符合型评估时,列出了数据库相关安全选项,本文特对此记录,以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别; 1)对登录Mysql系统用户的密码复杂度是否有要…...

前后端分离项目跨域请求

一、前端vue项目 在项目中创建request.js文件,添加以下内容 import axios from "axios"; const api axios.create({ //这里配置的是后端服务提供的接口baseURL: "http://localhost:8080/web-demo",timeout: 1000} ); export default api; …...

OpenEuler系统桌面终端设置字体

初始界面 终端的字体间距过大,阅读起来不方便。 调整终端字体 点击菜单,选择“配置文件首选项” 未命名 ---- 文本---- 勾选 自定义字体 ---- 选择 "DejaVu LGC Sans Mono"字体 你也可以根据自己的喜好,选择其他字体。 修改好了…...

repo常用命令解析(持续更新)

1 同步 1.1 将本地仓库更新到最新状态。它会从远程服务器下载最新的代码,并将本地仓库与之同步。如果本地仓库中已经存在某个项目,repo sync会自动检测本地仓库中该项目的版本,并将其更新到最新状态。 类似于git fetch和git merge命令组合使…...

关于小红书商单变现的一些答疑

AI小红书商单训练营也过去1个月了,今天给大家汇总几个常遇到的问题,希望对大家在运营过程中有所帮助。 1.账号封面是否要统一模版? 为了让账号主页呈现整洁美观的效果,建议统一封面设计,视频开头可以设置一个固定画面…...

使用 Kubernetes Agent Server 实现 GitOps

目录 温习 GitOps 极狐GitLab Kubernetes Agent 极狐GitLab GitOps workflow 极狐GitLab KAS 的配置 创建极狐GitLab agent 创建 agent token Kubernetes 上安装 agent(agentk) 极狐GitLab GitOps workflow 实践 写在最后 温习 GitOps GitOps …...

Day12 qt QMianWindow,资源文件,对话框,布局方式,常用ui控件

QMianWindow 概述 QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏( menu bar )、多 个工具栏 (tool bars) 、多个铆接部件 (dock widgets) 、一个状态栏 (status bar) 及 一个中心部件 (central widget) 许多应用程序的基础…...

Python实现广义线性回归模型(statsmodels GLM算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义线性模型(Generalized Linear Model,简称GLM)是一种广泛应用于回归分析和分类问题的统…...

GNSEC 2022年第8届全球下一代软件工程线上峰会-核心PPT资料下载

一、峰会简介 新一代软件工程是指利用新的理论、方法和技术,在软件开发、部署、运维等过程中,实现软件的可控、可预测、可维护的软件生产方式。它涵盖了多个领域,如软件开发、测试、部署、运维等,旨在提高软件生产效率和质量。 …...

nVisual能为数据中心解决什么问题?

nVisual通过可视化的管理方式,使数据中心管理者能够有效且高效地管理数据中心的资产、线缆、容量、变更;使数据中心管理者能够获得如下问题的答案,以便能够快速做出更好、更明智的决策: 1.资产管理 我们有什么&#x…...

Android--Jetpack--Databinding详解

不经一番寒彻骨,怎得梅花扑鼻香 一,定义 DataBinding, 又名数据绑定,是Android开发中非常重要的基础技术,它可以将UI组件和数据模型连接起来,使得在数据模型发生变化时,UI组件自动更新。是 MVVM 模式在 An…...

Node.js入门指南(完结)

目录 接口 介绍 RESTful json-server 接口测试工具 会话控制 介绍 cookie session token 上一篇文章我们介绍了MongoDB,这一篇文章是Node.js入门指南的最后一篇啦!主要介绍接口以及会话控制。 接口 介绍 接口是前后端通信的桥梁 &#xff0…...

MySQL和Java通用加密解密方式

加密方式使用 AES 加密,再转成 Base64。 SQL -- 加密 update your_table set your_columnto_base64(aes_encrypt(your_column, "password"));-- 解密 select aes_decrypt(from_base64(your_column) ,"password") from your_table; 使用原生 …...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率&#xff0c…...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...