基于黄金分割的修正Powell算法
2016-04-07 19:45
281 查看
1.目标函数
<span style="font-size:14px;">function y= TextF(x) %目标函数 %输入参数x[x1,x2]; %输出参数y y = x(1)*x(1)+2*x(2)*x(2)-4*x(1)-2*x(1)*x(2); end</span>
2.修订的Powell算法
f<span style="font-size:14px;">unction [Matrix,Value] = Powell %--------------------------------Step1------------------------------------- %设置初始迭代轮次k=1;迭代精度:Err;初始点;初始搜索方向组; Err = 0.01; X0 = [1,1]; Dir = [1,0; 0,1]; num = 2; while(1) %----------------------------------Step2----------------------------------- %第一轮: %沿着第一个方向进行一维搜索的得到相应的极大值 [X(1,:),JZ(1)] = OneDimensionSearch(X0,Dir(1,:),Err); %沿着第2到第num方向进行一维搜索 for k = 2:num dir(k,:) = Dir(k,:); [X(k,:),JZ(k)] = OneDimensionSearch(X(k-1,:),dir(k,:),Err); end %构造新的搜索方向向量 并以X0为起点,沿此方向进行新一轮搜索,得到相应的极大值 dir(num+1,:) = X(num,:)-X0; [X(num+1,:),JZ(num+1)] = OneDimensionSearch(X0,dir(num+1,:),Err); %----------------------------------Step3----------------------------------- %判断迭代终止条件 delta = X(num+1,:)-X0; if( sqrt(sum(delta.*delta))<=Err ) Matrix = X(num+1,:); Value = TextF(Matrix); %输出最优解和最优变换参数 break; else %----------------------------------Step4----------------------------------- MuInfoVal_0 = TextF(X0); %计算各个方向上的下降量 Diff(1) = MuInfoVal_0-JZ(1);%此时我们在寻找极小值 for k = 2:num Diff(k) = JZ(k-1)-JZ(k); end %记录最下降量 以及 其出现的位置 [maxDiff,m] = max(Diff); %----------------------------------Step5----------------------------------- %计算映射点 Xmap = 2*X(num,:)-X0; %计算Powell特征值 Val_0 = TextF(X0); Val_1 = TextF(X(num,:)); Val_2 = TextF(Xmap); %判断Powell条件 if(Val_2>Val_0 && ... (Val_0-2*Val_1+Val_2)*(Val_0-Val_1-maxDiff)<0.5*maxDiff(Val_0-Val_2)^2 ) %----------------------------------Step6----------------------------------- %如果满足,即为非线性相关 %设置下一轮搜索的初始点 X0 = X(num+1,:); %替换m位置的搜索方向 Dir(m,:) = dir(num+1,:); %----------------------------------Step7----------------------------------- else %如果不满足,即为线性相关,%保持原来的搜索方向,设置下一轮搜索始点 if(Val_1 < Val_2) X0 = X(num,:); else X0 = X(num+1,:); end end end end end</span>
3.一维搜索策略(黄金分割、数值解法)
<span style="font-size:14px;">%% 一维搜索函数:采用黄金分割法 %% function [ExtremePos,ExtremeVal] = OneDimensionSearch(x1,Dir,err) % 从X0点开始,进行搜索 % Dir:搜索的方向。 % err:黄金分割的停止搜索的精度。 % 返回极大值ExtremeVal,以及极大值对应的点ExtremePos %------------------------Step1:进退法确定区间------------------------------ %计算x1,前进,计算x2 y1 = TextF(x1); x2 = x1+Dir; y2 = TextF(x2); %最小值左右支判断 if y1 < y2 % 右支 Dir = -Dir; temp = x1; x1 = x2; x2 = temp; x3 = x2+Dir; y3 = TextF(x3); else %左支 扩大搜索步法 Dir = 2*Dir; x3 = x2+Dir; y3 = TextF(x3); end while(1) if (y2<=y3) %发现极小值所在的区间 a = min(x1,x3); b = max(x1,x3); break; else x1 = x2; x2 = x3; y2 = y3; x3 = x2+Dir; y3 = TextF(x3); end end %--------------------------Step2:黄金分割---------------------------------- g1 = 0.382; g2 = 0.618; xx1 = a+g1*(b-a); yy1 = TextF(xx1); xx2 = a+g2*(b-a); yy2 = TextF(xx2); delta = sqrt(sum(abs(b-a).*abs(b-a))); while( delta>=err) if(yy1 < yy2) b = xx2; xx2 = xx1; yy2 = yy1; xx1 = a+g1*(b-a); yy1 = TextF(xx1); else a = xx1; xx1 = xx2; yy1 = yy2; xx2 = a+g2*(b-a); yy2 = TextF(xx2); end delta = sqrt(sum(abs(b-a).*abs(b-a))); end ExtremePos = 0.5*(a+b); ExtremeVal = TextF(ExtremePos); end</span>
4.运行代码及结果
<span style="font-size:14px;">[m,n]=Powell m = 3.9969 1.9985 n = -8.0000</span>
相关文章推荐
- 价值观
- 《Linux内核设计与实现》第三章读书笔记
- 剑指offer-面试题9.斐波拉契数列
- 类(对象)之间的四种关系。
- [置顶] android开发之java的一些基础知识详解,java编程语法,扎实自己的android基本功
- iOS 传值集合
- Jar mismatch! Fix your dependencies
- maven
- git代理设置方法
- Java实现八皇后问题,用数组递归算法,简单易懂
- C++虚函数与虚函数表
- QT:动态链接库的创建与使用
- 【BZOJ-3144】切糕 最小割-最大流
- Android开发之MdiaPlayer详解
- 皮肤亮白白——美颜算法
- 网络通信 - 重要知识点
- 剑指offer-面试题8.旋转数组的最小数字
- oracle union 与 union all的区别
- codeforces 608BHamming Distance Sum
- 自定义UIview放入到controller中