数学建模社区-数学中国

标题: 数学建模常用算法—分治算法 [打印本页]

作者: 百年孤独    时间: 2016-3-2 14:44
标题: 数学建模常用算法—分治算法
分治算法
分治法的基本思想
任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
该问题的规模缩小到一定的程度就可以容易地解决;
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
利用该问题分解出的子问题的解可以合并为该问题的解;
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
分治法的基本步骤
分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;

合并:将各个子问题的解合并为原问题的解。

它的一般的算法设计模式如下:
Divide-and-Conquer(P)1. if |P|≤n0 2. then return(ADHOC(P))3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk4. for i←1 to k 5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi6. T ← MERGE(y1,y2,...,yk) △ 合并子问题7. return(T)
其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时,直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,...,Pk的相应的解y1,y2,...,yk合并为P的解。
根据分治法的分割原则,原问题应该分为多少个子问题才较适宜?各个子问题的规模应该怎样才为适当?这些问题很难予以肯定的回答。但人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。换句话说,将一个问题分成大小相等的k个子问题的处理方法是行之有效的。许多问题可以取k=2。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。
分治法的合并步骤是算法的关键所在。有些问题的合并方法比较明显,如下面的例1,例2;有些问题合并方法比较复杂,或者是有多种合并方案,如例3,例4;或者是合并方案不明显,如例5。究竟应该怎样合并,没有统一的模式,需要具体问题具体分析。
99f623579391ac1ae63fa1954c4711c8.jpg






作者: 百年孤独    时间: 2016-3-2 14:46
理解了这些算法,做些小模型已经够用了,具体神经网络大家可以查阅百度,也是很重要的算法,我现在就是这个算法不熟练,也不喜欢用。其他的什么蚁群算法等等都是建立在我们的基础算法之上,思想是大同小异,理解了这些,用得熟练,能够自己整理出来,我觉得至少比我强多了,反正我自己整理不了这么完整的说。最近编点优化程序还总是会出错。
文字很多没有整理,但相信大家闲下来慢慢看,都还是不影响观看理解的。
最后祝大家建立模型,处理、优化,检验模型的能力越来越强,强到让自己惊讶!

作者: 百年孤独    时间: 2016-3-2 14:47
理解了这些算法,做些小模型已经够用了,具体神经网络大家可以查阅百度,也是很重要的算法,我现在就是这个算法不熟练,也不喜欢用。其他的什么蚁群算法等等都是建立在我们的基础算法之上,思想是大同小异,理解了这些,用得熟练,能够自己整理出来,我觉得至少比我强多了,反正我自己整理不了这么完整的说。最近编点优化程序还总是会出错。
文字很多没有整理,但相信大家闲下来慢慢看,都还是不影响观看理解的。
最后祝大家建立模型,处理、优化,检验模型的能力越来越强,强到让自己惊讶!





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5