- 积分
- 57
- 注册时间
- 2006-1-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2007-8-3 17:40:24
|
显示全部楼层
来自 北京海淀
下面给出我以前编写的一个随机行走法求函数最优值的方法,函数基本代码如下:
- function [mx,minf]=randwalk(f,x,lamda,epsilon,N)
- %随机行走法求函数的极小值。输入f为所求函数的句柄,
- %x为初始值。lamda为步长。epsilon为控制lamda的减小的阈值,即lamda减小到epsilon时迭代停止。
- %N为为了产生较好点的迭代控制次数。
- %函数返回值mx为n次试验得到的最优解,minf为响应的最优值。
- %copyright: rocwoods
- f1=f(x(1),x(2));
- while(lamda>=epsilon)
- k=1;
- while(k<=N)
- u=unifrnd(-1,1,1,2);
- x1=x+lamda*(u/norm(u));
- f11=f(x1(1),x1(2));
- if f11<f1
- f1=f11;
- x=x1;
- k=1;
- else
- k=k+1;
- end
- end
- lamda=lamda/2;
- end
- mx=x1;
- minf=f1;
复制代码 事实证明,当[x,y]位于以(50,50)为圆心,半径为1点多的圆域内,randwalk法几乎都能找到最优点。下面给出该方法和MATLAB自带的fminsearch的对比:
比较前的准备工作,建立各自需要的目标函数的函数句柄:
- f=@(x) -sin(sqrt( (x(1)-50)^2+(x(2)-50)^2 ) +exp(1))/(sqrt( (x(1)-50)^2+(x(2)-50)^2 ) +exp(1))-1;
- f2=@(x,y) -sin(sqrt( (x-50).^2+(y-50).^2 ) +exp(1))./(sqrt( (x-50).^2+(y-50).^2 ) +exp(1))-1;
复制代码 比较:
- >> [x,fval] = fminsearch(f, [49,49], optimset('TolX',1e-8))
- x =
- 51.4416 45.2051
- fval =
- -1.1284
- >> [x,fval] = fminsearch(f, [48.5,48.5], optimset('TolX',1e-8))
- x =
- 48.1592 45.3437
- fval =
- -1.1284
- >> [x,fval] = fminsearch(f, [48.9,48.9], optimset('TolX',1e-8))
- x =
- 50.8189 45.0605
- fval =
- -1.1284
- >> [x,fval] = fminsearch(f, [49.3,49.3], optimset('TolX',1e-8))
- x =
- 50.4007 45.0091
- fval =
- -1.1284
- >> [x,fval] = fminsearch(f, [49.5,49.5], optimset('TolX',1e-8))
- x =
- 51.3046 45.1660
- fval =
- -1.1284
- >> [x,fval] = fminsearch(f, [49.6,49.6], optimset('TolX',1e-8))
- x =
- 51.6997 45.2904
- fval =
- -1.1284
- >> [x,fval] = fminsearch(f, [49.7,49.7], optimset('TolX',1e-8))
- x =
- 50.0000 50.0000
- fval =
- -1.1511
- >> [x,fval] = fminsearch(f, [49.65,49.65], optimset('TolX',1e-8))
- x =
- 50.8348 45.0631
- fval =
- -1.1284
- >> [mx,minf]=randwalk(f2,[49,49],0.5,0.00001,100)
- mx =
- 50.0000 50.0000
- minf =
- -1.1511
- >> [mx,minf]=randwalk(f2,[48.5,48.5],0.5,0.00001,100)
- mx =
- 46.3953 46.5250
- minf =
- -1.1284
- >> [mx,minf]=randwalk(f2,[48.9,48.9],0.5,0.00001,100)
- mx =
- 50.0000 50.0000
- minf =
- -1.1511
- >> [mx,minf]=randwalk(f2,[49.3,49.3],0.5,0.00001,100)
- mx =
- 50.0000 50.0000
- minf =
- -1.1511
复制代码 可见,randwalk比fminsearch的有效搜索范围要大,fminsearch在初始值(49.65,49.65)时按如上设置都不能迭代到全局最优解(调整函数设置不知能否实现)。而随机行走法在初始值为(48.9,48.9)时也能迭代到最优。
[ 本帖最后由 rocwoods 于 2008-12-5 17:41 编辑 ] |
评分
-
1
查看全部评分
-
|