数学建模社区-数学中国
标题:
数学建模十大经典算法漫谈
[打印本页]
作者:
杨利霞
时间:
2019-7-8 10:46
标题:
数学建模十大经典算法漫谈
# B, w0 i/ c* {2 Z7 a1 L% R( C
数学建模十大经典算法漫谈
- q) h$ r/ t$ G: I! F
数学建模十大算法漫谈
4 H/ R. L7 O" U" ?' t+ M
+ n- c2 b0 @6 C9 x
8 S. U/ F! M4 \. N
3 H& K" ~# }; M8 E) c: U: y4 u: J/ Q
作者:July 二零一一年一月二十九日
9 [; n1 b( K; c
8 q2 v0 L/ }4 V
本文参考:
% l7 m' m6 q& U5 ^
I、 细数二十世纪最伟大的十大算法 [译者:本人July]
( v9 Y# w3 g' `, C8 L$ A
II、 本BLOG内 经典算法研究系列
4 V: R1 e" Q6 M( Z, I
III、维基百科
) }& F. Y0 J! |- r e0 X+ @
" n8 F& e' a5 a" s; s7 ~* B- E
------------------------------------------
2 F( R: E. u s2 [* s
) c$ H+ o1 l: m( C
博主说明:
( F ^/ W; _) `! @0 M
1、此数学建模十大算法依据网上的一份榜单而写,本文对此十大算法作一一简单介绍。
& d1 x% C" E; S" P" ^6 O
这只是一份榜单而已,数学建模中还有很多的算法,未一一囊括。欢迎读者提供更多的好的算法。
: n' m6 C" S& K1 w) |/ u8 T1 F4 U
2、在具体阐述每一算法的应用时,除了列出常见的应用之外,
8 c- I" D+ H2 V0 p' P
同时,还会具体结合数学建模竞赛一一阐述。
5 S6 C$ s% u& }+ o+ a) s9 R# b( p+ h
毕竟,此十大算法,在数学建模竞赛中有着无比广泛而重要的应用。
v- L& W9 p8 P; x7 Q, E. Q* F% a
且,凡是标着“某某年某国某题”,即是那一年某个国家的数学建模竞赛原题。
' L1 f, c- ^0 G
3、此十大算法,在一些经典的算法设计书籍上,无过多阐述。
1 c! L) m* |! ~1 k
若要具体细致的深入研究,还得请参考国内或国际上关于此十大算法的优秀论文。
5 p* I( [& @. n
谢谢。
4 g8 n9 `& b/ U2 }, ]
9 e) l9 v$ Z2 k) \& C3 v' E8 s
4 ~ b6 L# m! a: J8 E+ K
" k3 L7 [0 J' y8 d
. a! d$ b, I& Y
/ D. ^! ?0 Z; N% [& y0 j9 y
一、蒙特卡罗算法
0 [* V% e+ `+ j3 c0 S' \5 ?) d
1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis
. f, U7 V' Z) ~$ L, Q
共同发明了,蒙特卡罗方法。
P/ {. g/ D( d; q: G2 M* v
3 J! a6 _4 i, ~' Y1 z0 L
7 m! k" e' q$ i7 Z
此算法被评为20世纪最伟大的十大算法之一,详情,请参见我的博文:
, v# x; z2 S4 o ~* L5 R7 m0 `5 H1 V
http://blog.csdn.net/v_JULY_v/archive/2011/01/10/6127953.aspx
- }" W6 V) S5 f+ q! |0 c1 C! \' R
$ Q/ }4 J6 X# V+ g" K) T
$ s0 F: p! `& S# w! C. A0 e
4 V: o! |" u& x& F/ ~+ l
蒙特卡罗方法(Monte Carlo method),又称随机抽样或统计模拟方法,是一种以概率统计理论为指导
5 O1 b) g1 y% y1 K5 x
- Z2 Z5 ]1 g+ E, e
的一类非常重要的数值计算方法。此方法使用随机数(或更常见的伪随机数)来解决很多计算问题的方
& ?6 x v, p' f- E4 D7 a5 B E) _
/ g( ~ D6 j' {8 q+ ?6 Y
法。
+ |- _$ s* V3 L4 o, k- _+ ]
9 G9 o( s; \3 a. _
# @5 B: `5 i" U" _
: D6 N4 `2 s. Y: @9 V% O
由于传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真
% H" Z& b% S# N( r6 U
0 l) c6 }8 s8 d4 g; W/ z" Y6 f
实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。
3 j' l/ E+ b/ q$ C0 i
/ W) |, S6 @; j( q
蒙特卡罗方法的基本原理及思想如下:
$ G9 b" x% Z. h. `# r; p- z$ R; {
当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法
2 T6 ]' L& P, c# k# u
" U! A" ]9 J3 l- ^" z, f
,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作
: ^: p* a+ C* f: E, b E. j: [
* Z# u$ W9 t$ e. v9 W4 F
为问题的解。
% `/ }5 u9 b9 p
& U# m9 i6 }: m) a
/ |5 o6 N) W* v2 S7 x7 a2 k
3 A: W/ m1 e5 X4 J5 ~; c
有一个例子可以使你比较直观地了解蒙特卡洛方法:
' m& ]7 d1 L6 s; B
假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程
& z& k! I. `0 }( y
0 B3 P5 C1 [$ e0 y d
度是成正比的。蒙特卡洛方法是怎么计算的呢?假想你有一袋豆子,把豆子均匀地朝这个图形上撒,然
4 W( x6 v1 s( f, L: p
3 e& B6 \+ b) i! n# H0 N# r& Z
后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。当你的豆子越小,撒的越多的时候
' Y# N0 M! A4 k! T' B
( _+ \6 ]$ q- P# N" K; X! C3 a
,结果就越精确。
5 t% S, c, ^, `5 h
在这里我们要假定豆子都在一个平面上,相互之间没有重叠。
5 \& b6 G6 C* t, j3 p: r. W
+ _3 m1 J) H. `7 Y0 B4 c: k' w' A
! s1 k( }* F1 }+ _8 Z; @4 P, V
蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模
# C: x: G. r3 ?0 D, [& b
8 N2 m( J3 @! x! d7 M7 ?7 F
拟实验。它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的
/ K& Z+ J/ A5 F8 n1 i& @
) S1 K+ W& `; n) ^4 J; Z
近似解。
9 U! O2 s p: a1 |0 w$ L& N
# t" o7 y9 j0 p0 }
9 k' K6 Q7 w. A' Z( Y; L. t `2 n
3 M g& K' [; d2 N
蒙特卡罗方法与一般计算方法有很大区别,一般计算方法对于解决多维或因素复杂的问题非常困难,而
8 o$ J- F" B+ l' U# ~
1 K0 u, r! v9 N" L: O5 {
蒙特卡罗方法对于解决这方面的问题却比较简单。其特点如下:
) }8 b; Y& B0 d4 @
I、 直接追踪粒子,物理思路清晰,易于理解。
' E6 Q6 d7 p7 S. ?% A. _
II、 采用随机抽样的方法,较真切的模拟粒子输运的过程,反映了统计涨落的规律。
( d' V8 W4 c2 s/ W/ S4 b9 C
III、不受系统多维、多因素等复杂性的限制,是解决复杂系统粒子输运问题的好方法。
4 c) E! P% K: C( s8 {
等等。
2 T1 l7 t* n/ ]1 v# U
! Z" Y- @6 t% H4 n/ r# s% ^0 g8 h
此算法,日后还会在本BLOG 内详细阐述。
# u6 D4 c/ n2 `. K
6 D6 ^- ^. k# E8 r: D
5 K+ v$ W( N! f5 G" s) H5 `
' E1 j* K- w0 o6 g, }! [
6 r: L2 P0 ]) o( y( Q
二、数据拟合、参数估计、插值等数据处理算法
9 d+ z9 Y+ C0 l- e) @1 `
我们通常会遇到大量的数据需要处理, 而处理数据的关键就在于这些算法,通常使用Matlab作为工具。
6 p4 r, H, c S* `8 h
7 j" e. @; j! M# F5 n# [7 p
数据拟合在数学建模比赛中中有应用,与图形处理有关的问题很多与拟合有关系,一个例子就是98年数
3 d$ s2 c; I7 a, O7 ~, ~& Y e
3 H" I! |- |5 n
学建模美国赛A题,生物组织切片的三维插值处理,94年A题逢山开路,山体海拔高度的插值计算,还有
% G# V' Y0 U3 E8 j# W c4 \1 l2 C7 F
# |: y( ~' o' V5 V% j
吵的沸沸扬扬可能会考的“非典”问题也要用到数据拟合算法,观察数据的走向进行处理。
( M( ?. a4 O1 M) n" p
6 P: U( q6 G1 V0 \& I, v6 I
1 v' z1 Y9 {$ Z# m- f
0 ^5 L* W% C- N
此类问题在 MATLAB 中有很多现成的函数可以调用,熟悉MATLAB,这些方法都能游刃有余的用好。
- d+ s* D% }8 ~/ i
+ ^4 P/ H p/ m7 o0 E' J+ W1 r
% [+ b3 g/ N, E# d. y1 x, @1 _
* V, I6 B7 S9 b# i
m: V: w2 j) ^; a9 `1 ?3 F9 ]
三、线性规划、整数规划、多元规划、二次规划等规划类问题
* [2 @/ a7 J8 T& i9 F, Y4 p1 Q' h" @
数学建模竞赛中很多问题都和数学规划有关,可以说不少的模型都可以归结为一组不等式作为约束条件
! r/ ~8 F+ [/ Q% b8 a& R$ w
~! i) j* z5 J# g& h/ a' b5 K
、几个函数表达式作为目标函数的问题,遇到这类问题,求解就是关键了,比如98年B题,用很多不等式
" C) L) O$ x) d2 I! U
! O0 g {2 p! E. V$ M
完全可以把问题刻画清楚,因此列举出规划后用 Lindo 、 Lingo 等软件来进行解决比较方便,所以还
. l4 b- z; Z9 A5 Z: P& o, l) |
1 A5 A& Y$ A9 F3 [% D+ l
需要熟悉这两个软件。
L3 H+ B0 d8 o( I) `
: `! W" {* i( v/ ?- R
S6 z: Y# l5 c0 M/ }' U: S9 @
& E: q" A( z7 \; l: L9 l5 X# @; W
3 H, K3 r9 D8 V- t* ~$ y4 s
四、图论算法
4 Z) H0 H% K) }3 ?2 f. F" B+ L0 U
这类问题算法有很多,
9 Q+ n9 y- E8 L, E1 y6 ~$ r
包括: Dijkstra 、 Floyd 、 Prim 、 Bellman-Ford ,最大流,二分匹配等问题。
& q! s. L8 C; p7 D9 B
8 ~8 {& u1 E6 _0 k. b
4 _+ d$ Y% g. w' D( E7 L H( c
: b" Z. L+ u0 D4 I; z
关于此类图论算法,可参考Introduction to Algorithms--算法导论,关于图算法的第22章-第26章。
& F0 W" G, l# g9 j3 a3 T$ n) c
同时,本BLOG内经典算法研究系列,对Dijkstra算法有所简单描述,
* f' J* W7 n- P: S
-----------
9 H* K% H, h& k; ^ |
经典算法研究系列:二、Dijkstra 算法初探
" P: c9 T5 A' l0 R/ y1 l) y" k
http://blog.csdn.net/v_JULY_v/archive/2010/12/24/6096981.aspx
) j% @# [# j+ Z. P: ~
3 i9 N- K6 k. S
更多,请关注本BLOG 日后更新的博文。
9 T, S, J6 @5 O* V
2 D3 N2 c% C" \6 O/ V1 G
* h2 g t" g/ Y% M6 W' ^
" z S4 q3 D8 E/ Y
% O6 \8 w, K# }4 B, v% M7 P
五、动态规划、回溯搜索、分治算法、分支定界等计算机算法
|6 L: j) H2 B6 I
在数学建模竞赛中,如:92 年B题用分枝定界法, 97年B题是典型的动态规划问题,
) i! Z3 {6 q0 i8 K, x2 M
此外 98 年 B 题体现了分治算法。
+ L2 ?9 G+ |3 a/ y2 n
" `* A" N( m# `+ Z3 \' L
8 o$ z4 U5 |. q8 b' m# V1 f
这方面问题和 ACM 程序设计竞赛中的问题类似,
" q1 A+ t4 x _0 C. g* ]
推荐看一下算法导论,与《计算机算法设计与分析》(电子工业出版社)等与计算机算法有关的书。
) [/ T( i: ?7 i# J- `/ \/ Y6 w
2 K+ \$ d( C8 t' n: |9 S
! A* h# C, h! F) G; K/ K
6 V) u# k* E! k" Y1 n: L6 L+ J
+ B- a: S8 l9 K: \% k$ d
六、最优化理论的三大经典算法:模拟退火法、神经网络、遗传算法
6 U5 F3 k5 ^3 c) H% k0 ~
这十几年来最优化理论有了飞速发展,模拟退火法、神经网络、遗传算法这三类算法发展很快。
( y) ]# e5 ]: L, b2 Q+ @( E. {
) y% [/ y4 i8 Z: x1 y# h4 Z
在数学建模竞赛中:比如97年A题的模拟退火算法,00年B题的神经网络分类算法,01年B题这种难题也可
U* d( Y) t, l
3 N! y/ d" D( ~ T( K; B
以使用神经网络,还有美国竞赛89年A题也和 BP 算法有关系,当时是86年刚提出BP算法,89年就考了,
. _, g4 \* ]3 V3 y
\( z$ u; F8 u8 ]4 o9 b6 g
说明赛题可能是当今前沿科技的抽象体现。
- L# E2 T& a; d- L' \
03 年 B 题伽马刀问题也是目前研究的课题,目前算法最佳的是遗传算法。
% }8 c. Q3 w8 F9 E
4 Z0 ^# c% |+ {& e# n! E
+ C; M5 b* d) a8 [" Y& S% V! F
2 P h: D' z8 N. L' V
另,本人对人工智能非常感兴趣,遗传算法已在本BLOG内有所阐述,敬请参见。
v8 N, H% X- K6 t: F6 c* V
----------
! m( k6 ~5 x# g) O1 f6 r# f9 u! x
经典算法研究系列:七、深入浅出遗传算法,透析GA本质
! J6 T+ {# @2 o4 p- j' K5 c
http://blog.csdn.net/v_JULY_v/archive/2011/01/12/6132775.aspx
2 C2 v- n7 Q0 R+ W7 x) q! D' |
A+ l( @, H* Y4 a3 l
" h, `9 Q# o8 J5 Q0 {, O0 q u; ]
) x. [7 [ c( ~0 _" K
其它俩大算法,模拟退火法,与神经网络,也定会在本BLOG内日后的博文更新中,详细阐述。
9 [# C2 n$ P: T) w0 _
- x' ^1 \7 j5 }% [
* z; A+ L3 H6 f
+ _3 ?" O% Q6 Y! E5 d
2 l5 b' m/ Y- S/ j7 M
七、网格算法和穷举法
! ^7 p; l1 @* x* ~
网格算法和穷举法一样,只是网格法是连续问题的穷举。
4 ^ m( p; {$ l
比如要求在 N 个变量情况下的最优化问题,那么对这些变量可取的空间进行采点,
( c/ J/ m2 N8 z" c8 L
比如在 [ a; b ] 区间内取 M +1 个点,就是 a; a +( b ? a ) =M; a +2 ¢ ( b ? a ) =M ; …;b
6 m6 ~' R1 Y; X
. D( P3 F1 C& G0 z6 S; Q
那么这样循环就需要进行 ( M + 1) N 次运算,所以计算量很大。
4 D' B! @: M7 B
; E' V# a: J/ [6 i! h5 r
1 \+ U6 ^" |. S$ I# w4 P3 [
在数学建模竞赛中:比如 97 年 A 题、 99 年 B 题都可以用网格法搜索,这种方法最好在运算速度较
, q+ F+ k0 n) e+ f0 R
( A$ q$ V2 Z+ a& ]$ G& ?- N5 ?0 j
快的计算机中进行,还有要用高级语言来做,最好不要用 MATLAB 做网格,否则会算很久。
+ u& R- Z1 @6 `
1 a0 t) v+ }' j0 B3 `
穷举法大家都熟悉,自不用多说了。
( S- m3 k+ y; u9 e0 F2 r
/ d4 H# z8 k" W7 ^# x0 h
" `" W# i. O2 W: p
- n/ u! j) L5 J3 D; H& F
8 R5 z- y. V& E+ E" @3 B
八、一些连续离散化方法
: B/ b: n% ?. q: k& a! A5 u% N- y
大部分物理问题的编程解决,都和这种方法有一定的联系。物理问题是反映我们生活在一个连续的世界
' A, f, C1 r7 U
3 Y9 D' \. H2 a" n& X
中,计算机只能处理离散的量,所以需要对连续量进行离散处理。
+ z9 W2 u! {$ s7 B0 X7 L# E0 e* K' I! ^
4 P$ k& Z1 y% a
$ t4 y, ?6 j8 V& A
这种方法应用很广,而且和上面的很多算法有关。
# ^4 v$ R: i9 M/ S
事实上,网格算法、蒙特卡罗算法、模拟退火都用了这个思想。
1 F, o; W- d+ G4 h" }
/ O3 A. t) j* p9 q. w
7 C Z* m5 B3 |: m& v
7 g$ V C8 n8 t: m" c
8 \* l) I& Y1 k8 A9 ~1 Z
九、数值分析算法
7 O4 k4 x0 J, F6 @( e: \
数值分析(numerical analysis),是数学的一个分支,主要研究连续数学(区别于离散数学)问题的
! P% ~: k+ ^/ a# Y
9 F% q) \" m* F
算法。
: K9 p. B2 m/ ?
$ b( S% [% f' Z- @1 u8 _3 B
如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的算法比 如方程组求解、矩阵运算、
! ^2 M9 S3 h9 r. ^3 e
/ a; m2 B- j7 `/ u' K" z
函数积分等算法就需要额外编写库函数进行调用。
$ H* N/ {4 k' p' N. @" w
. [0 E6 H# U! ]1 h
这类算法是针对高级语言而专门设的,如果你用的是 MATLAB 、 Mathematica ,大可不必准备,
6 Q' J9 B$ P9 D1 s" K# [) J5 w5 ^ L
因为像数值分析中有很多函数一般的数学软件是具备的。
: |0 y% _+ F+ y- Q9 E7 {9 w* S9 `
: m$ a( R, g) i% r* c% K
& B- Z6 G- P" q
. d$ p. m# P; e
3 M! Q& _0 S+ B: w! T. S/ h
十、图象处理算法
/ G( |6 P8 z7 K/ W7 z9 z7 B
在数学建模竞赛中:比如01 年 A 题中需要你会读 BMP 图象、美国赛 98 年 A 题需要你知道三维插值
( V9 x+ ]% Z8 \+ i! a5 L
7 x9 ` i) U2 D8 ]8 p
计算, 03 年 B 题要求更高,不但需要编程计算还要进行处理,而数模论文中也有很多图片需要展示,
* T, K4 n, ]' k2 }+ r
( ]4 E+ {. j8 \( `
因此图象处理就是关键。做好这类问题,重要的是把MATLAB 学好,特别是图象处理的部分。
! @# Z2 Y$ n4 W$ A* h9 \# v" @
---------------------
5 h2 ~* I9 Q& ~4 J# m" Z1 N7 d
作者:画面太乱了
2 @2 t5 {9 ~ }/ _
来源:CSDN
: @, m4 ]& l% e, D. r
4 M- P2 d2 Y1 U( B j
: N; t* w; t* q q K1 u- j
: ]1 D9 }1 y$ C% j! Q
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5