📄 matlabthebest.txt
字号:
function [MinX,MinY,k,adj]=Find_MinY_SM(X0,A,k_max,adj_max)
% MinX,MinY是求得的极值点,k_max主计算循环的上限,adj收敛准则,收敛容差adj_max;
% X0是需要传递的单纯形初点,可以是N维向量,A是边长;
% adj是收敛判定值,程序中为了避免死循环定了k循环最大上限,Alfa、Beta、AL采用常用的系数
% 用户可以重新改写,目标函数是[z]=objectfunction(x),可以是任意n维的函数;
% Y_med,X_med计算中使用的过渡变量,X_n2,Y_n2是单纯形形心,X_n2,X_n3,X_n4,X_n5分别是
% 寻优过程中的探测点,可参考相关书籍;
N =length(X0);
MinX=zeros(1,N);
MinY=0.0;
Alfa=1.0;
Beta=0.5;
AL=2.0;
Y_n2=0.0;
Y_n3=0.0;
Y_n4=0.0;
Y_n5=0.0;
adj=1.0;
k=0.0;
X_n2=zeros(1,N);
X_n3=zeros(1,N);
X_n4=zeros(1,N);
X_n5=zeros(1,N);
Y_med=0.0;
X_med=zeros(1,N);
X_xu=zeros(N+1,N);
Y_xu=zeros(1,N+1);
X_chu=zeros(N+1,N);
Y_chu=zeros(1,N+1);
% 初始化并组建单纯形(N+1)个顶点,A是边长,N是目标函数的维度,
% X_chu是初始化单纯形各顶点坐标值,以距阵形式表示,X_xu是降序排列的顶点坐标;
P=A*(sqrt(N+1)+N-1)/(N*sqrt(2.));
Q=A*(sqrt(N+1)-1)/(N*sqrt(2.));
% 给顶点赋初数值;
X_chu(1,: )=X0;
for i=2:N+1
for j=1:N
if(j==i-1)
X_chu(i,j)=X0(j)+P;
else
X_chu(i,j)=X0(j)+Q;
end
end
end
for i=1:N+1
[Y_chu(i)]=objectfunction(X_chu(i,: ));
end
% 冒泡算法求顶点的目标函数最坏点、次坏点和最好点;变量X_xu,Y_xu是
% 降序后的单纯形顶点值; 同时避免和正则单纯形的空间有序顶点X_chu,Y_chu混淆!
X_xu=X_chu;
Y_xu=Y_chu;
i=N+1;
while((i>=2)&&(i<=(N+1)))
i=i-1;
for j=1:i
if((Y_xu(j))<(Y_xu(j+1)))
Y_med=Y_xu(j);
X_med=X_xu(j,: );
Y_xu(j)=Y_xu(j+1);
X_xu(j,: )=X_xu(j+1,: );
Y_xu(j+1)= Y_med;
X_xu(j+1,: )=X_med;
end
end
end
%~~~~~~~~~~~~~~~~
% 进入主计算阶段
%~~~~~~~~~~~~~~~~
while((k<k_max)&&(adj>=adj_max))
%第一步,开始探测优化点:
k=k+1;
%开始求除最坏点外各顶点的形心,X_n2表示形心坐标:
%对形心坐标变量清零,每个循环进行一次!
X_n2=zeros(1,N);
%计算形心坐标!
for i=1:N
for j=2:N+1
X_n2(i)=X_n2(i)+X_xu(j,i)/N;
end
end
%计算收敛准则adj的数值
[Y_n2]=objectfunction(X_n2);
adj=0.0;
for i=1:N+1
adj=adj+(Y_n2-Y_xu(i))^2;
end
adj=sqrt(adj/(N+1));
% ~~~~~~开始反射、扩张、缩小和收缩过程~~~~~~~
%反射分析从这里开始:
X_n3=X_n2+Alfa*(X_n2-X_xu(1,: ));
[Y_n3]=objectfunction(X_n3);
%反射点小于单纯形最小值,扩张分析
if(Y_n3<=Y_xu(N+1))
X_n4=X_n2+AL*(X_n3-X_n2);
[Y_n4]=objectfunction(X_n4);
if (Y_n4 <= Y_xu(N+1))
X_xu(1,: )=X_n4;
else
X_xu(1,: )=X_n3;
end
end
%反射点大于单纯形最小值但是小于次差点,更换点 ,准备返回第一步,继续反射!
if((Y_n3>Y_xu(N+1))&&(Y_n3<Y_xu(2)))
X_xu(1,: )=X_n3;
end
%反射点大于单纯形次差点但是小于最坏点,收缩分析!
if ((Y_n3>Y_xu(2))&&(Y_n3<Y_xu(1)))
X_n5=X_n2+Beta*(X_n3-X_n2);
[Y_n5]=objectfunction(X_n5);
%判断Yn5数值或叠代或缩小,然后准备返回第一步,继续反射
if (Y_n5<Y_xu(1))
%叠代
X_xu(1,: )=X_n5;
else
%缩小
for i=1:N+1
X_xu(i,: )=X_xu(N+1,: )+0.5*(X_xu(i,: )-X_xu(N+1,: ));
end
end
end
%反射点大于单纯形最坏点,收缩分析!
if (Y_n3>Y_xu(1))
% 收缩
X_n5=X_n2+Beta*(X_xu(1,: )-X_n2);
[Y_n5]=objectfunction(X_n5);
%判断Yn5数值或叠代或缩小,然后准备返回第一步,继续反射
if (Y_n5<Y_xu(1))
X_xu(1,: )=X_n5;
else
%缩小
for i=1:N+1
X_xu(i,: )=X_xu(N+1,: )+0.5*(X_xu(i,: )-X_xu(N+1,: ));
end
end
end
%~~~~~~~反射、扩张、缩小和收缩过程程结束~~~~~~~
%对替换了顶点的单纯形排序,仅仅替换了一个顶点,所以排序一次就好
[Y_xu(1)]=objectfunction(X_xu(1,: ));
for j=1:N
if((Y_xu(j))<(Y_xu(j+1)))
Y_med=Y_xu(j);
X_med=X_xu(j,: );
Y_xu(j)=Y_xu(j+1);
X_xu(j,: )=X_xu(j+1,: );
Y_xu(j+1)= Y_med;
X_xu(j+1,: )=X_med;
end
end
end
%~~~~~~~~~~~~~~~~
% 主计算阶段结束
%~~~~~~~~~~~~~~~~
MinX=X_n2;
MinY=Y_n2;
%% 目标函数[z]=objectfunction(x)
%% 例如:
%% function [z]=objectfunction(x)
%% z=0.0;
%% z=x(1)*x(1)+2*x(2)*x(2)-4*x(1)-2*x(1)*x(2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -