十类算法的详细说明
偶以赛题为背景来说明一下:
1、蒙特卡罗算法:
在大多数建模赛题中都离不开计算机的仿真,随机性模拟是非常常见的算法之一。
举个例子就是97年的A题,每个零件都有自己的标定值,也都有自己的容差等级,而求解最优的组合方案将要面对着的是一个极其复杂的公式和108种容差选取方案,根本不可能去解析求解的,那如何去找到最优的方案呢?随机性模拟搜索最优方案就是其中的一种方法,在每个零件可行的区间中按照正态分布随机的选取一个标定值和选取一个容差值作为一种方案,然后通过蒙特卡罗算法仿真出大量的方案,从中选取一个最佳的。另一个例子就是去年的彩票第二问,要求设计一种更好的方案,首先方案的优劣决定于很多复杂的因素,同样不可能刻画出一个模型进行求解,只能靠随机仿真模拟。
2、数据拟合、参数估计、插值等算法:
数据拟合在很多赛题中有应用,与图形处理有关的问题很多与拟合有关系,一个例子就是98年美赛A题,生物组织切片的三维插值处理,94年A题逢山开路,山体海拔高度的插值计算,还有吵的沸沸扬扬可能会考的非典问题也要用到数据拟合算法,观察数据的走向进行处理。此类问题在Matlab中有很多数据处理现成的函数可以调用,熟悉Matlab,这些方法都能游刃有余的做好。
3、规划类问题算法:
竞赛中很多问题都和数学规划有关,可以说不少的模型都可以归结为一组不等式组作为约束条件、几个函数表达式作为目标函数的问题,遇到这类问题,求解就是关键了,比如98B,用很多不等式完全可以把问题刻画清楚,因此列举出规划后用Lindo、Lingo等软件来进行解决比较方便,所以还需要熟悉这两个软件。
4、图论问题:
98B、00B、95锁具装箱等问题体现了图论问题的重要性,这类问题算法有很多,包括:Dijkstra、Floyd、Prim、Bellman-Ford,最大流,二分匹配等问题。每一个算法认真的话都应该写一遍,否则到比赛时再写就晚了,
5、计算机算法设计中的问题:
计算机算法设计包括很多内容:动态规划、回溯搜索、分治算法、分支定界。比如92B用分支定界法,97B是典型的动态规划问题,此外98B体现了分治算法。这方面问题和acm中的问题类似,推荐的书籍有《计算机算法设计与分析》电子工业出版社等与计算机算法有关的书。
6、最优化理论的三大非经典算法:
模拟退火法、神经网络、遗传算法。这十几年来最优化理论有了飞速发展,这三类算法发展很快,近几年的赛题越来越复杂,很多问题没有什么很好的模型可以借鉴,于是这三类算法很多时候可以派上用场,比如:97A的模拟退火算法、00B的神经网络分类算法、象01B这种难题也可以使用神经网络、还有美国竞赛89A也和BP算法有关系,当时是86年刚提出BP算法,89年就考了,说明赛题可能是当今前沿科技的抽象体现。03B伽马刀问题也是目前研究的课题,目前算法最佳的是遗传算法。
7、网格算法和穷举算法
网格算法和穷举法一样,只是网格法是连续问题的穷举。比如要求在N个变量情况下的最优化问题,那么可以对这些变量可取的空间进行采点,比如在[a,b]区间内取M+1个点,就是在a、a+(b-a)/M、a+2*(b-a)/M、……、b那么这样循环就需要进行(M+1)^N次运算,所以计算量很大。
比如97年A题、99年B题都可以用网格法搜索,这种方法最好在运算速度叫快的计算机中进行,还有要用高级语言来做,最好不要用Matlab做网格,否则会算很久的。穷举法大家都熟悉,就不说了。
8、一些连续离散化方法
大部分物理问题的编程解决,都和这种方法有一定的联系,物理问题是反映我们生活在一个连续的世界中,计算机求解只认离散的变量,所以需要将连续量进行离散处理,这种方法应用很广,大都和上面的很多算法有关,事实上,网格算法、蒙特卡罗算法、模拟退火都用了这个思想。
9、数值分析算法
这类算法是针对高级语言而专门设的,如果你用的是Matlab、Mathematica,大可不必准备,因为象数值分析中有很多函数一般的数学工具是具备的。
10、图象处理算法
01A中需要你会读bmp图象、98美赛A需要你知道三维插值计算,03B要求更高,不但需要编程计算还要进行处理,而数模论文中也有很多图片需要展示,因此图象处理就是关键,做好这类问题,重要的是把Matlab学好,特别是图象处理的部分。
模拟退火算法(转载)
退火概念是80年代初期研究组合优化问题时提出的,该方法解决优化问题
的出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似
性。在对固体物质进行退火处理时,通常是先将它加温熔化,使其中的粒子
可以自由运动,然后降温,粒子就逐渐形成低能态的晶体。如果凝结点附近
温度下降足够慢,那么固体物质一定能够形成最低能量的状态。模拟退火就
是模拟了这一过程,从而求得组合优化问题的全局(近似)最优解。
-------------------------------------------------
发信人: daniel (小丹尼), 信区: AI
标 题: 模拟退火(2)
发信站: 南大小百合信息交换站 (Sun Apr 5 20:03:55 1998), 转信
设E[{xi}]表示某系统在微观状态{xi}({xi}为一组状态变量,如速度、
位置等)下的内能,对于给定温度T,如果系统处于热平衡状态,那么
E[{xi}]将服从Boltzmann分布,分布函数为:
f = C(T)e^(-E[{xi}]/kT)
C(T)-1/(e^(-E[{x1}]/kT)+e^(-E[{x2}]/kT)+...+e^(-E[{xn}]/kT))
其中k是Boltzmann常数。
T下降将导致内能E下降,如果T下降速度足够慢,那么系统就可以保持热
平衡,使其内能在该温度下达到最低值。当T=0(开氏温度)时,内能将达到
最小值。这样的降温过程就是退火过程。
-------------------------------------------------
发信人: daniel (小丹尼), 信区: AI
标 题: 模拟退火(3)
发信站: 南大小百合信息交换站 (Sun Apr 5 20:04:45 1998), 转信
在退火过程中经常要用Metropolis抽样,它可以用来模拟温度T下系统的
热平衡。
随机选一初始状态{xi}, 然后随机地给系统加一个扰动{delta xi},则
内能增量为:
delta E = E[{xi+delta xi}] - E[{xi}]
如果delta E<0,那么这个扰动就将被接受,否则该扰动将按概率
e^(-delta E/kT) 被接受。如果扰动被接受,那么就用{xi+delta xi}代替
原来的{xi};否则就产生一个新的扰动......
如此反复,则{xi}将逐渐满足前述Boltzmann分布。
如果让T从一个足够大的值逐渐下降,对于每个T都用Metropolis抽样使
系统热平衡,那么到T=0时,就实现了模拟退火,E[{xi}]达到最小值。
-------------------------------------------------
发信人: daniel (小丹尼), 信区: AI
标 题: 模拟退火(4)
发信站: 南大小百合信息交换站 (Sun Apr 5 20:05:19 1998), 转信
计算机实现模拟退火的思想是:将每种可能的组合状态作为{xi},E作为
目标函数,T作为控制参数,令T逐渐减小为0,从而得到目标函数最优值。
基本步骤为:
初始化:对初始状态{xi},取初始值T(0),计算目标函数E[{xi}];
1. 产生随机扰动,计算delta E = E[{xi+delta xi}] - E[{xi}]
2. 若delta E<0, goto 4,否则产生[0,1]上的一个均匀分布随机数y;
3. 若e^(-E/T)<=y,goto 1 ;
4. 用{xi+delta xi}代替{xi},E+delta E代替E;
5. 检验Metropolis抽样是否稳定,若不稳定,goto 1;
6. T减小;
7. 是否满足目标,是则结束,否则goto 1。
-------------------------------------------------
发信人: daniel (小丹尼), 信区: AI
标 题: 模拟退火(5)
发信站: 南大小百合信息交换站 (Sun Apr 5 20:05:41 1998), 转信
模拟退火是否能达到E的最小值决定于T(0)是否足够大,和T是否下降得
足够慢,以及对于每个T,Metropolis抽样是否稳定。
模拟退火的典型特征是除了接受目标函数的改进外,还接受一个衰减极限,
当T较大时,接受较大的衰减,当T逐渐减小时,接受较小的衰减,当T为0
时,就不再接受衰减。这一特征意味着模拟退火与局部搜索相反,它能避开
局部极小,并且还保持了局部搜索的通用性和简单性。
值得注意的是,当T为0时,模拟退火就成为局部搜索的一个特例