《中科大《優(yōu)化設(shè)計》課程大作業(yè)之約束優(yōu)化實驗報告》由會員分享,可在線閱讀,更多相關(guān)《中科大《優(yōu)化設(shè)計》課程大作業(yè)之約束優(yōu)化實驗報告(8頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、精選優(yōu)質(zhì)文檔-----傾情為你奉上
約束優(yōu)化設(shè)計實驗報告
力學(xué)系
型號:聯(lián)想y470
CPU:i5-2450M
內(nèi)存:2GB
系統(tǒng):win7-64位
求解問題:
如上是以下三個約束方法共同需要求解的問題,預(yù)估結(jié)果:在(x1,x2,x3)≈(23,13,12)點附近存在極值。其中,每個方法對應(yīng)的初始條件分別為:
(1)隨機試驗法
設(shè)計變量范圍:
隨機試驗點數(shù):N=1000
精度:eps=0.001
(2)隨機方向法
初始點:x0=(25,15,5)
初始步長:a0=0.5
精度:eps=0.001
(3)線性規(guī)劃單純形法
初始復(fù)合形:X=[20 2
2、3 25 30;10 13 15 20;10 9 5 0]
頂點個數(shù):n=4
精度:eps=0.01
計算結(jié)果:
約束方法
所需時間
迭代次數(shù)
極值點
極值
隨機試驗法
28.23
0
(22.63,12.63,12.06)
3445.50
隨機方向法
0.65
49
(22.67,12.67,11.98)
3441.99
線性規(guī)劃單純形法
6.23
5
(22.59,12.59,12.12)
3445.61
程序說明:主程序為main,運行main后按提示即可得到相應(yīng)約束方法的求解結(jié)果。
程序如下:
1、 主程序
clear;
3、global kk;
kk=0;
disp('1.隨機試驗法');
disp('2.隨機方向法');
disp('3.線性規(guī)劃單純形法');
while 1
n0=input('請輸入上面所想選擇約束優(yōu)化方法的編號(1、2、3):');
if n0==1||n0==2||n0==3
break;
end
disp('此次輸入無效.');
end
disp(' ');
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
[xx,yy]=fmins(n0);
fprintf('迭代次
4、數(shù)為: %8.0f\n', kk);
disp('所求極值點的坐標(biāo)向量為:');
fprintf(' %16.5f\n', xx);
fprintf('所求函數(shù)的極值為: %16.5f\n', yy);
2、 調(diào)用函數(shù)
function [xx,yy]=fmins(n0)
if n0==1
tic;[xx,yy]=suijishiyan();toc;
elseif n0==2
tic;[xx,yy]=suijifangxiang();toc;
elseif n0==3
tic;[xx,yy]=danchun
5、xing();toc;
end
end
3、 單純形法
function [xx,yy]=danchunxing()
clear;
global kk;
syms a b c;
f=-a*b*c;
g=[-a+2*b+2*c>=0;a+2*b+2*c<=72;abs(a-b-10)<=1e-3;b>=10;b<=20];
X=[20 23 25 30;10 13 15 20;10 9 5 0];
alpha=1.3;
sita=0.5;
gama=1;
beta=0.7;
var=[a;b;c];
eps=0.001;
N=size(X);
n=N(2)
6、;
FX=zeros(1,n);
while 1
for i=1:n
FX(i)=double(subs(f,var,X(:,i)));
end
[XS,IX]=sort(FX);
Xsorted=X(:,IX);
px=sum(Xsorted(:,1:(n-1)),2)/(n-1);
Fpx=double(subs(f,var,px));
SumF=0;
for i=1:n
SumF=SumF+(FX(IX(i))-Fpx)^2;
end
7、 SumF=sqrt(SumF/(n-1));
if SumF<=eps
xx=Xsorted(:,1);
break;
else
bcon_1=1;
cof_alpha=alpha;
while bcon_1
x2=px+cof_alpha*(px-Xsorted(:,n));
gx2=double(subs(g,var,x2));
if min(gx2)>0
8、 bcon_1=0;
else
cof_alpha=0.7*(cof_alpha);
end
end
fx2=double(subs(f,var,x2));
if fx2
9、 gx3=double(subs(g,var,x3));
fx3=double(subs(f,var,x3));
if min(gx3)>0
bcon_2=0;
if fx3
10、 end
else
bcon_2=0;
count=3;
end
end
if count==1
Xsorted(:,n)=x3;
X=Xsorted;
continue
else
Xsorted(:,n)=x2
11、;
X=Xsorted;
continue
end
else
if fx2
12、
cof_beta=beta;
bcon_3=1;
while bcon_3<4
x4=Xsorted(:,n)+cof_beta*(px-Xsorted(:,n));
gx4=double(subs(g,var,x4));
if min(gx4)>0
bcon_
13、3=5;
else
cof_beta=cof_beta/2;
bcon_3=bcon_3+1;
end
end
if min(gx4)>0
fx4=double(subs(f,var,x4));
FN
14、new=double(subs(f,var,Xsorted(:,n)));
if fx4
15、 for i=1:n
Xsorted(:,i)=x0+sita*(Xsorted(:,i)-x0);
end
end
else
x0=Xsorted(:,1);
for i=1:n
Xsorted(:,i)=x0+si
16、ta*(Xsorted(:,i)-x0);
X=Xsorted;
continue
end
end
else
x0=Xsorted(:,1);
for i=1:n
Xsorted(:,i)=x0+sita*(Xsorted(
17、:,i)-x0);
X=Xsorted;
continue
end
end
end
end
end
X=Xsorted;
kk=kk+1;
end
yy=-double(subs(f,var,xx));
end
4、 隨機方向法
function [xx,yy]=suijifangxiang()
clear;
global kk;
18、
x0 = [25;15;5];
n = 3;
eps = 0.001;
a0 = 0.5;
k = 10000;
f0 = -x0(1)*x0(2)*x0(3);
fl = -x0(1)*x0(2)*x0(3);
i = 1;
while 1
a = a0;
r = -1 + 2*rand(n,k);
for j = 1:k
ss=(sum(abs(r(:,j))))^0.5;
e = r(:,j)./ss;
x = x0 + a*e;
if (-x(1)+2*x(2)
19、+2*x(3)>=0)&& (x(1)+2*x(2)+2*x(3)<=72)&&(abs(x(1)-x(2)-10)<=1e-3)&&(x(2)>=10)&&(x(2)<=20)
f =-x(1)*x(2)*x(3);
if f < fl
fl = f;
d = e;
xl = x;
end
end
end
while 1
x = xl;
a
20、= 1.3*a;
x = x+a*d;
if (-x(1)+2*x(2)+2*x(3)>=0)&& (x(1)+2*x(2)+2*x(3)<=72)&&(abs(x(1)-x(2)-10)<=1e-3)&&(x(2)>=10)&&(x(2)<=20)
f =-x(1)*x(2)*x(3);
if f < fl
fl = f;
else
break
end
else
21、 break
end
kk=kk+1;
end
for b = 1:50
x = x - a*d;
a = 0.7*a;
x = x + a*d;
if (-x(1)+2*x(2)+2*x(3)>=0)&& (x(1)+2*x(2)+2*x(3)<=72)&&(abs(x(1)-x(2)-10)<=1e-3)&&(x(2)>=10)&&(x(2)<=20)
f =-x(1)*x(2)*x(3);
22、 if f < fl
fl = f;
break
end
end
end
epsl = abs((f0-fl)/f0);
if epsl < eps&&x(1)<23
break
else
i = i+1;
x0 = x;
f0 = f;
fl = f;
end
kk=kk+1;
end
xx = x;
yy =-f;
e
23、nd
5、 隨機試驗法
function [xx,yy]=suijishiyan()
format long
N=1000;
x1=[];x2=[];x3=[];
zmax=-inf;
x10=unifrnd(20,30,N,1);
x20=unifrnd(10,20,N,1);
x30=unifrnd(-10,16,N,1);
for i=1:N
for j=1:N
for k=1:N
if (-x10(i)+2*x20(j)+2*x30(k)>=0)&& (x10(i)+2*x20(j)+2*x30(k)<=72)&&(abs(x10(i)-x20(j)-10)<=1e-3)
z=x10(i)*x20(j)*x30(k);
if zmax