📄 sy3.m
字号:
%结果为minf=--74.7613,x1=4.1572,x2=8.9101.
n=2;e1=0.001;e2=0.001;A=1.3;k=n+1;% 数据初始化
x=zeros(k,2);
f=zeros(1,k);
ftemp=zeros(1,k);
xmean=zeros(k,2);
xx=zeros(k,2);
xmeanbad=zeros(1,2);%剔除坏点的平均值
xtemp=zeros(1,2);
a=[1,1];b=[9,9];% 设计变量上下限
r=rand(k,2);% 产生随机数
% 形成k个顶点
for i=1:k
for j=1:n
x(i,j)=a(j)+r(i,j)*(b(j)-a(j));
end
if i==1; % 判断第1个顶点
while(x(1,1)<0 | x(1,2)<0 | 10*(x(1,1)+x(1,2))-x(1,1)*x(1,1)-x(1,2)*x(1,2)-34<0 | x(1,1)*x(1,1)+x(1,2)*x(1,2)-25<0)
% 第1个顶点不是可行点,从新生成
r(1,:)=rand(2);
x(i,1)=a(1)+r(i,1)*(b(1)-a(1));
x(i,2)=a(2)+r(i,2)*(b(2)-a(2));
end
end
end
% 形成复合形
s=1;
while s ~=k
for i=1:s
xx(i,:)=x(i,:);
end
xmean(s,:)=mean(xx);
while (x(s+1,1)<0 | x(s+1,2)<0 | 10*(x(s+1,1)+x(s+1,2))-x(s+1,1)*x(s+1,1)-x(s+1,2)*x(s+1,2)-34<0 | x(s+1,1)*x(s+1,1)+x(s+1,2)*x(s+1,2)-25<0)
% 第s+1个顶点不是可行点,从新生成
x(s+1,1)=xmean(s,1)+0.5*(x(s+1,1)-xmean(s,1));
x(s+1,2)=xmean(s,2)+0.5*(x(s+1,2)-xmean(s,2));
end
s=s+1;
end
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
e=0; %停机判断值
for i=1:k
e=(fmean-f(i))*(fmean-f(i))+e;
end
e=sqrt(e/k);
%-------------------------------------------------------------------------------------------------------------------
while e> e1 %停机判断
% 寻找映像点
Max=f(1);
Min=f(1);
bad=1;
good=1;
for i=1:k
% 寻找坏点
if Max<f(i)
Max=f(i);
bad=i;
end
% 寻找好点
if Min>f(i)
Min=f(i);
good=i;
end
end
xx=x;
xx(bad,:)=0;%剔除坏点
xmeanbad(1,1)=sum(xx(:,1))/(k-1);
xmeanbad(1,2)=sum(xx(:,2))/(k-1);
if (xmeanbad(1,1)<0 | xmeanbad(1,2)<0 | 10*(xmeanbad(1,1)+xmeanbad(1,2))-xmeanbad(1,1)*xmeanbad(1,1)-xmeanbad(1,2)*xmeanbad(1,2)-34<0 | xmeanbad(1,1)*xmeanbad(1,1)+xmeanbad(1,2)*xmeanbad(1,2)-25<0)
%xmeanbad不在可行域
a=x(good,:);
b=xmeanbad;
%-------------------------------------------------------------------------------------------------------------------
% 产生随机数
r=rand(k,2);
% 形成k个顶点
for i=1:k
for j=1:n
x(i,j)=a(j)+r(i,j)*(b(j)-a(j));
end
% 判断第1个顶点
if i==1;
while(x(1,1)<0 | x(1,2)<0 | 10*(x(1,1)+x(1,2))-x(1,1)*x(1,1)-x(1,2)*x(1,2)-34<0 | x(1,1)*x(1,1)+x(1,2)*x(1,2)-25<0)
% 第1个顶点不是可行点,从新生成
r(1,:)=rand(2);
x(i,1)=a(1)+r(i,1)*(b(1)-a(1));
x(i,2)=a(2)+r(i,2)*(b(2)-a(2));
end
end
end
% 形成复合形
s=1;
while s~=k
for i=1:s
xx(i,:)=x(i,:);
end
xmean(s,:)=mean(xx);
while (x(s+1,1)<0 | x(s+1,2)<0 | 10*(x(s+1,1)+x(s+1,2))-x(s+1,1)*x(s+1,1)-x(s+1,2)*x(s+1,2)-34<0 | x(s+1,1)*x(s+1,1)+x(s+1,2)*x(s+1,2)-25<0)
% 第s+1个顶点不是可行点,从新生成
x(s+1,1)=xmean(s,1)+0.5*(x(s+1,1)-xmean(s,1));
x(s+1,2)=xmean(s,2)+0.5*(x(s+1,2)-xmean(s,2));
end
s=s+1;
end
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
e=0; %停机判断值
for i=1:k
e=(fmean-f(i))*(fmean-f(i))+e;
end
e=sqrt(e/k);
%-------------------------------------------------------------------------------------------------------------------
else
%-------------------------------------------------------------------------------------------------------------------
A=1.3;
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0)
A=A/2;
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
end
fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
if fa<Max
x(bad,:)=xtemp;
Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
xmean(s,:)=mean(x);
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
e=0; %停机判断值
for i=1:k
e=(fmean-f(i))*(fmean-f(i))+e;
end
e=sqrt(e/k);
e
else
%-------------------------------------------------------------------------------------------------------------------
while A<=e2
secondMax=f(good);
second=good;
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
for i=1:k
% 寻找坏点
if Max<f(i)
Max=f(i);
bad=i;
end
% 寻找好点
if Min>f(i)
Min=f(i);
good=i;
end
end
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
for i=1:k
if (f(i)<Max & f(i)>Min)
secondMax=f(i);
second=i;
end
end
secondMax
x(bad,:)=x(second,:);
Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
xx=x;
xx(bad,:)=0;%剔除坏点
xmeanbad(1,1)=sum(xx(:,1))/(k-1);
xmeanbad(1,2)=sum(xx(:,2))/(k-1);
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0)
A=A/2;
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
end
fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
fa
Max
if fa<Max
x(bad,:)=xtemp;
Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
xmean(s,:)=mean(x);
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
e=0; %停机判断值
for i=1:k
e=(fmean-f(i))*(fmean-f(i))+e;
end
e=sprt(e/k);
e
break%跳出
end
end
%-------------------------------------------------------------------------------------------------------------------
while A>e2
A
A=A/2;
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0)
A=A/2;
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
end
fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
fa
Max
if fa<Max
x(bad,:)=xtemp;
Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
xmean(s,:)=mean(x);
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
e=0; %停机判断值
for i=1:k
e=(fmean-f(i))*(fmean-f(i))+e;
end
e=sprt(e/k);
e
break%跳出
elseif A<=e2
%-------------------------------------------------------------------------------------------------------------------
while A<=e2
A
secondMax=f(good);
second=good;
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
for i=1:k
% 寻找坏点
if Max<f(i)
Max=f(i);
bad=i;
end
% 寻找好点
if Min>f(i)
Min=f(i);
good=i;
end
end
for i=1:k
if ( f(i)<Max & f(i)>Min )
secondMax=f(i);
second=i;
end
end
f
second
secondMax
x(bad,:)=x(second,:);
Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
xx=x;
xx(bad,:)=0;%剔除坏点
xmeanbad(1,1)=sum(xx(:,1))/(k-1);
xmeanbad(1,2)=sum(xx(:,2))/(k-1);
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0)
A=A/2;
xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
end
fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
fa
Max
if fa<Max
x(bad,:)=xtemp;
Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
xmean(s,:)=mean(x);
for i=1:k
f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
end
fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
e=0; %停机判断值
for i=1:k
e=(fmean-f(i))*(fmean-f(i))+e;
end
e=sqrt(e/k);
e
flag=1;
break%第一级跳出
end
end
%-------------------------------------------------------------------------------------------------------------------
end
if flag==1
break%第二级跳出
end
end
end
%-------------------------------------------------------------------------------------------------------------------
end
flag=0;
end
%-------------------------------------------------------------------------------------------------------------------
xmean(s,:)
fmean
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -