复合形法大作业.docx
《复合形法大作业.docx》由会员分享,可在线阅读,更多相关《复合形法大作业.docx(14页珍藏版)》请在冰豆网上搜索。
![复合形法大作业.docx](https://file1.bdocx.com/fileroot1/2022-10/25/11bccc32-d379-4f6a-95ca-d7fe6b2efef0/11bccc32-d379-4f6a-95ca-d7fe6b2efef01.gif)
复合形法大作业
优化理论与最优控制大作业
(2013--2014年度第1学期)
题目:
复合形法大作业
院系:
控制与计算机工程学院
小组成员:
研控计1320班:
范冠男1132227028
习春苗1132227001
程丕建1132227027
王凯1132227013
郭萍1132227020
研控计1322班:
赵亮1132227143
成绩:
日期:
2013年12月8日
一、作业题目
利用复合形法求解Schaffer’sfunction
(i=1,2)
注:
本组各函数中的n值均取为2
二、复合形法的基本原理及本文思路
1、复合形法原理:
复合形法的基本思路是在n维空间的可行域中选取K个设计点(通常取n+1K2n)作为初始复合形(多面体)的顶点。
然后比较复合形各顶点目标函数的大小,其中目标函数值最大的点作为坏点,以坏点之外其余各点的中心为映射中心,寻找坏点的映射点,一般说来此映射点的目标函数值总是小于坏点的,也就是说映射点优于坏点。
这时,以映射点替换坏点与原复合形除坏点之外其余各点构成K个顶点的新的复合形。
如此反复迭代计算,在可行域中不断以目标函数值低的新点代替目标函数值最大的坏点从而构成新复合形,使复合形不断向最优点移动和收缩,直至收缩到复合形的各顶点与其形心非常接近、满足迭代精度要求时为止。
最后输出复合形各顶点中的目标函数值最小的顶点作为近似最优点。
2、本文思路:
本文在理解复合形法的基础上,提出将定义域区域进行等分,分成m×m个小块。
然后对每小块区域选取一个初始点进行寻优,最后比较这些初值点找到的最优值,并把最好的一个最优值作为最终的输出最优值。
三、基本程序流程图
图一、程序流程图
四、求解寻优过程
1、函数三维图形:
图二、目标函数三维图
2、理论结果:
由函数的三维图形不难看出,该函数的理论最大值为1。
即当X=0,Y=0,时,Z=f(x)取最大值为1。
故理论解为X=[0,0]T,f(X)=1。
3、寻优过程:
本文在利用复合形法求解过程中,在平面区域内将区域等分成为64小块,并在每个小块中选取一个初始值作为复合形法的初始值进行寻优计算,并将最终的最优值作为寻优结果。
在区域内初始点散点图如下,从中可以看到在每个网状线格子中都有一个初值。
图三、64个初始点在定义域散点图
同时,本文选取部分初始值寻优结果列入下表:
初始点序号
X0
(1)
X0
(2)
迭代次数
过程最优值
1
-3.464932895
-3.464932895
27
0.782967657
2
-2.03612987
-3.464932895
24
0.990278724
3
-1.884374121
-3.464932895
21
0.990277778
4
-0.948551707
-3.464932895
37
0.990284089
5
0.304348946
-3.464932895
46
0.984610841
……
……
……
……
……
22
1.580191833
-1.884374121
23
0.989391712
23
2.530964452
-1.884374121
23
0.990026091
24
3.901208093
-1.884374121
50
0.999091096
25
-3.464932895
-0.948551707
21
0.803540543
26
-2.03612987
-0.948551707
40
0.995184066
……
……
……
……
……
60
-0.948551707
3.901208093
39
0.990284089
61
0.304348946
3.901208093
26
0.984379257
62
1.580191833
3.901208093
22
0.99028409
63
2.530964452
3.901208093
49
0.918694359
64
3.901208093
3.901208093
47
0.990146661
表一、64个初始点寻优记录表
为了清楚地展示复合形的寻优过程,本文绘制了复合形法在迭代过程的寻优轨迹,也即最大值的寻找过程。
下图为复合形法中找到最优值时的寻优轨迹图。
图四、全局最优点的寻优轨迹图
4、寻优结果:
由该方法找到的最优解为X=[0.02955566;-0.00589362],此时最大值f(X)=0.99909101。
由此可知,该结果与理论值很接近的,证明了算法的有效性。
五、寻优分析与探讨
1、复合形法
通过上面的求解过程,我们得出并不是任意给定的初始点都能找到全局最优点,也即函数的最大值。
本文通过在定义域内选取大量的初始点来进行优化求解,并且在将区域分成64块时找到了最优点。
但是实际上在这64个初始点中,能找到最优点的概率还是很低的。
当然,通过仿真实验我们还发现随着在定义域内选取的初始点越多,也即分的区域块数越多,找到最优点的概率越大。
2、Matlab工具箱求解
为了验证分区选取初始点的有效性,本文还通过Matlab中自带的优化工具箱,即求解非线性规划的fmincon命令来求取该函数的最大值。
实际上,对于给定函数解析式的非线性函数,该方法比复合形法要更有效。
下表为结合初始点分区选择和非线性规划方法求解该函数最值的过程。
初始点序号
X0
(1)
X0
(2)
过程最优值
1
-3.447309367
-3.447309367
0.646848776
2
-0.75535277
-3.447309367
0.990283844
3
1.176723369
-3.447309367
0.99028409
4
3.926936932
-3.447309367
0.646848776
5
-3.447309367
-0.75535277
0.990283844
6
-0.75535277
-0.75535277
0.999999992
7
1.176723369
-0.75535277
0.999999989
8
3.926936932
-0.75535277
0.990284085
9
-3.447309367
1.176723369
0.99028409
10
-0.75535277
1.176723369
0.999999989
11
1.176723369
1.176723369
0.646848776
12
3.926936932
1.176723369
0.99028409
13
-3.447309367
3.926936932
0.646848776
14
-0.75535277
3.926936932
0.990284085
15
1.176723369
3.926936932
0.99028409
16
3.926936932
3.926936932
0.646848776
表二、16个初始点寻优记录表
由此表可知,本文仅将定义域分成16块即找到3次全局最优点(即表中绿色部分初始点)。
同时,本文也做过仿真实验,当分的区域块数越大,找到全局最优的机率越大。
而对于寻优而言,我们只需找到一次全局最优点即得到该函数的最大值,进一步验证了分区的有效性。
六、总结
本文在理解复合形法的基础上,针对复合形法寻优过程对初值的依赖性很大这一问题,提出将定义域区域进行等分,然后对每小块区域选取一个初始点进行寻优,然后比较这些初值点找到的最优值,把最好的一个最为最终的最优值。
实验证明该方法很有效。
同时,我们也认识到复合形法也存在一定的问题,运算比较慢。
本文通过Matlab求解非线性规划的方法进一步对定义域分区的思想进行验证。
从仿真结果中结果中可以看出,这种方法比复合形法更有效。
七、附录
1、目标函数的三维图形绘制程序
x=-4:
0.1:
4;
y=-4:
0.1:
4;
[XY]=meshgrid(x,y);
Z=0.5-(sin((sqrt(X.^2+Y.^2))).^2-0.5)./(1+0.001*(X.^2+Y.^2)).^2;
mesh(X,Y,Z)
xlabel('X');
xlabel('Y');
xlabel('Z');
2、复合形法求解程序如下:
symsx1x2
f=-(0.5-(sin((sqrt(x1.^2+x2.^2))).^2-0.5)./(1+0.001*(x1.^2+x2.^2)).^2);%目标函数
a=[-4;-4];
b=[4;4];
alpha=1;
var=[x1;x2];
e=1.0e-8;
e1=1.0e-6;
sita=0.5;
M=[];%记录每个初值迭代后最优值的向量
W=[];%记录各个初始值取最优值时的解向量
t=[];%记录各个初始值取最优值时的解向量
D=[];%记录各个初始值取最优值时的迭代次数
m=8;%定义域分成8*8个块数
a1=-4;
b1=4;
z=zeros(1,m);
X0=zeros(2,m*m);
fori=1:
m
z(i)=a1+(b1-a1)/m*(i-1)+rand(1,1)*(b1-a1)/m;
end
fori=1:
m
forj=1:
m
X0(1,i+m*(j-1))=z(i);
end
end
fori=1:
m
W=[Wones(1,m)*z(i)];
end
X0(2,:
)=W;
fori=1:
m*m
[x,d,minf]=childfun(f,X0(:
i),a,b,alpha,sita,var,e,e1);
M=[M,minf];
t=[t,x];
D=[D,d];
end
[maxfindex]=min(M)
x=t(:
index)
d1=D(index)
function[x,d,minf]=childfun(f,x0,a,b,alpha,sita,var,e,e1)
%f为目标函数
%%g为约束条件
%a为xi的下限a=[a1;a2;…;an]
%b为xi的上限b=[b1;b2;…;bn]
%alpha为反射系数o
%var为自变量向量var=[x1;x2;…;xn]
%e为运算中止精度
%e1为反射系数收缩下限
%sita为紧缩系数
aa=a;
bb=b;
n=2;
k=3;
while1
fx=zeros([1,k]);
X=zeros([n,k]);
g=[var-aa;-var+bb];%约束函数g(X)
%产生初值
X(:
1)=x0;
fori=2:
k
r=abs(rand([2,1]));
X(:
i)=aa+r.*(bb-aa);
end
%%寻优
traceFXk=[0];%用来记录每次迭代所产生的最坏点Xh
tracefxc0=[0];%用来记录每次迭代所产生的形心点Xc0
FXk=[];
while1
fori=1:
k
fx(i)=subs(f,var,X(:
i));%计算复合形所有顶点的函数值
end
[FX,IX]=sort(fx);%对复合形所有顶点的函数值从小到大排序
Xsorted=X(:
IX);%得到排序后的函数值所对