一维寻优法(0.618法)程序设计
最优化方法大作业-算法源程序-0.618法、抛物线法、共轭梯度法

最优化方法程序作业专业:油气储运工程班级:姓名:学号:一、开发工具该应用程序采用的开发工具是Visual studio 2005,编程语言使用的是C#。
二、程序代码(1)0.618法和抛物线法求ψ(t)=sint,初始点t0=1①主程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;public partial class_Default : System.Web.UI.Page{JiSuan JS = new JiSuan();protected void Button1_Click(object sender, EventArgs e){double xx0 = 0.01;//步长double tt0 = 1, pp = 2, qq = 0.5;ArrayList list1 = new ArrayList();list1 = (ArrayList)JS.SuoJian(xx0, tt0, pp, qq);//调用倍增半减函数double aa = double.Parse(list1[0].ToString());double bb = double.Parse(list1[1].ToString());txtShangxian.Text = bb.ToString();//在页面上显示极小区间txtXiaxian.Text = aa.ToString();ArrayList list2 = new ArrayList();list2 = (ArrayList)JS.JiXiao1(aa, bb);//调用0.618法函数double jixiao1 = double.Parse(list2[0].ToString());double fjixiao1 = double.Parse(list2[1].ToString());txtJixiao1.Text = jixiao1.ToString();//在页面上显示极小点txtFjixiao1.Text = fjixiao1.ToString();//在页面上显示极小点处的函数值ArrayList list3 = new ArrayList();list3 = (ArrayList)JS.JiXiao2(aa, bb);//调用抛物线法函数double jixiao2 = double.Parse(list3[0].ToString());double fjixiao2 = double.Parse(list3[1].ToString());txtJixiao2.Text = jixiao2.ToString();//在页面上显示极小点txtFjixiao2.Text = fjixiao2.ToString();//在页面上显示极小点处的函数值 }}②各个子函数的程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;///<summary>/// JiSuan 的摘要说明///</summary>public class JiSuan{public JiSuan(){//// TODO: 在此处添加构造函数逻辑//}//目标函数public double f(double z){double zz = Math.Sin(z);return zz;}//倍增半减函数public ArrayList SuoJian(double x0, double t0, double p, double q){double t1;double f0, f1;double x1, t2;double f2;double a = 0, b = 0, c = 0;double fa, fc, fb;double t3, f3;bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;t1 = t0 + x0;f0 = f(t0);//调用目标函数f1 = f(t1);if (f0 > f1){while (biaozhi1){x1 = p * x0;t2 = t1 + x1;f2 = f(t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t0;c = t1;b = t2;fa = f0;fc = f1;fb = f2;break;}}}else{t3 = t1;f3 = f1;t1 = t0;f1 = f0;t0 = t3;f0 = f3;while (biaozhi2){x1 = q * x0;t2 = t1 - x1;f2 = f(t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t2;c = t1;b = t0;fa = f2;fc = f1;fb = f0;break;}}}ArrayList list = new ArrayList();list.Add(a);list.Add(b);return list;}//0.618法函数public ArrayList JiXiao1(double a, double b) {double jd = 0.0001;//精度double p = 0.618;double t1, t2;double f1, f2;double jixiao=0;//极小点bool biaozhi1 = true;//设置是否循环标志bool biaozhi2 = true;while (biaozhi1){t1 = a + (1 - p)*(b - a);t2 = a + p * (b - a);f1 = f(t1);//调用目标函数f2 = f(t2);while (biaozhi2){if (f1 < f2){b = t2;t2 = t1;f2 = f1;t1 = a + (1 - p)*(b - a); f1 = f(t1);//调用目标函数if (Math.Abs(b - a) > jd) {continue;}else{biaozhi1 = false;break;}}else if (f1 == f2){a = t1;b = t2;if (Math.Abs(b - a) > jd) {break;}else{biaozhi1 = false;break;}}else if (f1 > f2){a = t1;t1 = t2;f1 = f2;t2 = a + p * (b - a);f2 = f(t2);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}}}jixiao = (a + b) / 2;double fjixiao = f(jixiao);//调用目标函数ArrayList list = new ArrayList();list.Add(jixiao);list.Add(fjixiao);return list;}//抛物线法函数public ArrayList JiXiao2(double a, double b){double jd = 0.0001;//精度double c = a + (b - a) / 2;//将c的值设为a、b点的中点double fa, fb, fc, c1, c2;double jixiao = 0;//极小点double ta, fta;double fac;bool biaozhi1 = true;//设置是否循环标志while (biaozhi1){fa = f(a);//调用目标函数fb = f(b);fc = f(c);c1 = (fb - fa) / (b - a);c2 = ((fc - fa) / (c - a) - c1) / (c - b);if (c2 == 0){jixiao = c;break;}else{ta = 0.5 * (a + b - (c1 / c2));fta = f(ta);//调用目标函数if (Math.Abs(b - a) <= jd){jixiao = ta;break;}else{if (fc > fta){if (c > ta){b = c;fb = fc;c = ta;fc = fta;continue;}else{a = c;fa = fc;c = ta;fc = fta;continue;}}else if (fc == fta){if (c > ta){a = ta;b = c;c = (c + ta) / 2;fa = fta;fb = fc;fc = f(c);//调用目标函数continue;}else if (c == ta){fac = f((a + c) / 2);//调用目标函数if (fac < fc){c = (a + c) / 2;fc = f(c);//调用目标函数b = ta;fb = fta;continue;}else{a = (a + c) / 2;fa = f(a);//调用目标函数continue;}}else if (c < ta){a = c;c = (c + ta) / 2;b = ta;fa = fc;fb = fta;fc = f(c);//调用目标函数continue;}}else if (fc < fta){if (c > ta){a = ta;fa = fta;continue;}else{b = ta;fb = fta;continue;}}}}}double fjixiao = f(jixiao);//调用目标函数ArrayList list = new ArrayList();list.Add(jixiao);list.Add(fjixiao);return list;}}(2)共轭梯度法求函数极小点:f(x)=1.5x12+0.5x22-x1x2-2x1;初始点为(-2,4)①主程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;public partial class_Default : System.Web.UI.Page{JiSuan JS = new JiSuan();protected void Button1_Click(object sender, EventArgs e){//共轭梯度法求极小值double[] x0 = new double[2];//定义二维数组double[] x = new double[2];x0[0] = -2;x0[1] = 4;double x00 = -2;double x01 = 4;double jd = 0.0001;//精度bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;double y;//定义关于x的函数值double[] g = new double[2];//定义函数在点x处的梯度值double[] p = new double[2];double ggm, ggo=0;double jixiao;double x1=0, x2=0, fy=0;int i;for (int j = 0; j < 2; j++){x[j] = x0[j];}while (biaozhi1){i = 0;while (biaozhi2){y = JS.f(x[0], x[1]);//调用目标函数g[0] = JS.g0(x[0], x[1]);//调用梯度函数,求在点x处的梯度值 g[1] = JS.g1(x[0], x[1]);ggm = g[0] * g[0] + g[1] * g[1];if (ggm <= jd){x1 = x[0];x2 = x[1];fy = y;biaozhi1 = false;break;}else{if (i == 0){p[0] = -g[0];p[1] = -g[1];}else{p[0] = -g[0] + (ggm / ggo) * p[0];p[1] = -g[1] + (ggm / ggo) * p[1];}//调用0.618法子函数,找出极小点jixiao = JS.JiXiao1(x[0], x[1], p[0], p[1], x00, x01); x[0] = x[0] + jixiao * p[0];x[1] = x[1] + jixiao * p[1];ggo = ggm;i++;if (i >= 2){break;}else{continue;}}}}txtx1.Text = x1.ToString();txtx2.Text = x2.ToString();txty.Text = fy.ToString();}}②子函数程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;///<summary>/// JiSuan 的摘要说明///</summary>public class JiSuan{public JiSuan(){//// TODO: 在此处添加构造函数逻辑//}//目标函数public double f(double z1,double z2){double zz = 1.5 * z1 * z1 + 0.5 * z2 * z2 - z1 * z2 - 2 * z1;return zz;}//求梯度值函数public double g0(double z1, double z2){double zz = 3 * z1 - z2 - 2;return zz;}public double g1(double z1, double z2){double zz = z2 - z1;return zz;}//倍增半减函数public ArrayList SuoJian(double x0, double t0, double p, double q, double xx0, double xx1, double p0, double p1,double x00,double x01){double t1;double f0, f1;double x1, t2;double f2;double a = 0, b = 0, c = 0;double fa, fc, fb;double t3, f3;bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;double x_0t1, x_1t1, x_0t2, x_1t2;x_0t1 = xx0 + t1 * p0;x_1t1 = xx1 + t1 * p1;f0 = f(x00, x01);//调用目标函数f1 = f(x_0t1, x_1t1);if (f0 > f1){while (biaozhi1){x1 = p * x0;t2 = t1 + x1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t0;c = t1;b = t2;fa = f0;fc = f1;fb = f2;break;}}}else{t3 = t1;f3 = f1;t1 = t0;f1 = f0;t0 = t3;while (biaozhi2){x1 = q * x0;t2 = t1 - x1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t2;c = t1;b = t0;fa = f2;fc = f1;fb = f0;break;}}}ArrayList list = new ArrayList();list.Add(a);list.Add(b);return list;}//0.618法函数public double JiXiao1(double x0, double x1, double p0, double p1,double x00,double x01){double jd = 0.0001;//精度double p = 0.618;double t1, t2;double jixiao = 0;//极小点bool biaozhi1 = true;//设置是否循环标志bool biaozhi2 = true;double xx0 = 0.01;//步长double tt0 = 0, pp = 2, qq = 0.5;double x_0t1, x_1t1, x_0t2, x_1t2;ArrayList list1 = new ArrayList();//调用倍增半减函数获取极小区间list1 = (ArrayList)SuoJian(xx0, tt0, pp, qq, x0, x1, p0, p1, x00, x01);double a = double.Parse(list1[0].ToString());double b = double.Parse(list1[1].ToString());while (biaozhi1){t1 = a + (1 - p) * (b - a);t2 = a + p * (b - a);x_0t1 = x00 + t1 * p0;x_1t1 = x01 + t1 * p1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f1 = f(x_0t1, x_1t1);//调用目标函数f2 = f(x_0t2, x_1t2);while (biaozhi2){if (f1 < f2){b = t2;t2 = t1;f2 = f1;t1 = a + (1 - p) * (b - a);x_0t1 = x00 + t1 * p0;x_1t1 = x01 + t1 * p1;f1 = f(x_0t1, x_1t1);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}else if (f1 == f2){a = t1;b = t2;if (Math.Abs(b - a) > jd){break;}else{biaozhi1 = false;break;}}else if (f1 > f2){a = t1;t1 = t2;f1 = f2;t2 = a + p * (b - a);x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}}}jixiao = (a + b) / 2;return jixiao;}}三、程序运行界面及结果(1)0.618法和抛物线法求ψ(t)=sint,初始点t0=1(2)共轭梯度法求函数极小点:f(x)=1.5x12+0.5x22-x1x2-2x1;初始点为(-2,4)。
3.3 一维搜索方法 (一维优化)

并令: h 2h
x3 x 2 h ,求 y3 f ( x3 )
重复上述步骤,直到函数值出现“高-低-高”为止。
4. 若在步骤2中,出现 y1 y 2 (图a虚线),则应作后退运算: 令:h h0 置换:x3 x1 y 3 y1 ; x1 x2 y1 y2 ;x2 x3 y2 y3 再令:h 2h
2 2 2 2 ( x2 x3 ) f1 ( x3 x12 ) f 2 ( x12 x2 ) f 3 b ( x1 x2 )( x2 x3 )( x3 x1 )
教材中,c的表达式缺-号
c
( x3 x2 ) x2 x3 f1 ( x1 x3 ) x1 x3 f 2 ( x2 x1 ) x1 x2 f 3 ( x1 x2 )( x2 x3 )( x3 x1 )
入口
x
(0),ε
X
(1)=x(0)-f/x(0)/f//x(0)
∣f/x(1)∣≤ε 或∣x(1)-x(0)∣≤ε ?
x
(*):=x (1)
x
(0):=x (1)
出口
4 3 2 例: 试用牛顿法求 f ( x) 1 x 2 x 2 x 7 x 8 4 3 值,已知探索区间为[a,b]=[3,4],ε=0.05。
4、牛顿法的特点 优点:收敛速度较快 缺点: 1)计算f’ 、f’’,计算工作量大。 2)用数值微分计算f’ 、f’’时,舍入误差会影响收敛速度。 3)x0与 x不能离太远,否则会发散或收敛于非极小点。 与0.618法比较: 0.618 法:1)收敛慢 2)对函数要求不严格 牛顿法正好相反。
5、牛顿法的框图
x3 x 2 h
3. 若 y 2 y1 ,应作前进运算(图a实线):
机械优化设计第三章一维搜索方法

(b a),故
Fn
b
a 。由Fn即可从斐波那契数列表或按F0
F1
1, Fn
Fn1
Fn2 (n
2, 3,
)
推算出相应的n。
3)确定试点并计算相应的函数值,在区间a, b内的两个试点:
x2
a
Fn1 Fn
(b
a),
x1
b
Fn1 Fn
(b
a),
f1 f (x1),
f2 f (x2 )
第三章 一维搜索方法
1.若f (a1) f (b1),则取[a,b1]为缩短后的搜索区间; 2.若f (a1) f (b1),则取[a1,b]为缩短后的搜索区间。
第三章 一维搜索方法
第二节 搜索区间的确定与区间消去法原理
间 接
假定在搜索区间[a, b]内取一点x, 并计算它的导数值 f '(x),可能出现三种情况:
x2 a b x1, f2 f (x2 )
5)检查迭代终止条件:bn1 an1
,若满足,则输出最优解x*
1 (a b), 2
ห้องสมุดไป่ตู้
f*
f (x*),
若不满足,则转入(4),继续进行迭代。
1. f (a1) f (b1),由于函数的单峰性, 极小点一定在[a, b1 ]内; 2. f (a1) f (b1),极小点一定在[a1,b]内; 3. f (a1) f (b1),极小点一定在[a1,b1]内。
第三章 一维搜索方法
第二节 搜索区间的确定与区间消去法原理
直 接 法
假定在搜索区间[a,b]内任取两点a1和b1,且a1 b1, 并计算f (a1)和f (b1),可能出现三种情况:
f (x1) f (x) f (x2)
优化方法

一、无约束最优化问题Ⅰ 1、 一维搜索0.618法(黄金分割法)、二次插值法、牛顿法 2、 方向加速法或鲍威尔(Powell )方法该法是一边做一系列的一维最优化,一边调整一维最优化的方向,使之尽快地达到最优解的方法。
基本原理:每一轮迭代产生一个共轭方向,其共轭方向由每轮迭代中的末首两点之差产生。
3、 单纯形法单纯形法是对n 维空间的n+1个点(它们构成一个单纯形的顶点)上的函数值进行比较,去掉其中最坏的点,代之以新的顶点,新的点与前面余下的点又构成一个新的单纯形。
每次把坏的点去掉,把好的留下来,这样逐渐调向最优点。
在此以正规单纯形(即正多面体)为例。
通常选正规单纯形作为初始单纯形,其方法如下:()n a a a X ,...,,210=其余n 个点分别取为()q a q a p a X n +++=,...,,211 ()q a p a q a X n +++=,...,,212…………………………………()p a q a q a X n n +++=,...,,21其中a 为单纯形边长, ()112-++=n n n a p()112-+=n na q4、 复形法复形法实质上是对单纯形法的修正,以便适用于更一般形式的问题,如:()X f X min Ω∈其中(){}n j x x x m i X g X u j j l j i ...,2,1,;...,2,1,0|=≤≤=≥=Ω ()n x x x X ,...,,21=也就是属于约束优化问题。
复形法的基本思路如下:复形法需要用2+≥n l 个顶点,每一个顶点都要满足所有的约束条件,这些顶点可以从满足所有m 个约束条件的点出发,其他1-l 个点可以随机的产生,经过不断调优(既使目标函数减少,又要新点满足约束条件)逐步逼近最优点。
由于这个方法不必保证正规图形,较之单纯形法更为灵活易变。
5、 随机射线法(1)通常所谓的随机射线法就是在整个设计变量空间中,每一个设计被选取的可能性是相同的。
实验1一维搜索算法的程序设计

实验一 一维搜索算法的程序设计一、实验目的1、熟悉一维无约束优化问题的二分法、0.618算法和牛顿法。
2、培养matlab 编程与上机调试能力。
二、实验课时:2个课时三、实验准备1、预习一维无约束优化问题的二分法、0.618算法和牛顿法的计算步骤。
2、熟悉matlab 软件的基本操作。
四、实验内容课堂实验演示1、根据二分法算法编写程序,求函数2()22f x x x =++在区间[2,1]-上的极小值。
二分法如下:(1)给定区间[,]a b (要求满足0)(',0)('><b f a f )以及精度0>δ;(2)若δ≤-a b ,则停,输出*()/2x a b =+;(3)计算()/2c a b =+;(4)若0)('<c f ,令a c =,返回(2);否则若0)('>c f ,令b c =;否则若0)('=c f ,则停输出*()/2x a b =+;function [val,x,iter] = bisection_method(a,b,delta)iter = 0;while abs(b-a)>deltaiter = iter+1;[y,dy] = fun((a+b)/2);if abs(dy)<= deltax = (a+b)/2;val = y;return;elseif dy<0a = (a+b)/2;elseb = (a+b)/2;endendx = (a+b)/2;[val,dval] = fun(x);%%%%%%%%%%%%%%%%%%%%%%% obj function %%%%%%%%%%%%%%%%%%%%%%%%% function [y,dy] = fun(x)y = x^2+2*x+2;dy = 2*x+2;>> delta = 1.0e-6;[val,x,iter] = bisection_method(-2,1,delta)val = 1x = -1iter = 212、根据0.618算法编写程序,求函数()()()630sin tan 1x f x x x e =-在区间[0,1]上的极大值。
工程优化 第三章 一维搜索

例
经 6 次迭代达到
b7 a7 0.111 0.16 满足精度要求,极小点 x [0.168,0.279] . 0.168 0.279 x 0.23 * 2 实际上,最优解 x 0.25 .可取 作为近似最
优解.
第四节 对分法(二分法) 对分法适用对象:单峰函数、连续可导 优点:每迭代一次可去掉区间的二分之一。 如果找到一个区间 [a, b] ,具有性质 (a) 0, (b) 0 ,则在 a, b 之
* * ( x ) 0. ( x ) 间必有 的极小点 x ,且
算法步骤: 已知 a, b 且 a b , (a) 0, (b) 0 及 0 . 1)
c ab 2 ,转 2);
2)若 b a ,转 4);否则,转 3);
3 )计算 (c) . 若 (c) 0 ,转 4 ) ;若 (c) 0 ,则令 a c ,转 1) ;若 (c) 0 ,则令 b c ,转 1) ; * t 4)令 c ,停止迭代. 4 3 2 ( x ) 3 x 16 x 30 x 24 x 8 ,求 ( x) 的极小点. 例 设
第三章 常用一维搜索方法
第一节 一维搜索概述 一、下降迭代算法的基本思想 不失一般性,考虑如下的优化问题
min f ( x)
xS
n f : S R R. 其中
(3.1)
1 x 下降迭代算法的基本思想:给定一个初始点 S ,按照
k k { x } { x 某种迭代规则产生一个点列 ,使得当 } 是有限点列时, k { x 其最后一个点是最优化问题的最优解;当 } 是无穷点列时,
* [ a , b ] ( x ) x 设 在 上是单峰函数,最小点为 .在 (a, b) 内任取
第4章一维搜索优化方法PPT课件

例4-3 用二次插值法求一维函数f(α)=α2-10α+35的最优解。 初始单谷搜索区间[α1,α3]=[1.5,7.5],迭代精度ε=10-3。
while (abs(x4-x2)>=epsilon)
if x2<x4 if f2>f4
x1 x2 x4 x3 x1 x4 x2 x3
f1=f2;x1=x2;x2=x4;f2=f4;
1. 基本原理:
(1) 初始区间 [a, b], 两内点x1和 x2,区间长度为 L。 其中 ax2 和x1b 的长度分别为 λL。
(2) 求 f(x1) 和 f(x2)。若 f(x1)>f(x2),
则下一次迭代,保留区间为 [x1,b],重新命名为 [a1,b1]。
(3) x2 →保留至新区间→ 更名x1,
(1)function QIM(……)函数必须另存一个文件,取名为 QIM.m
(2)QIM.m必须和eg4_3.m在同一个子目录下。
(3)修改循环方式再编写程序。
本章练习
初始步长h需要给定。 每次迭代时,步长是翻倍的。 当连续三点的函数指出现大小大的情况,迭代终止。
二、算法框图
2. 流程图:
yes
h=?2h
c=b+h fc=f(c)
开始
h 2h 2(2h)
输入 h,a fa=f(a)
a ba bc c
hh
b=a+h,fb=f(b) no
fa>fb
ab cb a
约束条件: 0 ≤ x≤ 3
寻优方向:坐标轴方向
x≥0.5 设计变量:X=[ x] T
可行域
x
0 0.5
3
一、一维搜索方法的重要性
第3章 一维优化方法

若 f1 ≥ f2 ,则取[ ,b]为新区间,而 作为新区间内的第一个 试算点,即令
而另一试算点可按下式计算出来:
(4) 迭代终止条件判别 若满足b-a ≤ε,则转 下一步; 否则返回步骤(3),进行 下一次迭代计算,进一步缩 短区间。
(5) 输出最优解
黄金分割法的计算框图, 如图3-7所示。
(3-2)
综上所述,黄金分割法的计算步骤如下:
(1) 给定初始单峰区间[a, b]和收敛精度ε; (2) 在区间[a, b]内取两个内插点并计算其函数值:
(3) 比较函数值 f1和 f2 的大小:
若 f1 < f2 ,则取[a, ]为新区间,而 试算点,即令
则作为新区间内的第一个
而另一试算点可按下式计算出
l,则
首次区间缩短率为:
再次区间缩短率为:
根据每次区间缩短率相等的原则,则有
由此得 即
,或 ,解此方程取其正根可得
这意味着,只要取λ= 0.618,就以满足区间缩短率不变的要求。 即每次缩小区间后,所得到的区间是原区间的0.618倍,舍弃的区间 是原区间的0.382倍。 根据以上结果,黄金分割法的两个内插点的取点规则为:
目前,在 一维优化搜索 中,确定 单峰区间 常用的方法主要是 进退试算法。
进退试算法的基本思想为:
按照一定的规律给出若干试算点,依次比较各试算点的函数 值的大小,直到找到相邻三点的函数值按 “高-低-高” 变化的单峰 区间为止。
进退试算法的运算步骤如下: (1)给定初始点α0和初始步长h ,设搜索区间[a, b],如图3-3所示。
短率都是取λ= 0.618,即该法是按区间全长的0.618倍的关系来选取两
个对称内插点α1,α2的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一维寻优法(0.618法)程序设计
一维寻优法,又叫作黄金分割法或者0.618法,是一种基于比较大小的优化算法,能
够在一维搜索空间中找到最优解或者一定程度上接近最优解。
这是一种简单而经典的算法,在实际应用中有很多的应用场景。
接下来我们将介绍一下如何设计一维寻优法的程序,包
括算法原理、代码实现和测试结果。
### 1. 算法原理
一维寻优法的核心思想是找到一段区间,通过不断缩小这个区间的范围来逼近最优解。
具体来讲,我们首先需要给出一个初始的搜索区间,假设这个区间是[a, b]。
我们可以通
过计算出0.618的值(记为c),将这个区间划分为两个子区间[a, c]和[c, b]。
对于这两个子区间中的一个,我们可以进一步将其划分为两个子区间,之后对于这两个子区间分别
计算其函数值,保留其中更小的一个(因为我们是要找最小值),并更新原始的搜索区间。
如此往复进行下去,直到搜索区间的长度小于一定的阈值或者我们已经满足了一定的精度
要求为止。
### 2. 代码实现
下面是一维寻优法的Python示例代码:
```python
def golden_section(func, a, b, epsilon=1e-5):
"""
:param func: 要进行最优化的函数
:param a: 搜索区间左边界
:param b: 搜索区间右边界
:param epsilon: 精度控制参数
:return: 函数极小值所在的x值
"""
c = 0.618 # 黄金分割点
x1 = a + (1 - c) * (b - a) # 初始化搜索区间
x2 = a + c * (b - a)
y1 = func(x1)
y2 = func(x2)
while abs(b - a) > epsilon:
if y1 <= y2:
b = x2
x2 = x1
y2 = y1
x1 = a + b - x2
y1 = func(x1)
else:
a = x1
x1 = x2
y1 = y2
x2 = a + b - x1
y2 = func(x2)
return (a + b) / 2
```
代码中,我们首先计算出黄金分割点,并初始化搜索区间。
之后采用while循环进行迭代寻优,根据y1和y2的大小关系来确定下一个搜索区间。
最后返回搜索区间的中点作为函数极小值所在的x值。
### 3. 测试结果
我们使用上述代码对于函数f(x) = x^2 + 2x - 3进行最优化,搜索区间为[-10, 10],将误差限定为1e-6。
代码如下:
```python
def f(x):
return x**2 + 2*x - 3
result = golden_section(f, -10, 10, epsilon=1e-6)
print("最小值所在的x值为: ", result)
print("最小值为: ", f(result))
```
最终程序输出:
```
最小值所在的x值为: -0.9999971685903893
最小值为: -4.000000999876997
```
可以看到,在精度为1e-6的情况下,程序成功找到了函数最小值的近似值。
我们可以尝试调整初始搜索区间和精度参数,来观察程序的表现。
除了上述示例中的一维函数优化问题之外,一维寻优法还可以在其他场景中得到广泛应用。
下面我们将介绍一些常见的应用场景。
1. 最大值和最小值的寻优
除了上述示例中的函数最小值的寻优问题,一维寻优法同样适用于函数最大值的寻优问题。
在代码实现中,只需要将判断条件由y1 <= y2改为y1 >= y2即可。
2. 无导数优化问题
3. 全局搜索问题
在全局搜索问题中,我们要在一个非常广泛的搜索区间内寻找一个最优解。
以函数优化问题为例,我们不能像一维寻优法一样用一个初始的搜索区间来不断缩小范围,这样很有可能会陷入局部最优值。
在这种情况下,我们可以采用随机搜索等策略,将搜索范围随机地分成若干个子区间,然后在每个子区间内运用一维寻优法进行搜索。
4. 探索复杂结构模型中的最小值
在一些模型中,目标函数可能包含有复杂的结构,例如存在多个局部最优值或梯度消失/爆炸等问题。
在这些情况下,常规的优化算法可能会陷入某个局部最优值或根本找不到最优解。
一维寻优法虽然简单,但能够探索更深层次的最小值,可能在一些情况下获得更好的效果。
一维寻优法虽然简单,但在一些场景下仍能够得到广泛的应用。
在实际应用中,我们还需要结合具体问题和需求来选择最为合适的算法,以取得最佳效果。