2022年无约束最优化方法可变单纯形法Nelder-Mead知识 .pdf
无约束最优化方法可变单纯形法(simplex )Nelder-Mead 可爱的馒头本程序是用编写的,从编写的算例来看,应该是没有问题的。所采用的原理和步骤是参考华南理工大学出版社蒋金山等编写的最优化计算方法第章第三节可变单纯形法。欢迎各位批评指正。#include #include #include int i,j; double d3100=0,1,0,0,0,0,1,0,0,0,0,1,f100;/d为单纯形的顶点,本算例中未知数个数为3,则顶点个数为 4 double g,h,l,q,s=1,t=2,u=0.5,v=0.0001,y=0;/s为反射系数, t 为扩展系数, u 为压缩系数, v 为允许误差int o,F,r,D,e,lj=0,N=4;/N为顶点的个数, o 为最大值点的位置,F 为最小值点的位置,r 为次大值点的位置void function1(int e)/求解函数 fe fe=(d0e-3)*(d0e-3)+2*(d1e+2)*(d1e+2)+(d2e-4)*(d2e-4);/函数为f=(x1-3)2+2(x2+2)2+(x3-4)2,求其最小值 void function2() while(+lj)100)/最大迭代次数 for(i=0,g=fi;iN-1;i+)/求最大值点 if(gfi+1) g=fi+1;o=i+1; else if(i=0) o=i; for(i=0,h=fi;ifi+1) h=fi+1;F=i+1; else if(i=0) F=i; for(i=0,l=fi;iN-1;i+)/求次大值点名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - if(i=o&i=0) l=fi+1; r=i+1; continue; if(lfi+1&(i+1)!=o) l=fi+1;r=i+1; else if(i=0) r=i; for(i=0;iN-1;i+)/求除最大值点,其余点的形心 diN=0; for(j=0;jN;j+) if(j!=o) diN=diN+dij; diN=diN/(N-1);/平均值 function1(N); for(i=0;iN-1;i+) diN+1=diN+(diN-dio)*s;/反射 function1(N+1); if(fN+1fF) for(i=0;iN-1;i+) diN+2=diN+(diN+1-diN)*t;/扩展 function1(N+2); if(fN+2fN+1) for(i=0;iN-1;i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - dio=diN+2; fo=fN+2; y=0; for(i=0;iN;i+) y=y+(fi-fN)*(fi-fN); y=sqrt(y/(N*1.0); if(yv) for(i=0;iN-1;i+) printf(d%d%d=%f,i,F,diF); printf(n); printf(f%d=%f,F,fF); break; else function2(); break; else for(i=0;iN-1;i+) dio=diN+1; fo=fN+1; y=0; for(i=0;iN;i+) y=y+(fi-fN)*(fi-fN); y=sqrt(y/(N*1.0); if(yv) for(i=0;i=fF&fN+1=fr) for(i=0;iN-1;i+) dio=diN+1; fo=fN+1; y=0; for(i=0;iN;i+) y=y+(fi-fN)*(fi-fN); y=sqrt(y/(N*1.0); if(yv) for(i=0;ifr) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - if(fN+1fo)/ 压缩 D=o; else D=N+1; for(i=0;iN-1;i+) diN+3=diN+(diD-diN)*u; function1(N+3); if(fN+3=fD) for(i=0;iN-1;i+) dio=diN+3; fo=fN+3; y=0; for(i=0;iN;i+) y=y+(fi-fN)*(fi-fN); y=sqrt(y/(N*1.0); if(yv) for(i=0;iN-1;i+) printf(d%d%d=%f,i,F,diF); printf(n); printf(f%d=%f,F,fF); break; else function2(); break; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - for(i=0;iN-1;i+) for(j=0;jN;j+) dij=dij+0.5*(diF-dij);/收缩 for(i=0;iN;i+) function1(i); y=0; for(i=0;iN;i+) y=y+(fi-fN)*(fi-fN); y=sqrt(y/(N*1.0); if(yv) for(i=0;iN-1;i+) printf(d%d%d=%f,i,F,diF); printf(n); printf(f%d=%f,F,fF); break; else function2(); break; void main() for(i=0;iN;i+) function1(i); function2(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -