组合最优化算法(一)

黄金分割法、斐波那契法、进退法、二分法

黄金分割法

黄金分割法每次缩小区间的比例都是一致的,每次将区间长度缩小到原来的0.618倍;找到一个区间[a, b]满足 ∣ a − b ∣ < ϵ {\left|a-b\right|}<\epsilon ab<ϵ 即可以粗略地确认极小值点为 x m i n = a + b 2 x_{min}=\frac{a+b}{2} xmin=2a+b
算法步骤
对于给定的a,b,其中 ( a < b ) {\left(a<b\right)} (a<b)

  1. x 2 = a + 0.618 ( b − a ) , f 2 = f ( x 2 ) x_2=a+0.618{\left(b-a\right)},f_2=f{\left(x_2\right)} x2=a+0.618(ba),f2=f(x2)
  2. x 1 = a + 0.382 ( b − a ) , f 1 = f ( x 1 ) x_1=a+0.382{\left(b-a\right)},f_1=f{\left(x_1\right)} x1=a+0.382(ba),f1=f(x1)
  3. ∣ a − b ∣ < ϵ {\left|a-b\right|}<\epsilon ab<ϵ,则 x m i n = a + b 2 x_{min}=\frac{a+b}{2} xmin=2a+b,终止算法
  4. f 1 < f 2 f_1<f_2 f1<f2,则 b = x 2 , x 2 = x 1 , f 2 = f 1 b=x_2,x_2=x_1,f_2=f_1 b=x2,x2=x1,f2=f1,转步骤2
    f 1 = f 2 f_1=f_2 f1=f2,则 a = x 1 , b = x 2 a=x_1,b=x_2 a=x1,b=x2,转步骤1
    f 1 > f 2 f_1>f_2 f1>f2,则 a = x 1 , x 1 = x 2 , f 1 = f 2 a=x_1,x_1=x_2,f_1=f_2 a=x1,x1=x2,f1=f2,转步骤5
  5. x 2 = a + 0.618 ( b − a ) x_2=a+0.618{\left(b-a\right)} x2=a+0.618(ba),转步骤3

斐波那契法

Fibonacci法是黄金分割法的一般形式,在黄金分割法中,参数始终保持不变,如果动态的改变参数 ρ \rho ρ则会产生一种新的搜索算法。假设第 k k k次的参数为 ρ k {\rho}_k ρk,第 k + 1 k+1 k+1次的参数为 ρ k + 1 {\rho}_{k+1} ρk+1,则参数之间也满足两次迭代之间的关系式 ρ k + 1 ( 1 − ρ k ) = 1 − 2 ρ k {\rho}_{k+1}{\left(1-{\rho}_k\right)}=1-2{\rho}_k ρk+1(1ρk)=12ρk;整理之后得到 ρ k + 1 = 1 − ρ k 1 − ρ k {\rho}_{k+1}=1-\frac{{\rho}_k}{1-{\rho}_k} ρk+1=11ρkρk

算法步骤

  1. 给定一个初始区间[a, b] ( a < b ) {\left(a<b\right)} (a<b),以及最终精度 ϵ ( ϵ < 0 ) \epsilon{\left(\epsilon<0\right)} ϵ(ϵ<0)。假设Fibonacci数列为 F ( n ) F\left(n\right) F(n),设初始值 n = 3 n=3 n=3
  2. x 2 = a + F ( n − 1 ) F ( n ) ( b − a ) , f 2 = f ( x 2 ) x_2=a+\frac{F\left(n-1\right)}{F\left(n\right)}{\left(b-a\right)},f_2=f{\left(x_2\right)} x2=a+F(n)F(n1)(ba),f2=f(x2)
  3. x 1 = a + F ( n − 2 ) F ( n ) ( b − a ) , f 1 = f ( x 1 ) x_1=a+\frac{F\left(n-2\right)}{F\left(n\right)}{\left(b-a\right)},f_1=f{\left(x_1\right)} x1=a+F(n)F(n2)(ba),f1=f(x1)
  4. f 1 < f 2 f_1<f_2 f1<f2,则 b = x 2 , x 2 = x 1 , f 2 = f 1 , x 1 = a + F ( n − 2 ) F ( n ) ( b − a ) , f 1 = f ( x 1 ) b=x_2,x_2=x_1,f_2=f_1,x_1=a+\frac{F\left(n-2\right)}{F\left(n\right)}{\left(b-a\right)},f_1=f{\left(x_1\right)} b=x2,x2=x1,f2=f1x1=a+F(n)F(n2)(ba)f1=f(x1)
    f 1 = f 2 f_1=f_2 f1=f2,则 a = x 1 , b = x 2 , x 1 = a + F ( n − 2 ) F ( n ) ( b − a ) , f 1 = f ( x 1 ) , x 2 = a + F ( n − 1 ) F ( n ) ( b − a ) , f 2 = f ( x 2 ) a=x_1,b=x_2,x_1=a+\frac{F\left(n-2\right)}{F\left(n\right)}{\left(b-a\right)},f_1=f{\left(x_1\right)},x_2=a+\frac{F\left(n-1\right)}{F\left(n\right)}{\left(b-a\right)},f_2=f{\left(x_2\right)} a=x1,b=x2x1=a+F(n)F(n2)(ba),f1=f(x1)x2=a+F(n)F(n1)(ba),f2=f(x2)
    f 1 > f 2 f_1>f_2 f1>f2,则 a = x 1 , x 1 = x 2 , f 1 = f 2 , x 2 = a + F ( n − 1 ) F ( n ) ( b − a ) , f 2 = f ( x 2 ) a=x_1,x_1=x_2,f_1=f_2,x_2=a+\frac{F\left(n-1\right)}{F\left(n\right)}{\left(b-a\right)},f_2=f{\left(x_2\right)} a=x1,x1=x2,f1=f2x2=a+F(n)F(n1)(ba),f2=f(x2)
    步骤5
  5. 若满足 ∣ a − b ∣ < ϵ {\left|a-b\right|}<\epsilon ab<ϵ ,则 x m i n = a + b 2 , f m i n = f ( x m i n ) x_{min}=\frac{a+b}{2},f_{min}=f{\left({x_{min}}\right)} xmin=2a+bfmin=f(xmin),停止计算,否则转到步骤6
  6. n = n + 1 {n}={n+1} n=n+1,转步骤4

进退法

进退法是用来确定搜索区间(包含极小值点的区间)的算法,理论依据是单谷函数(只有一个极值点),且[a, b]为其极小值点的一个搜索区间,对于任意 x 1 , x 2 ∈ [ a , b ] {x_1},{x_2}\in\left[a,b\right] x1,x2[a,b],如果 f 1 < f 2 f_1<f_2 f1<f2,则 [ a , x 2 ] \left[a,x_2\right] [a,x2]为极小值的搜索区间,如果 f 1 > f 2 f_1>f_2 f1>f2,则 [ x 1 , b ] \left[x_1,b\right] [x1,b]为极小值的搜索区间。
基本思想:对 f ( x ) f{\left(x\right)} f(x)任选一个初始点 x 1 {x_1} x1及初始步长 h 0 {h_0} h0,通过比较这两点函数值的大小,确定第三点位置,比较这三点的函数值大小,确定是否为“高-低-高”形态。

算法原理

  1. 试探搜索
    选定初始点 x 1 , x 2 = x 1 + h 0 {x_1},{x_2}={x_1}+{h_0} x1,x2=x1+h0,计算 y 1 = f ( x 1 ) , y 2 = f ( x 2 ) {y_1}=f{\left(x_1\right)},{y_2}=f{\left(x_2\right)} y1=f(x1),y2=f(x2),如果 y 1 > y 2 {y_1}>{y_2} y1>y2,转2向右前进;如果 y 1 < y 2 {y_1}<{y_2} y1<y2,转3向左前进
  2. 前进搜索
    加大步长 h = 2 h h=2h h=2h,产生新点 x 3 = x 2 + h x_3=x_2+h x3=x2+h
    如果 y 2 ≤ y 3 {y_2}\le{y_3} y2y3,则函数在[ x 1 x_1 x1, x 3 x_3 x3]内必有极小点,令 a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,搜索区间为[a, b]
    如果 y 2 > y 3 {y_2}\gt{y_3} y2>y3,令 x 1 = x 2 , y 1 = y 2 , x 2 = x 3 , y 2 = y 3 , h = 2 h x_1=x_2,y_1=y_2,x_2=x_3,y_2=y_3,h=2h x1=x2,y1=y2,x2=x3,y2=y3,h=2h;重新构造新点 x 3 = x 2 + h x_3=x_2+h x3=x2+h,并比较 y 2 , y 3 y_2,y_3 y2,y3的大小,直到 y 2 ≤ y 3 y_2\le{y_3} y2y3
  3. 后退搜索
    x 3 = x 2 , y 3 = y 2 , h = 1 2 h x_3=x_2,y_3=y_2,h=\frac{1}{2}h x3=x2,y3=y2,h=21h,产生新点 x 2 = x 3 − h x_2=x_3-h x2=x3h
    如果 y 2 ≤ y 1 {y_2}\le{y_1} y2y1,则函数在[ x 1 x_1 x1, x 3 x_3 x3]内必有极小点,令 a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,搜索区间为[a, b]
    如果 y 2 > y 1 {y_2}\gt{y_1} y2>y1,令 x 3 = x 2 , y 3 = y 2 , h = 1 2 h x_3=x_2,y_3=y_2,h=\frac{1}{2}h x3=x2,y3=y2,h=21h;重新构造新点 x 2 = x 3 − h x_2=x_3-h x2=x3h,并比较 y 1 , y 2 y_1,y_2 y1,y2的大小,直到 y 2 ≤ y 1 y_2\le{y_1} y2y1,令 a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,搜索区间为[a, b]

算法步骤

  1. 给定初始点 x 1 {x_1} x1,初始步长 h 0 {h_0} h0,令 h = h 0 h=h_0 h=h0
  2. x 2 = x 1 + h 0 {x_2}={x_1}+{h_0} x2=x1+h0,如果 y 1 > y 2 {y_1}>{y_2} y1>y2,则转步骤3,否则转步骤6
  3. h = 2 h , x 3 = x 2 + h h=2h,x_3=x_2+h h=2h,x3=x2+h,如果 y 2 ≤ y 3 {y_2}\le{y_3} y2y3则转步骤4,否则转步骤5
  4. a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,极小值一定存在于区间[a, b]
  5. x 1 = x 2 , y 1 = y 2 , x 2 = x 3 , y 2 = y 3 x_1=x_2,y_1=y_2,x_2=x_3,y_2=y_3 x1=x2,y1=y2,x2=x3,y2=y3,转步骤3
  6. h = 1 2 h , x 3 = x 2 , y 3 = y 2 , x 2 = x 3 − h h=\frac{1}{2}h,x_3=x_2,y_3=y_2,x_2=x_3-h h=21h,x3=x2,y3=y2,x2=x3h;如果 y 2 ≤ y 1 y_2\le{y_1} y2y1则转步骤4,否则转步骤6

二分法

f ( x ) f{\left(x\right)} f(x)的导数存在且容易计算,则线性搜索的速度可以得到提高,下面的二分法每次将区间缩小至原来的二分之一
f ( x ) f{\left(x\right)} f(x)为下单峰函数,若 f ( x ) f{\left(x\right)} f(x)[a, b]具有连续的一阶导数,且 f ′ ( a ) < 0 , f ′ ( b ) > 0 f^{'}{\left(a\right)}<0,f^{'}{\left(b\right)}>0 f(a)<0,f(b)>0,取 c = a + b 2 c=\frac{a+b}{2} c=2a+b
f ′ ( c ) = 0 f^{'}{\left(c\right)}=0 f(c)=0,则c为极小点;
f ′ ( c ) > 0 f^{'}{\left(c\right)}>0 f(c)>0,则以[a, c]代替[a, b]作为新区间;
f ′ ( c ) < 0 f^{'}{\left(c\right)}<0 f(c)<0,则以[c, b]代替[a, b]作为新区间;

抛物线法(二次插值法)

在求一元函数的极小点问题上,我们可以利用若干点处的函数值来构造一个多项式,用这个多项式的极小点作为原来函数极小点的近似值。 抛物线法就是一个用二次函数来逼近f(x)的方法,这也是我们常说的二次插值法
设在已知的三点 x 1 < x 0 < x 2 x_1\lt x_0\lt x_2 x1<x0<x2处对应的函数值 f ( x i ) = f i f\left(x_i\right)=f_i f(xi)=fi,且满足: f 1 > f 0 , f 0 < f 2 f_1\gt f_0,f_0\lt f_2 f1>f0,f0<f2
过三点 ( x 1 , f 1 ) , ( x 0 , f 0 ) , ( x 2 , f 2 ) \left(x_1,f_1\right),\left(x_0,f_0\right),\left(x_2,f_2\right) (x1,f1),(x0,f0),(x2,f2)作二次函数 y = ϕ ( x ) y=\phi\left(x\right) y=ϕ(x),即作一条抛物线,则可推导出:

ϕ ( x ) = ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) f 1 + ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) f 0 + ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) f 2 \phi\left(x\right)=\frac{\left(x-x_0\right)\left(x-x_2\right)}{\left(x_1-x_0\right)\left(x_1-x_2\right)}f_1+\frac{\left(x-x_1\right)\left(x-x_2\right)}{\left(x_0-x_1\right)\left(x_0-x_2\right)}f_0+\frac{\left(x-x_0\right)\left(x-x_1\right)}{\left(x_2-x_0\right)\left(x_2-x_1\right)}f_2 ϕ(x)=(x1x0)(x1x2)(xx0)(xx2)f1+(x0x1)(x0x2)(xx1)(xx2)f0+(x2x0)(x2x1)(xx0)(xx1)f2
为求 ϕ ( x ) \phi\left(x\right) ϕ(x)的极小点,令 ϕ ′ ( x ) = 0 \phi' \left(x\right)=0 ϕ(x)=0
x ‾ = 1 2 ( x 2 2 − x 0 2 ) f 1 + ( x 0 2 − x 1 2 ) f 2 + ( x 1 2 − x 2 2 ) f 0 ( x 2 − x 0 ) f 1 + ( x 0 − x 1 ) f 2 + ( x 1 − x 2 ) f 0 \overline x=\frac{1}{2}\frac{\left(x_2^2-x_0^2\right)f_1+\left(x_0^2-x_1^2\right)f_2+\left(x_1^2-x_2^2\right)f_0}{\left(x_2-x_0\right)f_1+\left(x_0-x_1\right)f_2+\left(x_1-x_2\right)f_0} x=21(x2x0)f1+(x0x1)f2+(x1x2)f0(x22x02)f1+(x02x12)f2+(x12x22)f0

x ‾ \overline x x充分接近 x 0 x_0 x0 ,即对于预先给定的精度 ϵ > 0 \epsilon\gt0 ϵ>0 , 有 ∣ x 0 − x ‾ ∣ < ϵ \left|x_0-\overline x\right|\lt\epsilon x0x<ϵ,则把 x ‾ \overline x x作为近似极小点.
否则计算 ,找出 f ( x ‾ ) f\left(\overline x\right) f(x) f ‾ \overline f f之间的大者,去掉 x 1 x_1 x1 x 2 x_2 x2,使新的三点仍具有两端点的函数值大于中间点的函数值的性质.利用新的点再构造二次函数,继续进行迭代.

例题

用Fibonacci算法、进退算法分别求函数 f ( x ) = x 2 − x + 2 f\left(x\right)=x^2-x+2 f(x)=x2x+2在区间 [ 0 , 3 ] \left[0,3\right] [0,3]上的极小值,要求区间长度不大于原始区间长的0.09。(进退法初始步长 Δ x = 0.1 \Delta{x}=0.1 Δx=0.1
Fibonacci法求解:

迭代次数 [ a , b ] \left[a,b\right] [a,b] x 1 x_1 x1 x 2 x_2 x2 f 1 f_1 f1 f 2 f_2 f2 n n n a b s ( a − b ) < ϵ abs(a-b){\lt}{\epsilon} abs(ab)<ϵ
0 [ 0 , 3 ] \left[0,3\right] [0,3]12243
1 [ 0 , 2 ] \left[0,2\right] [0,2] 2 3 \frac{2}{3} 3211.7824
2 [ 0 , 1 ] \left[0,1\right] [0,1] 2 5 \frac{2}{5} 52 2 3 \frac{2}{3} 321.761.785
3 [ 0 , 2 3 ] \left[0,\frac{2}{3}\right] [0,32] 1 4 \frac{1}{4} 41 2 5 \frac{2}{5} 521.82851.766
4 [ 1 4 , 2 3 ] \left[\frac{1}{4},\frac{2}{3}\right] [41,32] 2 5 \frac{2}{5} 52 79 156 \frac{79}{156} 156791.761.757
5 [ 2 5 , 2 3 ] \left[\frac{2}{5},\frac{2}{3}\right] [52,32] 79 156 \frac{79}{156} 15679 178 315 \frac{178}{315} 3151781.751.7547

所以 x m i n = 2 5 + 2 3 2 = 8 15 , f m i n = f ( x m i n ) = 1.751 x_{min}=\frac{\frac{2}{5}+\frac{2}{3}}{2}=\frac{8}{15},f_{min}=f\left(x_{min}\right)=1.751 xmin=252+32=158,fmin=f(xmin)=1.751

进退法求解:
由题意可以得知此时的 ϵ = 0.27 \epsilon=0.27 ϵ=0.27

迭代次数 [ a , b ] \left[a,b\right] [a,b] x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 y 1 y1 y1 y 2 y_2 y2 y 3 y_3 y3 h h h a b s ( a − b ) < ϵ abs(a-b){\lt}{\epsilon} abs(ab)<ϵ
0 [ 0 , 3 ] \left[0,3\right] [0,3]00.1-----21.91-----0.1
1 [ 0.1 , 0.7 ] \left[0.1,0.7\right] [0.1,0.7]0.10.30.71.911.791.790.4
2 [ 0.2 , 0.8 ] \left[0.2,0.8\right] [0.2,0.8]0.20.40.81.841.761.840.4
3 [ 0.3 , 0.9 ] \left[0.3,0.9\right] [0.3,0.9]0.30.50.91.791.751.910.4
4 [ 0.3 , 0.6 ] \left[0.3,0.6\right] [0.3,0.6]0.30.40.61.791.761.760.2
5 [ 0.3 , 0.6 ] \left[0.3,0.6\right] [0.3,0.6]0.41460.4854-----1.75731.7502----------
6 [ 0.4146 , 0.6 ] \left[0.4146,0.6\right] [0.4146,0.6]0.48540.52-----1.75021.7509----------

所以 x m i n = 0.4146 + 0.6 2 = 0.5073 , f m i n = f ( x m i n ) = 1.7501 x_{min}=\frac{0.4146+0.6}{2}=0.5073,f_{min}=f\left(x_{min}\right)=1.7501 xmin=20.4146+0.6=0.5073,fmin=f(xmin)=1.7501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值