基于优化递归算法的分子量分解问题.doc_第1页
基于优化递归算法的分子量分解问题.doc_第2页
基于优化递归算法的分子量分解问题.doc_第3页
基于优化递归算法的分子量分解问题.doc_第4页
基于优化递归算法的分子量分解问题.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于优化递归算法的分子量分解问题 摘要:本文讨论的问题是:在实验室拥有或不拥有计算机的情况下,如何将已知分子量x的蛋白质分解成18种已知分子量的氨基酸的问题,并满足蛋白质含氮量在15%17%的物理性质。在实验室有计算机的情况下,本文首先考虑了穷举算法,该问题就等效为十八元一次方程求整数解的问题,表示为每种氨基酸构成蛋白质数量root(i)的上限为+1,取x最大为1000时,有种,运算量过大难以实现。我们又考虑了递归算法,即从分子量最大的第18种氨基酸开始考虑,第18种氨基酸分子构成蛋白质的个数,对root进行分类取值,在取值已知的情况下再考虑第17种氨基酸,此时分子量减去第18种氨基酸总分子质量,得到新的分子量,将大大减少计算量。抽象归纳为的取值范围如下:该算法同样满足含氮量的约束条件。我们借助C语言编写程序并对程序进行优化,大大加快了运行速度。 在实验室无计算机的情况下,由氨基酸的结构通式得出,每个氨基酸都存在结构,分子量为56。本文将18种氨基酸的分子量都减去56,得到18种氨基酸R基的分子量。先将任一分子量除以56取整,得到构成该蛋白质的氨基酸数目的范围(即),再根据b的取值进行分类讨论从而选择R基,后根据蛋白质含氮量对结果进行验证,在人工的情况下,此方法相对于递归法大大地减少了计算量。关键词:分子量分解问题 递归优化法 含氮量 C语言 结构通式1、问题重述 生命蛋白质是由若干种氨基酸经不同的方式组合而成。在实验中,为了分析某个生命蛋白质的分子组成,通常用质谱实验测定其分子量x (正整数),然后将分子量x分解为n个已知分子量ai(i=1,.,n)氨基酸的和的形式。某实验室所研究的问题中:n=18, x1000,ai(i=1,.,18)分别为57, 71, 87, 97, 99, 101, 103, 113, 114, 115, 128, 129, 131, 137, 147, 156, 163, 186。要求针对该实验室拥有或不拥有计算机的情况,对如何分解分子量x作出解答,即针对任意一个分子量x具体给出由哪些ai(i=1,.,n)氨基酸组成。 2、问题分析 题目中给出18种氨基酸分子量,要求解出已知分子量的蛋白质由哪几种氨基酸组成。初步分析,这是十八元一次方程求整数解的问题,方程形式为其中为已知量,为18种氨基酸分子量,未知数为组成蛋白质的每种氨基酸的个数。3、模型假设 (1)假设氨基酸组合形成蛋白质时不脱水。 (2)假设蛋白质中肽键不存在多键或成环情况,两个氨基酸之间只形成一条肽键。 (3)假设每种氨基酸出现的概率都相同。4、符号设定 第种氨基酸的分子量; 第种氨基酸的数量; 第种氨基酸分子中氮原子的个数; 蛋白质分子量; 第种氨基酸基的分子量; 蛋白质中所含氨基酸的总数;5、模型建立与求解5.1实验室有计算机时的模型建立5.1.1穷举法模型我们首先考虑用穷举算法求解方程,根据上文符号设定,该方程可以表示为其中且为整数。利用穷举法,对每个分别取,1,找出符合上述方程的每个的取值,所得的每组解的集合即为最终解。穷举算法利用MATLAB实现,程序代码见附录一。 用上述算法,我们发现,如果的取值太大,MATLAB警告“busy”,程序无法运行。假如,求出每一个的最大值,如表一所示:表一 最大值i123456789101112131415161718a(i)5771879799101103113114115128129131137147156163186root(i)17141110109988877776665运算次数为次,MATLAB无法进行如此大数量级的运算,导致可求解的具有很大的局限性。所以我们建立下文中的新模型,从而减少运算次数,提高运算速度,增强运算可行性。5.1.2递归法模型 为减少冗余次数,我们设计思路如下:从分子量最大的氨基酸开始考虑,初步确定第18种氨基酸分子个数后,对剩下17种氨基酸的确定,则不需要再用作为衡量标准,而可以将蛋白质中所含第18种氨基酸总分子质量减掉后,得到新的分子量,则剩下的17种氨基酸可以用新的分子量来确定。按照此思路分析,的新取值范围如下:利用这种模型,可以有效减少运算次数,使程序可以顺利运行。5.1.3结果筛选我们考虑通过查阅资料了解到测定蛋白质的常用指标是含氮量,一般蛋白质的含氮量在15%17%左右。所以我们设定限制条件利用此条件,可以把不符合蛋白质基本性质的结果筛选出去,剩下的解即为该问题的最终结果。根据题目中给出的18种氨基酸的分子量,我们可以查找出题目中18种氨基酸的种类、分子式,从而得到每种氨基酸分子中氮原子个数,如表二所示(题目中按照氨基酸两端成键给出分子量,故在写分子式时也考虑为两端成键):表二 18种氨基酸信息一览表分子量名称分子式分子中含氮原子个数氨基酸含N量57甘氨酸10.2471丙氨酸10.1987丝氨酸10.1697脯氨酸10.1499缬氨酸10.14101苏氨酸10.14103半胱氨酸10.14113亮氨酸/异亮氨酸10.12114天冬酰胺20.24115天冬氨酸10.12128谷酰胺/赖氨酸20.22129谷氨酸20.22131蛋氨酸10.11137组氨酸10.10147苯丙氨酸30.29156精氨酸10.09163酪氨酸40.34186色氨酸10.08根据5.1.2中的递归模型以及5.1.3中的筛选条件,我们利用C语言编程实现,程序代码见附录二。当时,用此程序计算结果如表三所示:表三 当时利用递归法求解结果i123456789101112131415161718a(i)5771879799101103113114115128129131137147156163186root1100001100000 000000root2011000100000000000root30030000000000000005.1.4优化递归算法在附录二的程序中,我们调用了递归函数求解,而层层调用递归函数往往会使预算速度变慢,不利于该方法的实际应用价值的发挥。所以,我们对程序进行优化,不再调用递归函数,而取一个数列,将上次运算后的结果储存在的每一个格子中,这样可以避免多次调用递归函数导致的冗余运算,并将结果以格式输出,不再结果框中显示结果,从而大大加快程序运行速度,优化后程序见附录3。当时,优化前运算时间为,优化后运算时间不到。5.2实验室无计算机时的模型建立氨基酸结构通式为(两端成键,为任意元素或基),不难得出,每种氨基酸都存在基本结构,该基本结构分子量为56,故可以得到18种氨基酸基分子量。先将任一分子量除以56取整,得到构成该蛋白质的氨基酸数目的范围(即),再根据b的取值进行分类讨论从而选择R基,后根据蛋白质含氮量对结果进行验证,基分子量如表四所示:表四 18种氨基酸基分子量i123456789101112131415161718a(i)5771879799101103113114115128129131137147156163186r(i)11531414345475758597273758191100107130仍以x=261为例,因为,所以下面分4种情况进行分类讨论: (1)b=1 ,表示蛋白质由一个氨基酸构成,存在一个R基等于261-56=205,=130,故该情况不成立。(2)b=2,表示蛋白质由两个氨基酸构成,存在两个R基之和等于261-56*2=149,58+91=149,即261=114+147,含N量为26%,不符合要求。故该情况也不成立。(3) b=3,表示蛋白质由三个氨基酸构成,存在三个R基之和等于261-56*3=93:93145479315314793313131931191当261=57+57+147时,含氮量为27%,此情况舍去。故存在三种情况:261571011032617187103261878787(4)b=4,表示蛋白质由四个氨基酸构成,存在四个R基之和等于261-56*4=37,不存在任一情况使之成立。6、模型分析 在实验室有计算机的情况下,本文结合化学基本知识,采用递归算法,并用C语言编程。与此同时,我们对C语言程序进行了优化,使得速度大大提升,方便用于实际计算与测量中。 在实验室无计算机的情况下,本文找出了氨基酸的结构通式,明确了氨基酸基本结构,将问题从氨基酸组合转化为基组合,使计算量大大减小。但当x较大时,人工方法难以避免较大的计算量。7、模型推广在实际计算与测量中,蛋白质的物理性质和化学性质是不容忽视的。本文中只利用蛋白质含氮量这一个条件对结果进行筛选,但得出的结果未必全部满足蛋白质的其他性质,故在实际生产生活中,如想要准确测定某种蛋白质的组成,还需要借助其他专业仪器,从多方面着手。8、结论 在实验室有计算机的情况下,本文建立递归算法模型,根据蛋白质含氮量在15%17%的物理性质,对所得结果进行筛选。并利用C语言编程,优化了程序,形成“优化递归算法”,大大加快运行速度。 在实验室无计算机的情况下,每个氨基酸都存在结构,分子量为56。所以本文得到18种氨基酸R基的分子量,再根据已知量x,按照所含氨基酸个数进行分类讨论。此方法相对于递归法,大大地减少了计算量,方便在无计算机的情况下解出最终结果。9、参考文献1Mark M.Meerscharert,数学建模方法与分析,北京:机械工业出版社,2005。附录1:MATLAB程序(穷举法)S=zeros(1,18);for a=0:fix(x/57) for b=0:fix(x/71) for c=0:fix(x/87) for d=0:fix(x/97) for e=0:fix(x/99) for f=0:fix(x/101) for g=0:fix(x/103) for h=0:fix(x/113) for i=0:fix(x/114) for j=0:fix(x/115) for k=0:fix(x/128) for l=0:fix(x/129) for m=0:fix(x/131) for n=0:fix(x/137) for o=0:fix(x/147) for p=0:fix(x/156) for q=0:fix(x/163) for r=0:fix(x/186) if 57*a+71*b+87*c+97*d+99*e+101*f+103*g+113*h+114*i+115*j+128*k+129*l+131*m+137*n+147*o+156*p+163*q+186*r=x S=S;a b c d e f g h i j k l m n o p q r; end end end end end end end end end end end end end end end end end endendS附录2:C程序(递归法)#include #include #include using namespace std;/global setting int weight18=57, 71, 87, 97, 99, 101, 103, 113, 114, 115, 128, 129, 131, 137, 147, 156, 163, 186; int root18=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; int N_number18=1,1,1,1,1,1,1,1,2,1,2,2,1,1,3,1,4,1;int K=0;double root_number=0;double root_number2=0;ofstream fout(E:/TestDir/cfiletest.txt);void Digui(int n,int x)int branch_number = x/weightn;/printf(%d,branch_number);if(x= 0;i-)rootn = i;if( x-i*weight0 = 0)double N_content=0;int k=0;for(k=0;kK*0.15 & N_contentK*0.17)root_number = root_number + 1;int j=0;printf(root:);foutrootroot_number:;for(j=0;j18;j+)printf(%d ,rootj);foutrootj ;printf(n);fout= 0;i-)rootn = i;/printf(x: %dn,x-i*weightn);/printf(n-1:%dn,n-1);Digui(n-1,x-i*weightn); return; int main()int x;printf(Please input K:);scanf(%d,&K);x=K;int i=0;printf(weight:);for(i=0;i18;i+)printf(%d ,weighti);printf(n);Digui(17,x);printf(total:);printf(%f n,root_number);printf(unstrict total:);printf(%f n,root_number2);return 0;附录3:C程序(优化递归算法)#include /global setting int weight18=57, 71, 87, 97, 99, 101, 103, 113, 114, 115, 128, 129, 131, 137, 147, 156, 163, 186; int root18=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; int x=0;double root_number=0;int temp18;int main()printf(Please input x:);scanf(%d,&x);int i;int j18;for(j17=x/weight17;j17=0;j17-)temp17=x-weight17*j17;for(j16=temp17/weight16;j16=0;j16-)temp16=temp17-weight16*j16;for(j15=temp16/weight15;j15=0;j15-)temp15=temp16-weight15*j15;for(j14=temp15/weight14;j14=0;j14-)temp14=temp15-weight14*j14;for(j13=temp14/weight13;j13=0;j13-)temp13=temp14-weight13*j13;for(j12=temp13/weight12;j12=0;j12-)temp12=temp13-weight12*j12;for(j11=temp12/weig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论