资源描述
DNA限制性图谱的绘制摘要 本文是关于用SPDP法即简化的局部消化方法来确定DNA链的根本的片段排列顺序的问题。针对问题一,我们运用穷举法,并根据实际DNA链的排列实际将穷举法进行限定,即用简化穷举法。并以此为根底建立二叉树数据结构模型,通过MATLAB软件计算,对问题一中的两个实例进行求解。由于实例一,由于所给数据量非常小,我们可以通过笔算进行试值的方法或者通过MATLAB程序得出其排列顺序为2-6-1-4-3。对于实例二,由于存在可能解一共有八组,我们不再在这里表示出来。 SPDP算法是基于二叉树数据结构的穷举法产生的,首先经过了标准化的过程,然后利用b-b表与b-c表两个表逻辑、拓扑的关系相互约束,以此对穷举法进行限定,使穷举的次数大大降低,到达实用的效果。但是当所给实验数据较多是任然相当费时费力,而且SPDP所得出的结果也不唯一,所给实验数据越多那么实验所得可能的X也越多,还需要根据实际遗传学DNA序列的规律进行排除,选择最终唯一正确的值。所以该方法在实验数据大时实用性较低。针对问题二,随着实验数据的增多不能分辨的元素也越来越多,使得可能的X也增多。 X的增多意味着任然需要很大的后续工作量。在误差存在的条件下,一组数据的相互分辨能力决定于两个因素,一是误差限的大小,二是数据值分布的疏密程度,即数据的方差或标准差。所以,当数据的平均绝对误差限的数量级到达与数据标准差相当的或更大程度时,数据之间的分辨就会变得非常困难,问题的求解也会变得根本无法进行了。在模型建立后,我们对其进行了推广及应用,并取得了积极有效的成果。 一、问题重述 绘制DNA限制性图谱restriction mapping是遗传生物学中的重要问题。由于DNA分子很长,目前的实验技术无法对其进行直接测量,所以生物学家们需要把DNA分子切开,一段一段的来测量。在切开的过程中,DNA片段在原先DNA分子上的排列顺序丧失了,如何找回这些片段的排列顺序是一个关键问题。为了构造一张限制性图谱,生物学家用不同的生化技术获得关于图谱的间接的信息,然后采用组合方法用这些数据重构图谱。一种方法是用限制性酶restriction enzyme来消化DNA分子。这些酶在限制性位点(restriction sites)把DNA链切开,每种酶对应的限制性位点不一样。对于每一种酶,每个DNA分子可能有多个限制性位点,此时可以按照需要来选择切开某几个位点不一定连续。DNA分子被切开后,得到的每个片段的长度就是重构这些片段的原始顺序的根本信息。在多种获取这种信息的实验方法中,有一种广泛采用的方法:局部消化the partial digest, PDP方法。在PDP中,采用一种酶,通过实验得到任意两个限制性位点之间片段的长度。假设与使用的酶对应的限制性位点有n个, 通过大量实验,可得到n+2个点n个位点加上两个端点中任意两点之间的距离,共个值。然后用这个距离来重构n个限制性位点的位置(解不一定唯一,两个端点对应于最长的距离)。假设是线段上的点集中所有点之间距离的集合,PDP就是给定求。以下图给出了一个例子。 图1. A,B是DNA分子的两个端点。 a,b,c和d是限制性位点。 通过实验可以得到 =2,3,4,5,2,5,9,14,16,7,12,14,9,11,7. 再通过来求,对应于上图的=0,2,5,9,14,16是一种解。上述方法要把DNA分子在任意的两个限制性位点处切开,这对于当前的实验技术来说有相当难度,而且,还要对实验数据进行处理,也很复杂。最近研究人员提出了一种新的方法,称为简化的局部消化方法SPDP。这个方法与PDP的不同就在于它防止了在任意两个位点切开DNA分子的难题和处理重复数据的困难。仍假设与使用的酶对应的限制性位点有n个。首先DNA分子被复制成n+1份,前n个复制品中的每一个在一个限制性位点处被切开,最后一个复制品在所有的限制性位点处被切开。这样我们分别得到2n个片段长度称为第一组数据和n+1个片段长度称为第二组数据。在没有误差的前提下,第一组数据中2n个长度可以分成n对,每对的和都等于DNA分子的总长度;第二组数据中n+1个长度的和也等于DNA分子的总长度。 SPDP问题是如何利用这两组数据重构出这n+1个片段在DNA分子上的排列,使得这个排列在n个位点切开后得到的2n个片段长度与实验得到的2n个长度相等。以下图给出了一个例子。 图2. 这个例子对应的位点有4个。(a) 就是我们希望重构的顺序。 (b)中的前4对为第一组数据,它通过切开一个位点得到,每对长度的和都是16,剩下的为第二组数据,含5个片段长度,它通过切开所有位点得到,它们的长度总和也是16, 但实验结果只告知每段的长度,不知道它们在DNA分子上的排列顺序。现对上述SPDP问题,建立数学模型,并研究以下问题:1.设计求解该问题的算法, 并评估该算法的效率和效果。对下述2个实例给出答案:实例1: 第一组数据:2,14,8,8,9,7,13,3 第二组数据:2,1,4,3,6实例2: 第一组数据:1,14,12,3,7,8,9,6,11,4,12,3,13,2,5,10第二组数据:1,1,2,1,2,2,1,2,32.讨论在实验中测量片段长度时的误差,将在多大程度上影响算法的效果,当误差到多大程度时,限制性图谱的重构将无法进行。 二、模型假设及符号说明 1、假设DNA在用限制性内切酶剪切的时候,每一个限制性位点处被切开。 2、假设每一段DNA都能被准确顺利的计数。 3、在实验中测量片段长度时的误差近似服从正态分布。4、记录第一组数据时在各个限制性切点切得准确,不出现漏切现象 符号说明符号符号表示量备注L被研究的基因链总长度第i个被切且仅切为两段的基因ck第k个基因片段的长度bs每对b中的较小者C第二组数组成的集合cnC集合中的数bj与bi 相匹配的位于基因后半段的数第二组数中与b1相匹配的数,即基因的第一个片段长度cj基因的最后一个片段长度pc值重复的个数c中的某个元素ck每对b相减的差pk数据c中的个数c数据中最大的为两个b数相减可以等于的所有的组合的个数三、 问题分析 SPDP 问题的目标是求出 DNA 限制性图谱,由于 SPDP 提供的两组数据相对于原有的 DNA 限制性图谱已经不完整,通常情况下有多个解,当解不唯一的情况下,必须解出所有可能解,然后利用生物学方法判断这些可能接中哪一个是原 DNA 限制性图谱,如果算法求出的解不全,有可能真实的 DNA 限制性图谱没有被求出,那么对下一步的科学工作会导致错误,所以 SPDP 算法是要求出所有符合第一组和第二组数据的全部可能解。 在解决该实际问题时,我们选择使用穷举法来求解,再通过不断优化改良,得到一个高效简明的穷举算法 。核心思想是通过对第一组数据与第二组数据分析,不仅考虑组内数据的关系,同时也分析组间的数据关系,得到对于SPDP解的约束,在搜索中,利用约束,可以去掉绝大局部的不可能解,只需要在极少剩余的可能解搜索即可得到全部SPDP问题的解。先从第一组数据入手,进行一定的组合,而利用第二组数据对第一组数据的组合进行检验。这里,我们首先要对第一组数据进行一定的处理。在第一组数据中,DNA都是被切成两段,当DNA总长度L知道的时候,其实只要知道每对b中的一个值就得到了全部的信息。现在我们将每对b中较小的一个挑出来假设与相等任取一个就可以。这样我们就得到了n个数据,再对这n个数据进行升序排列,得到一个不严格递增的b序列,在这里不妨记作,它们满足,它包含了第一组数据的所有的信息。 为了方便计算,我们不妨先对基因图谱的起点和终点做一个规定,假设从起点算起,第一个位点到起点的距离小于或者等于从终点算起第一个位点到终点的距离,即。对于重新组织后的第一组数据,其含义为:对于某一个,它表示离这段基因起点或者终点距离的位置有一个位点。那么对于第二种穷举方法也就由此而得出,对于每个它有两种状态,一种是靠近起点不妨用“0表示,另一种是靠近终点不妨用“1来表示。而当全部的的状态确定后,DNA的顺序也就确定了,但此时要对这个顺序的合理性进行检验,即检验这个顺序是否符合第二组数据c的要求。具体措施如下:将“0状态的全部挑出来按照升序排列。再将“1状态的全部挑出来按照升序排列。记第二组数据c组成的集合为。然后检验是否满足以下条件:当全部检验条件符合的时候,这组组合即为合理的顺序,从DNA的起点算起,在前半段的基因中,第i段长度为 (其中),而对于后半段那么有相同的处理,其示意图如图5表示。流程图如图4表示。这里值得说明一下的就是对与这个循环的结束条件,因为对于基因的排序问题,必须要求出所有的可能解,因此对于这个循环就必须要把所有的可能组合全部进行一遍以后才可以停止,即需要循环次。 不合条件符合条件输出答案用c检验组合b图4图5 四、模型建立与求解方法问题一 通过查找文献,我们发现SPDP问题有它其中的一些特有的性质与规律,我们希望能找到这样的性质与规律来减少循环的次数,并且将复杂的问题化约为标准的情形便于算法的实现。基于上述这种考虑,我们寻找了一些性质,并将比拟重要的总结为一些根本的定理,以便后面进行算法设计与优化。在给出定理之前,先对一些术语做一定的规定。首先规定“同侧与“异侧。我们将整段基因分为前半段与后半段,以基因正中为分界。在第二种模型中,称为同侧,如果所表示的位点的位置在同一段中同属于前半段或后半段。称为异侧,如果所表示的位点不在同一段中。而对于整段基因的每个片段我们都将认为它是一个元素。那么从起点开始的第一个片段我们称之为“首元素。而从终点开始的第一个片段我们称之为“尾元素。而包含基因中点位置的基因片段我们称之为“中间元素。下面我们给出SPDP问题的一些根本定理定理一首元素定理 在模型中,对于第二组数据满足。那么为首元素片段的长度,。即在中存在与相等,并且从起点算起第一个基因片段的长度就为,或者说该片段就是。定理一说明:此定理唯一确实定了首元素,节省了排列这个元素的时间,它更重要的意义在于把问题进行标准化。定理二尾元素定理 在确定了首元素之后,我们把第二组数据中的除去,把与其对应的除去。在剩下的b与c中,我们寻找相等的b与c,比方,那么这个就是可能的尾元素,为它的对应元。即从整段基因的终点算起,第一个片段实际上是这段基因最后一个片段的长度为,或者说最后一段基因就是。定理二说明:此定理给出了尾元素最后一个片段可能的情况,与首元素一起可以将整段基因的首尾确定下来。当尾元素的可能性超过一个是我们每次只考虑其中一种首、尾元素的情况,然后对首、尾元素的组合进行穷举。可以看出这个循环最多是n-1次。定理三首尾排序定理 当首、尾元素确定后,假设首元素长度为,尾元素长度为,那么所表示的位点的位置必在同侧并且在前半段,并且它们所确定的位点在整段基因中彼此相邻,即所确定的两个同侧位点之间没有别的位点,其中i=2,3,4s-1。定理三说明:首先,对尾元素要进行一个补充,实际问题中有可能出现的情况,此时我们的脚标s选取两者脚表较大的一个,取而不取。而且对于相等的情况,与一定在异侧,表示在与中点对称的两个位置有两个位点。而且由此观点我们还可以知道如果,那么必然有。因此严格大于,严格小于。其实这个结论也非常重要,但很直观,就不在这里做为定理。而定理三一方面可以节省在组合中的状态选择,更主要的是当首尾元素确定后,它可以将SPDP问题进行标准化,即通过首尾排序定理后,我们可以把最靠近起点的s-1段基因看作一个整体因为这s-1段的顺序已经知道了,当作一个基因片段,它的长度为,并且。而b 中剩下的元素都比首尾元素大。定理四尾元素约束定理 在定理三的说明中,我们知道b中的元素有可能两两相等。如果,我们记录为重值代表。我们找出所有的重值的情况并记录其重值代表,其中角标满足。假设尾元素长度为,那么有约束,即。定理四说明:此定理是对尾元素定理的一个补充,通过这个约束限制了尾元素的可能情况,降低计算的复杂程度。定理五中间元素对偶定理 由前面的定义知道中间元素是包含中点的片段。那么此片段的两端有一端的位置必在所确定的位点,而另一段的位置假设为所确定的位点,那么一定有在第二组数据c中有元素与相等。那么这类就为另一端点。并且假设将视为从整段基因中点往两端算起的首位点首元素,它是距离中点最近的位点,而将视为中点另一侧的第一个出现的位点,那么中间元素的两端可以等效为基因的起点和终点,等效为首元素,等效为尾元素,那么定理一到定理四的性质在此处都将成立,这就是中间元素的两端与起点、终点的对偶性质。定理五说明:前四个定理实际上是从基因的两端出发并不断的向中间考察,而定理五刚好相反,是先确定最中间的情况,再想两边考察。对于定理五的应用在3.5进行讨论。图6定理六相邻重值等效方法 假设均为重值代表,即。那么在第二组数据c中一定有两个相等的,并且在整段基因中,它们的位置如图6所示。因此这两段基因片段的位置就已经确定下来,因此我们可以将A点与B点接起来,C点与D点接起来。这样,原来的基因长度就缩短了。在数据中除去上述几个元素,在剩余的b中我们要对进行一定的处理,对每个数处理后的值为,其中k=i+4, i+5n,为处理后的值。当如果有更多的重值代表两两相邻,我们可以用同样的方法在一开始就把这些位置已经确定的片段去除,等效出新的一整段基因以及它的初始数据。当最后计算出全部的结果之后再将这些的片段插回去。定理六说明:此定理最重要的作用就是可以将问题进行标准化,使要解决的问题不含有那些已经知道基因片段位置的这些特殊情况,从另一个角度看这也是通过对数据特征的观察降低计算的复杂度。标准化SPDP问题的建立 有了上面一些根本规律、定理的准备,我们就可以建立标准化的SPDP问题。建立过程如下:第一步:利用定理六相邻重值等效方法去除由于相邻对称的位点所确定的基因片段,调整两组数据b与c的值。第二步:利用定理一首元素定理确定首元素,除去b中的首元素元与c中的对应元。第三步:利用定理二尾元素定理与定理四尾元素约束定理确定尾元素的可能值。并在计算中对每个有可能的尾元素进行循环,当确定其中一个可能值作为尾元素时,去除b中的尾元素元与c中的对应元。第四步:利用定理三首尾排序定理,并将前s-1个片段看为等效首元素尾元素为。这里要注意:假设发现前s-1个片段中存在一个片段的长度在c中没有对应相等的值时,说明所选的尾元素并非真正的尾元素,此时返回第二步。 经过上述四步处理后,SPDP的原模型已被标准化。对此时的第一组数据b重新按递增排序,并重新给予脚标,将重值赋予同样的脚标。这样就可以得到新的,并记录有重值的b,仍用这样一组数来表示。由定理三说明中的分析知道b假设有重值最多只有两个元素等相等。而对于第二组数据c也同样重新赋予脚标并排序得到,并用记录每一个c值重复的个数。通过上面五步的操作,我们得到标准化的SPDP问题。为了保持定理的习惯,以及后面算法设计的方便。我们对于第一组数据b不去处首尾元素,那么为首元素, 为尾元素,b数据满足.而在c数据中我们却已经把首尾元素对应相等的值已经去除。那么对于标准化问题,我们要做的事情就是要确定的状态组合判定每个属于前半段还是后半段。而我们的数据结构与算法就需要针对这样的标准SPDP问题进行选取与设计。SPDP数据结构的选取利用二叉树图7 当我们已经将原模型转化为SPDP的标准问题后,我们就开始需要对的状态进行确定。因为在确定它们的状态的时候是逐一进行的,因此每轮到确定某个,它就有两个可能的选择属于前半段或者属于后半段。根据这样的一个特点我们选取二叉树作为SPDP标准问题的主体数据结构。接下来的问题就是要确定我们如何的逐一的对进行选择和建树。这里,我们选择的顺序是从开始从小到大的对b数据进行判定并建立二叉树。我们以为例来看下如何建树。如图7否判断该段b能否放入后半段DNA图谱判断该段b能否放入前半段DNA图谱否开始是进入下一个节点进行搜索是该节点子树没有解,搜索其他节点图8所示,要不然在前半段,要不然在后半段,并且我们考察与,这两个差值之中至少有一个可以与c中的某个元素相等。其原因为:是首元素,为尾元素,并且是数据b中除了、最小的元素,它所决定的位点应该是距离前半段第一个位点或者后半段第一个位点距离最近的点,一定是c中假设干片段中的一个,不然在这种首尾元素组合下没有合理解。这样,我们就可以通过判定能否在c中找到=或者=而判定状态的可能性。倘假设=,那么就有可能在前半段,建立二叉树时现在所处在的结点就有左树枝,而左树枝结点的数据中,c中的数据就要去除。当=,那么现在所处的结点有右树枝,并且对右树枝所在的结点做同样的处理。如果,那么右树枝为空,并且不再被考虑,因为那是一条不可能的路径。依次类推,我们从小到大依次考虑每一个,并通过上述的判定来建立二叉树。最后需要对重值的b做一个解释。如果有重值,当考虑到时,应该对两边同时进行判断,是否两个能同时在两段都成立,假设有其中一边不成立那么说明这条支路无解。如此运行,直到所有的都被考虑完,循环停止并将最后合理的组合所确定的DNA顺序输出。关于这个数据结构的流程如图对SPDP算法进行进一步的优化,建立b-b表与b-c表 我们建立二叉树数据结构的思想来源于上面建立的数学模型,而这个数学模型建立的立足点是通过对第一组数据b进行组合,而拿第二组数据c来进行检验。不管是最初的穷举法还是二叉树数据结构的算法都表达了第一组数据与第二组数据这样的一种关系。然而这样的关系并非完美,因为尽管c数据比b数据包含的信息要少,但对b进行组合的时候,数据c仍然是非常重要的一个约束,并且时刻的在约束着b的每一步组合。基于这样的想法,我们希望在二叉树的结点计算时可以参加c对b的约束。为了实现这样的想法,我们在SPDP的标准问题中建立了b-b表与b-c表。b-b表的建立首先我们建立b-b表。在二叉树数据结构算法中,我们每步对结点树枝的是否存在的判断都是通过两个b数的差是否在这个结点中数据c可以将它看作一个集合中。因此判断是否等于至关重要。由此,我们就对数据b的所有元素两两作差,建立b-b表。我们可以让横坐标表示被减数的脚标i,而纵坐标表示减数j,j,那么在i,j的位置记为-1,这样区分的好处在后面的算法里可以表达。那么,二叉树结构中每步=的判断就转变成为判断b-b表i,j位置上的值。b-c表的建立与b-c表约束b-b表是等式=中i与j之间的关系,而下面我们建立的b-c表是j与k之间的关系。如表3所示,表3是最根本b-c表,横坐标为c的脚标k,而纵坐标是被减数的脚标j。如果=,那么在k,j的位置记i,假设,那么在k,j的位置记0。这样,这张b-c表就有了它自身的含义,它表示着对于每一个,有可能组合出这个的两个b数的差的所有可能情况。这里就有一个非常重要的约束,对于每一个,两个b数相减可以等于的所有的组合的个数与数据c中的个数满足+1。这里要注意,之所以要加1是因为“中间元素并非为两个b值相减而得到的,所以有可能在这里的个数比可以小1。但一旦在出现了这种情况,在别的c数据的列中就不能出现这种情况,即对于其它的c数据要求。倘假设出现了与约束相矛盾的情况时,再往后计算肯定得不到合理解了,需要换下一个可能的尾元素。得到了b-c表的这个约束后,下一步需要解决的就是如何在二叉树建立的过程中在不改变开始时候做的b-c表而对每个结点的进行计算并与该节点的相比拟。首先,我们发现在每次节点中的变化是因为每次计算需要除去c数据中的一个值而导致的变化。对于每个节点,都需要记录所有的的值。然而,对于,我们并不需要每次都改变b-c表,而是直接从b-c表中计算出当前情况的值。这样,我们就需要对b-c表进行一个补充。如表4所示,对于每一列,我们又增加了两个子列,一列为状态数J函数,另一列为排序R函数。我们现在来考察二叉树在建立过程中其中的一个节点的情况,如表4所示,假设该节点的前半段已经考虑到,后半段已经考虑到。当前需要考虑到底属于前半段还是属于后半段。倘假设被放到了前半段,生成该节点的左树枝及其节点,我们发现,对于这个新生成的节点,对于任何,-在这里已经是不可能的组合,同理我们发现,纵坐标比i小的与i,j之间的那些可能与c相等的b的差值的组合在这里已经没有意义了,需要在所有初始时b的差的组合总数中减去这些在这个状态下没有意义的组合个数。因此我们这样来定义我们的J函数与R函数:由于在3.3.1标准化SPDP问题的过程中应用了定理六相邻重值等效方法,如果对于某个所对应的一列,假设j,k上的值不为0即=,那么J(j)=1,否那么为0。而R(j)=。那么R(j)表示以从到中为被减数的所有有可能被别的b相减等于这个的个数。那么很容易,对于新生成的节点,=。对这个公式举一个具体的实例加以说明,如表4,当我们已经计算到前半段考虑到b4后半段考虑到b3时,这表示当前情况下只有一种情况可以得到c1,即b5-b4=c1。 经过上述的改良,我们就可以通过一个静态的b-c表对c中所有的元素在建立树的过程中方便的检查它的约束。如果与约束矛盾的情形前面已经讨论过,而b-c表还有非常好的一个特性就是它在某些情况会有“临界发生。比方对于所对应的一列,当在某个计算过程中,发现或者中间元素的情况说明可以组合出的b的差值的个数已经和的个数相等,那么这时已经发生了“临界的情况,要求对于当前考虑建立树的节点以及它以后的中但凡满足J(s)=1 s,与s,k所对应的一定要在同侧,而一定要在与的另一侧。这样大大的提高了计算的速度。我们称这个约束为b-c表约束,它的本质是数据c对数据b组合的约束。对b-b表、b-c表的进一步讨论图9在上文中我们分别建立了b-b表,b-c表这两张非常有用的表。对于b-c表的约束与作用在3.4.1中已经做了详细的说明。我们发现,其实b-b表,b-c表本质上是等价的,它们都来自于是否等于的问题分析中所举出的那么一组合理解具有指数个数的特例也是通过对b-b表的图的关系分析所构造出来的。下面就先着重对b-b表的图的逻辑关系进行一个分析。 图10ADEG 在b-b表中。每一个点i,j都表示一个的操作,而i,j上所记录的值是这个操作与的逻辑关系。而这于前面我们所讲的二叉树结构的建立是完全一样的。那么我们就尝试将二叉树建立的过程就放到b-b表中,使b-b表中的每一个路径都对应二叉树中的一个分支。下面我们就以一个简单的例子来看看b-b表中的路径是如何的与二叉树中的分支相对应。如图9与图10,首先为了看两个图的对应关系,我们先不考虑二叉树建立过程中每步对c的判断,也不考虑b-b表中每个点i,j上记录的值。那么在图9中,我们可以看到二叉树的一个分支A-D-E-G,而b-b表中的A-D-E-G刚好与之完全对应。我们来看这个过程:在初始状态分别是首元素与尾元素。有两个选择,一个是放在一边,而另一个选择是放在一边,在b-b表中,它的选择就是A点A点在图中表示3,1点与B点。而对于我们这个分支它选择了A点。下一个考虑的是,同样道理它也有两个选择D点与F点,容易的看出,每次选择时,b-b表中的图的这一列的最上面的点如点B、D、F、G都是可以选择的一个路径,而对于另一个路径在取决于前面的形成过程。比方考虑时,由于B点是上一次的一个选择确没有选择,那么将B点平移到了C点,成为了这次考虑的一个路径的选择。同样的,在这个分支选择了D点,当考虑时,它的选择就有E与F;图11当考虑时,它的选择有G与H,而最后选择了G,最后形成了A-D-E-G这个路径。而在实际建立二叉树时的每一步都需要检验是否等于,那么在b-b表中就需要经过的点i,j上记录的值不能是0,必须为某一个k,并且还要要求这个在已经到达这个点时仍然在数据c之中c中的元素是不断减少的。这样一来,建立二叉树的过程就全部可以在b-b表的图的关系中得以表现。下面我们再来观察b-b表具有的更多的特性。首先,如果b-b表中每一点的值均记为,那么我们发现在同一列中,下面的点的值比上面的大;同一行中,右边的点的值比左边的大,那么我们用箭头表示值增大的方向,我们可以得出图11,这是点的值的大小分布图。下面我们就用这样的关系来构造一组合理解的个数在个以上的数据即问题分析中所举出的实例。首先我们希望构造一组数据,使得为首元素一定在前半段,为尾元素一定在后半段,而一定可以既能在前半段也能在后半段;在前半段,在后半段,一定既能在前半段又能在后半段,如此一直类推下去。如果能构造出这样的解,它解的个数一定不少于,而我们现在将刚刚所说的规律所要求经过的点画在b-b图上,得到图12,这样我们就发现了规律,它很有规律的六个一组的进行重复。现在的任务就是需要对这些点赋上c的值,使上述对b-b表的点的值的分布可以看出,如果我们规定了,那么对于这个问题最好的构造如图12所示。图12 在这张图的指导下我们得到了我们构造的数据的递归式:比方我们可以利用这个递归公式得到这样的初始条件:图12 问题分析中的数据测试就是以这组特殊的实例来说明了由于SPDP问题要求要把所有的合理解都要计算出来,而这组数的合理解就已经有指数个,因此不管如何优化算法都不可能得到多项式的计算方法。图14 b-b表中对在二叉树的建立过程中也可以起到与3.4.2类似的效果。根据前面所述的b-b表中路径选取的规律有图13-16这几个图中任何一个情况发生,该图没有一个合理解。其中,图13是图14的特殊情况。有了以上的结论,我们又发现,当图13-16这些图中有一个点并非0或者-1时,不管采取何种路径,在这个图中这个点必然要被经过,比方图17-18所示的情况。这个情况实际上是与b-c表中临界后的点的情况是一样的,统称这些为临界点注:但它们临界的原因不同。而在b-b表中,倘假设A点为临界点,那么A点所在的行与列上其它所有的点都不可能被经过,此时将这些本来不为0的点改为0,称这样的操作为b-b表的约束。这样,我们就可以成功的将b-c表约束与b-b表约束结合在一起,大大优化算法的复杂度,具体过程如下:1. 建立b-b表,进行b-b表约束,如果出现了无解状态就停止。2. 通过b-b表建立b-c表,再进行b-c表约束。如果出现了无解状态就停止。3. b-c表约束后产生的临界点再带入b-b表进行b-b表约束。b-b表约束后修改b-c表,如果b-c表没有产生新的临界点,将进入计算;否那么继续进行3。下面我们将讨论一下b-b表能否也如b-c表的约束一样,在二叉树的建立过程中也进行约束。理论上说是可以的,只要将b-b表中未考虑的元素的区域取出来,根据已经到达的这一步的实际的c数据修改b-b表或重新建立b-b表,再进行上述的算法优化。然而对于每一步都做这样的事情,实际上也在增加了时间复杂度。b-c表约束也存在这样的问题,只是它的复杂度比b-b表约束要小的多。而我们在这里就可以采取一个策略,就是并不是在每一步都进行b-c表约束与b-b表约束,而是在某些步的时候进行抽查,比方说当树支多到一定的程度的时候就采取一次优化。这两个表在实际的算法中起到了巨大的作用。最后,在这里想讨论一下对于这个问题的终极算法设计的可能性。首先解释终极算法:终极算法就是在建立二叉树的过程中可以在最早的时间预测到某个支路继续走下去将是“死胡同。这种想法与b-b表约束的道理类似,然而,b-b表只是用了局部的信息,它并没有将c所包含的所有的信息用完全。如图19所示,A、B、C、D点的值同为,然而,如果的个数只有两个的时候,就相当于在路径的选择过程中A、B、C、D四个点选择两个点经过。然而如果将这样的约束引入到b-b表约束,实现这个约束的复杂度就已经到达了指数的难度。因此终极算法的实现几乎是不可能的。然而幸运的是对于实际的数据,利用已有的两个约束已经可以大大的降低了复杂度,使它相当接近终极算法。 最终SPDP问题算法 经过了以上的准备,我们可以得到了最终对SPDP的算法。 1.对具体的数据进行标准化处理,得到SPDP的标准问题 2.建立b-b表与b-c表进行3.4.3中b-b表、b-c表共同约束,如果出现无解情况返回1的循环中;否那么进入3 3.建立二叉树数据结构,并在b-b表、b-c表约束及其共同约束的操作下进行有效穷举,输出答案。之否再返回到1的循环,直到1的循环结束为止。 最后在本节小结SPDP问题算法:SPDP算法是基于二叉树数据结构的穷举法产生的,首先经过了标准化的过程,然后利用b-b表与b-c表两个表逻辑、拓扑的关系相互约束,使穷举的次数大大降低,到达实用的效果。问题二 显而易见,实际的SPDP问题中因为生物化学手段的限制,实际测量中不可能得到准确的DNA片断长度,测量时的误差是不可防止的。所以我们必须考虑在有误差的情况下,如何在原算法的根底上实现SPDP的算法:确定b-b 表和b-c表 b-b 表和b-c表b-b表在程序的匹配判断当中起到了相当重要的作用。所以我们应该首先在误差存在的条件下将b-b 表和b-c表确定下来,这样在这种情况下程序的算法也就相对确定了。为了确定这两张表, 我们需要了解误差对确定变量值之间的关系。于是我们首先需要明确以下问题:长度测量值的概率分布 由于片断长度的测量值误差是由很多微小的因素引起的分量叠加而形成的,在统计学上我们认为这些微小的分量满足李雅普诺夫Liapunov定理的条件。于是由该定理可知:同一个物理量的测量值的误差近似服从正态分布其数学期望为0。2也就是说,每个物理量的测量值满足数学期望为其真值的正态分布。 记为,其中和分别为第一组数据和第二组数据中的长度测量值。由3原理可知,其绝对误差限可以认为注是: 测量量的误差限可以由仪器精度和方法精度进行估计,也可以通过样本方差进行估计,所以可以当作是量。两个片段长度的不可分辨判据 由概率论原理可知, 故可以认为 故当时,即的真值相等时,其测量值之差的可能范围满足 所以一旦其测量值之差满足了这个条件,我们就不能判定这两个值的真值是否相等。于是我们称这两个测量值不可分辨。上式的条件称为不可分辨判据。b-b表确实定 由于b-b表和b-c表是完全等价的,故我们只需确定b-b表,就可以推算出b-c表。 如前面所述,b-b表的某个域Tij的值决定于是否等于某一个。在无误差的计算中,需要严格等于。但是在包含误差的计算当中,很可能没有一个能够严格的等于,而我们需要判定是否他们可以相等。 由于 故当和的真值相等时,可以认为 当满足上式条件时, 和的真值就可能相等。在这种情况下,为了不漏掉可行解,我们就认为他们在误差允许条件下相等。于是就有可能出现多于一个的和 相等。这些也是不可相互分辨的,即单凭长度的信息不能将他们区分开在DNA链上位置互易后但从长度上讲仍然满足所取得的数据要求,这跟他们相等的情况是等效的。所以认为这些等效相等,所有满足和 相等的的集合记为,称为等效集合。记(其中N为限制性定位点的个数),故易知,其中为上面的算法中最后出现在中间的元素。我们需要将这个并集进行划分,但是并不一定两两交集为空。所以我们要对这个并集进行如下处理: 与任意其他集合相交为空的集合不变。 如果,去除集合。 除的情况外,如果,那么A.如果 满足不可分辨判据,那么令,而去除集合。B.否那么,不妨设, 那么必有。令 为原集合的元素中,与不满足不可分辨判据的元素的集合。令 为原集合的元素中,与不满足不可分辨判据的元素的集合。其他中元素的集合可以作划分,,使。令 = , = 任意满足条件的划分都要考虑,因为每一种划分将对应不同的c向量,也就将对应不同的解。 在情况中将和划分开后,如果各自仍与其他集合有非空交集,那么继续按照和的原那么进行划分。 这样确定下来的集合就形成了原并集的一个划分,每个集合内的元素在程序判断时当作相等处理,将它们归并在一起,元素的值取划分当中元素的均值。 每一种c集合划分,表中域Tij的值那么为离最近的新值的下标。下面以下表数据为例对上述方法进行说明。(假设所有数据相对误差限为1%,并且为了形式统一和算法设计方便设b0 = 0 ,无误差) 按照的原那么进行划分,最终得到c的两组划分1、 2、 所对应的b-b表均为:从这组数据可以看出,当误差限相对于数据的标准差来说较大的时候,会产生很多不可分辨元素,对问题的求解带来了很坏的影响。五、 计算机结果及分析问题1 根据上文中的模型和算法,运用Matble软件编程计算除了结果,结果如下:实例1第一组数据:2,14,8,8,9,7,13,3第二组数据:2,1,4,3,6利用上述算法:计算出相应的可能DNA限制性图谱: 2,6,1,4,3实例2第一组数据:1,14,12,3,7,8,9,6,11,4,12,3,13,2,5,10第二组数据:1,1,2,1,2,2,1,2,3利用上述算法:计算出相应的可能DNA限制性图谱:第一组: 1,1,1,1,2,2,2,2,3第二组: 1,1,1,2,2,2,2,1,3第三组: 1,2,1,1,2,2,3,1,2第四组: 1,2,3,2,2,1,1,1,2第五组: 1,2,1,2,1,3,2,1,2第六组: 1,2,2,1,2,3,1,1,2第七组: 1,2,2,3,1,2,1,1,2第八组: 1,2,1,3,2,1,2,1,2问题2 从前面模型中给出数据以及带误差的算法过程可以看出,随着误差的增长,会出现两种问题: 1、不能分辨的元素越来越多,这样大大地减少的解确实定度。每一组n个不能分辨的元素,都要使可行解的个数增加倍。 2、对C划分的可能性数量增多。C划分的可能性数量是随着之间重叠元素的个数呈指数增长的。在误差存在的条件下,一组数据的相互分辨能力决定于两个因素,一是误差限的大小,二是数据值分布的疏密程度,即数据的方差或标准差。所以,当数据的平均绝对误差限的数量级到达与数据标准差相当的或更大程度时,数据之间的分辨就会变得非常困难,问题的求解也会变得根本无法进行了。以前面所给数据为例,这组C的标准差为5.652,而b, c,的平均绝对误差限为2.009。数据已经较难分辨了。如果相对误差限变为2%, 那么数据就会变得根本无法分辨了。六、 参考文献1 蒲俊,数学建模方法与训练M,四川:西华大学数学建模培训教材,20213 刘假设鹏,DNA限制性图谱绘制SPDP问题的解决算法J,2021七、附录%data1=1 14 12 3 7 8 9 6 11 4 12 3 13 2 5 10;data2=1 1 2 1 2 2 1 2 3; function DNAreset(data1,data2) matrix=; DNA_sequence=; sequence=1; for i=1:length(data1) for j=i:length(data1)-1 if judge(data1(i,:),data1(j+1,:) temp=data1(i,1); data1(i,1)=data1(i,2); data1(i,2)=temp; end end end for i=1:length(data1) matrix=data1; matrix(i,:)=exchange(matrix(i,:); for j=1:length(data1) matrix(j,:)=exchange(matrix(j,:); for h=1:length(data1) matrix(h,:)=exchange(matrix(h,:); for g=1:length(data1) matrix(g,:)=exchange(matrix(g,:); temp=search(matrix,data1,data2); if length(temp)=0 DNA_sequence(sequence,:)=temp; sequence=sequence+1; end end end end end len=length(DNA_sequence); del_number=0; for i=1:len-del_number j=i+1; while j1&jlength(data2) check(j)=New_matrix(j,1)-New_matrix(j-1,1); end end if judge(sort(check),sort(data2) result(k,:)=check; k=k+1; end reset_sequ=result; function f=judge(array1,array2) if length(find(array1-array2)=0)=0 f=1; else f=0; end function exchange_array=exchange(array) temp=array(1); array(1)=array(2); array(2)=temp; exchange_array=array;
展开阅读全文