优选法(optimization method)以数学原理为指导,合理安排试验,以尽可能少的试验次数尽快找到生产和科学实验中最优方案的科学方法。即最优化方法。实际工作中的优选问题,即最优化问题,大体上有两类:一类是求函数的极值;另一类是求泛函的极值。如果目标函数有明显的表达式,一般可用微分法、变分法、极大值原理或动态规划等分析方法求解(间接选优);如果目标函数的表达式过于复杂或根本没有明显的表达式,则可用数值方法或试验最优化等直接方法求解(直接选优)。
优选法是尽可能少做试验,尽快地找到生产和科研的最优方案的方法,优选法的应用在中国从70年代初开始,首先由我们数学家华罗庚等推广并大量应用,优选法也叫最优化方法。
优选法
optimization method
数学原理
最优化方法
数学
找到最优方案
优选法在数学上就是寻找函数极值的较快较精确的计算方法[1]。1953年美国数学家J.基弗提出单因素优选法枣分数法和0.618法(又称黄金分割法),后来又提出抛物线法。至于双因素和多因素优选法,则涉及问题较复杂,方法和思路也较多,常用的有降维法、瞎子爬山法、陡度法、混合法、随机试验法和试验设计法等。优选法的应用范围相当广泛,中国数学家华罗庚在生产企业中推广应用取得了成效。企业在新产品、新工艺研究,仪表、设备调试等方面采用优选法,能以较少的实验次数迅速找到较优方案,在不增加设备、物资、人力和原材料的条件下,缩短工期、提高产量和质量,降低成本等。
优选法,是指研究如何用较少的试验次数,迅速找到最优方案的一种科学方法。例如:在现代体育实践的科学实验中,怎样选取最合适的配方、配比;寻找最好的操作和工艺条件;找出产品的最合理的设计参数,使产品的质量最好,产量最多,或在一定条件下使成本最低,消耗原料最少,生产周期最短等。把这种最合适、最好、最合理的方案,一般总称为最优;把选取最合适的配方、配比,寻找最好的操作和工艺条件,给出产品最合理的设计参数,叫做优选。也就是根据问题的性质在一定条件下选取最优方案。最简单的最优化问题是极值问题,这样问题用微分学的知识即可解决。
实际工作中的优选问题,即最优化问题,大体上有两类:一类是求函数的极值;另一类是求泛函的极值。如果目标函数有明显的表达式,一般可用微分法、变分法、极大值原理或动态规划等分析方法求解(间接选优);如果目标函数的表达式过于复杂或根本没有明显的表达式,则可用数值方法或试验最优化等直接方法求解(直接选优)。
优选法是尽可能少做试验,尽快地找到生产和科研的最优方案的方法,优选法的应用在中国从70年代初开始,首先由我们数学家华罗庚等推广并大量应用,优选法也叫最优化方法。
怎样用较少的试验次数,打出最合适的训练量,这就是优选法所要研究的问题。应用这种方法安排试验,在不增加设备、投资、人力和器材的条件下,可以缩短时间、提高质量,达到增强体质.迅速提高运动成绩的目的。
(1)选定优化判据(试验指标),确定影响因素,优选数据是用来判断优选程度的依据。
(2)优化判据与影响因素直接的关系称为目标函数。
(3)优化计算。优化(选)试验方法一般分为两类:
分析法:同步试验法
黑箱法:循序试验法
优选法分为单因素方法和多因素方法两类。单因素方法有平分法、0.618法(黄金分割法)、分数法、分批试验法等;多因素方法很多.但在理论上都不完备.主要有降维法、爬山法、单纯形调优胜。随机试验法、试验设计法等。优选法已在体育领域得到广泛应用。
1、单因素优选法
如果在试验时,只考虑一个对目标影响最大的因素,其它因素尽量保持不变,则称为单因素问题。一般步骤:
(1)首先应估计包含最优点的试验范围,如果用a表示下限,b表示上限,试验范围为[a,b];
(2)然后将试验结果和因素取值的关系写成数学表达式,不能写出表达式时,就要确定评定结果好坏的方法。
2、多因素优选法
多因素问题:首先对各个因素进行分析,找出主要因素,略去次要因素,划“多”为“少”,以利于解决问题。
单因素优选法解决的问题是针对函数在区间上有单峰极大值(或者极小值),如何通过更加有效的选点方法缩小极值点的范围。
在(a,b)区间内取两点x1,x2。显然:
1)当f(x1)>f(x2)时,极大点在(a,x2)的范围内,(x2,b)的区间舍去。
2)当f(x1)<f(x2)时,极大点在(x1,b)的范围内,(a,x1)的区间舍去。
3)当f(x1)=f(x2)时,极大点在(x1,x2)的范围内,(a,x1),(x2,b)的区间舍去。
每次舍弃完一定的区间后,在剩余的点中需要重新找点,迭代计算。
即第一次迭代,需要找到x1,x2,并且计算f(x1),f(x2)
第二次迭代,需要找到x3,x4,并且计算f(x3),f(x4)
右图中的阴影部分就是舍去区间的范围,可见每次迭代都可以将区间缩小,缩减的范围的大小与x1,x2的选取方法有关。而且考虑到舍去的区间可能是某个实验点到上下限的范围,则另一个实验点如果能够重用,将非常减少计算量。
0.618法(黄金分割法)
0.618法就是采用上面的思路来选取x1和x2的:
不失一般性,假定(a,b)区间是(0,1),即f(x)在(0,1)区间上有单峰极值,选取得两个点x1,x2分别记为x和1-x,即在x和1-x两点进行实验,不妨假定保留下来的是(0,x)区间。
继而在(0,x)区间上两个点x^2和(1-x)x处做实验,如果x^2=1-x,那么上次在1-x处的实验就可以派上用场,节省一次实验,而且舍去的区间是原来区间1-x的一部分。故有x^2+x-1=0,可以解得。
第一次选择0.382(b-a),0.618(b-a),若保留了(0,0.618),由于0.618*0.618=0.382,因此下一轮只需要在0.618*0.382=0.216处做另一次实验,0.382的实验结果在上一轮中得出,减少了计算量,每次消去的区间还大。
Fibonacci序列的应用
由于Fibonacci序列中后项与前项的比值是越来越趋近于黄金分割数0.618的,所以单因素优选法也可以利用Fibonacci序列来完成,此方法与0.618法的最大不同在于它能够预先确定迭代次数,而0.618法需要额外指定一个参数,当区间长度缩小到小于这个参数时才结束迭代。利用Fibonacci序列进行优选的另一个优越之处还在于它能适用于参数只能取整数情况。
还是以区间(a,b)中的单峰函数f(x)为例。
将(a,b)区间分成等分,问题变为在(0,)范围内求极值。第一次选择和,若保留下的区间是(0,),则下次只需要计算,已经在上次迭代中计算过。
若受限于现实条件,可选取出来参加实验的点数有限(x只能够取到有限的一些散点),比小,比大,则可以通过添加几个无关的点来凑足个点。只要保证在[0,]区间中是单峰极小点即可,而且可以默认这些新加入的点比其他现实能够取到的实验点都差。
上述讨论中,对于初始时包含个等分点的Fibonacci序列优选法,一轮迭代就可将包含极值的单峰区间缩为包含个等分点的区间,而且当点数够多时,有约等于于0.618。
具体代码实现
选定区间[-4,4]中的单峰函数f(x)=x^2+5*x,以0.01为要求的精度查找其最小值。
0.618法(黄金分割法)的Matlab代码如下:
序号 | 代码 |
1 | function [yStar,xStar,log] = goldSearch(a,b,eps) |
2 | %% 0.618法(黄金分割法) |
3 | % 函数:yFunc为y关于x的函数,具体形式见最下,此时为:y=x^2+5*x |
4 | 输入:a,b,eps分别代表了区间[-4,4]及精度0.01; |
5 | % 输出:[yStar,xStar] 分别是函数的最小值及其对应的x值,log纪录了具体步骤; |
6 | % 执行:在命令行中输入[yStar,xStar,log]=goldSearch(-4,4,0.01), |
7 | % 即可开始在区间[-4,4]中查找最小值,优化精度达到0.01时停止; |
8 | % |
9 | figure(1); |
10 | x = a:0.01:b; |
11 | y = yFunc(x); |
12 | plot(x,y,'k-'); |
13 | hold on; |
14 | |
15 | a(1)=a; |
16 | b(1)=b; |
17 | n=1; |
18 | plot(a(n),yFunc(a(n)),'c*'); |
19 | plot(b(n),yFunc(b(n)),'b*'); |
20 | pause(0.5); |
21 | t(1)=a(1)+0.382*(b(1)-a(1)); |
22 | u(1)=a(1)+0.618*(b(1)-a(1)); |
23 | while((b(n)-a(n))>eps) |
24 | B(n)=b(n)-a(n); |
25 | m(n)=yFunc(t(n)); |
26 | g(n)=yFunc(u(n)); |
27 | if m(n)>g(n) |
28 | a(n+1)=t(n); |
29 | b(n+1)=b(n); |
30 | t(n+1)=u(n); |
31 | u(n+1)=a(n+1)+0.618*(b(n+1)-a(n+1)); |
32 | else |
33 | a(n+1)=a(n); |
34 | b(n+1)=u(n); |
35 | u(n+1)=t(n); |
36 | t(n+1)=a(n+1)+0.382*(b(n+1)-a(n+1)); |
37 | end |
38 | n=n+1; |
39 | plot(a(n),yFunc(a(n)),'c*'); |
40 | plot(b(n),yFunc(b(n)),'b*'); |
41 | pause(0.5); |
42 | end |
43 | xStar = (b(n)+a(n))/2; |
44 | yStar = yFunc(xStar); |
45 | plot(a(n),yFunc(a(n)),'ro'); |
46 | hold off; |
47 | t(n)=0; |
48 | u(n)=0; |
49 | m(n)=0; |
50 | g(n)=0; |
51 | B(n)=b(n)-a(n); |
52 | n=n-1; |
53 | log=[a',b',t',u',m',g',B']; |
54 | |
55 | function y = yFunc(x) |
56 | if (length(x)>1) |
57 | y = x.^2+5.*x; |
58 | else |
59 | y = x^2+5*x; |
60 | end |
对应的Fibonacci法的代码如下:
序号 | 代码 |
1 | function [yStar,xStar,log]=FibonacciSearch(a,b,xStep,eps) |
2 | %% Fibonacci法 |
3 | % 函数:yFunc为y关于x的函数,具体形式见最下,此时为:y=x^2+5*x |
4 | % 输入:a,b,eps分别代表了区间[-4,4]及精度;xStep为Fibonacci序列划分区间的精度 |
5 | % 输出:[yStar,xStar] 分别是函数的最小值及其对应的x值,log纪录了具体步骤; |
6 | % 执行:在命令行中输入[yStar,xStar,log]=FibonacciSearch(-4,4,0.2,0.01), |
7 | % 即可开始在区间[-4,4]中查找最小值,优化精度达到0.01时停止; |
8 | % |
9 | figure(1); |
10 | x = a:0.01:b; |
11 | y = yFunc(x); |
12 | plot(x,y,'k-'); |
13 | hold on; |
14 | |
15 | n=1; |
16 | j=1; |
17 | a(n)=a; |
18 | b(n)=b; |
19 | while(Fibonacci(j)*xStep<(b-a)) |
20 | j=j+1; |
21 | end |
22 | r(1)=a(1)+(1-Fibonacci(j-1)/Fibonacci(j))*(b(1)-a(1)); |
23 | u(1)=a(1)+Fibonacci(j-1)/Fibonacci(j)*(b(1)-a(1)); |
24 | for n=1:1:j-2 |
25 | R(n)=yFunc(r(n)); |
26 | U(n)=yFunc(u(n)); |
27 | Z(n)=b(n)-a(n); |
28 | if R(n)>U(n) |
29 | a(n+1)=r(n); |
30 | b(n+1)=b(n); |
31 | r(n+1)=u(n); |
32 | u(n+1)=a(n+1)+Fibonacci(j-n-1)/Fibonacci(j-n)*(b(n+1)-a(n+1)); |
33 | else |
34 | a(n+1)=a(n); |
35 | b(n+1)=u(n); |
36 | u(n+1)=r(n); |
37 | r(n+1)=a(n+1)+(1-Fibonacci(j-n-1)/Fibonacci(j-n))*(b(n+1)-a(n+1)); |
38 | end |
39 | plot(a(n),yFunc(a(n)),'c*'); |
40 | plot(b(n),yFunc(b(n)),'b*'); |
41 | pause(0.5); |
42 | end |
43 | R(j-1)=yFunc(r(j-1)); |
44 | U(j-1)=yFunc(u(j-1)); |
45 | r(j)=r(j-1); |
46 | u(j)=r(j-1)+eps; |
47 | R(j)=yFunc(r(j)); |
48 | U(j)=yFunc(u(j)); |
49 | if R(j)>U(j) |
50 | a(j)=r(j); |
51 | b(j)=b(j-1); |
52 | else |
53 | a(j)=a(j-1); |
54 | b(j)=u(j); |
55 | end |
56 | Z(j-1)=b(j-1)-a(j-1); |
57 | Z(j)=b(j)-a(j); |
58 | x=(a(j)+b(j))/2; |
59 | xStar = (b(n)+a(n))/2; |
60 | yStar = yFunc(xStar); |
61 | plot(a(n),yFunc(a(n)),'ro'); |
62 | hold off; |
63 | log=[a',b',r',u',R',U',Z']; |
64 | |
65 | function y = yFunc(x) |
66 | if (length(x)>1) |
67 | y = x.^2+5.*x; |
68 | else |
69 | y = x^2+5*x; |
70 | end |
71 | |
72 | function F=Fibonacci(n) |
73 | i=1; |
74 | Fibonacci(2)=2; |
75 | Fibonacci(1)=1; |
76 | if n==0 |
77 | F=1; |
78 | else |
79 | for i=3:1:n |
80 | Fibonacci(i)=Fibonacci(i-1)+Fibonacci(i-2); |
81 | end |
82 | i=n; |
83 | end |
84 | F=Fibonacci(i); |
版权声明:xxxxxxxxx;
工作时间:8:00-18:00
客服电话
电子邮件
扫码二维码
获取最新动态