无约束最优化方法可变单纯形法simplexNelderMead.docx
- 文档编号:10396148
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:11
- 大小:233.94KB
无约束最优化方法可变单纯形法simplexNelderMead.docx
《无约束最优化方法可变单纯形法simplexNelderMead.docx》由会员分享,可在线阅读,更多相关《无约束最优化方法可变单纯形法simplexNelderMead.docx(11页珍藏版)》请在冰豆网上搜索。
无约束最优化方法可变单纯形法simplexNelderMead
无约束最优化方法可变单纯形法(simplex)Nelder-Mead
无约束最优化方法可变单纯形法(simplex)Nelder-Mead
可爱的馒头
本程序是用C++编写的,从编写的算例来看,应该是没有问题的。
所采用的原理和步骤是参考华南理工大学出版社蒋金山等编写的最优化计算方法第8章第三节可变单纯形法。
欢迎各位批评指正。
#include<>
#include<>
#include<>
inti,j;
doubled[3][100]={{0,1,0,0},{0,0,1,0},{0,0,0,1}},f[100];//d[][]为单纯形的顶点,本算例中未知数个数为3,则顶点个数为4
doubleg,h,l,q,s=1,t=2,u=,v=,y=0;//s为反射系数,t为扩展系数,u为压缩系数,v为允许误差
into,F,r,D,e,lj=0,N=4;//N为顶点的个数,o为最大值点的位置,F为最小值点的位置,r为次大值点的位置
voidfunction1(inte)//求解函数f[e]
{
f[e]=(d[0][e]-3)*(d[0][e]-3)+2*(d[1][e]+2)*(d[1][e]+2)+(d[2][e]-4)*(d[2][e]-4);//函数为f=(x1-3)^2+2(x2+2)^2+(x3-4)^2,求其最小值
}
voidfunction2()
{
while((++lj)<100)//最大迭代次数
{ for(i=0,g=f[i];i { if(g { g=f[i+1];o=i+1; } else if(i==0) o=i; } for(i=0,h=f[i];i { if(h>f[i+1]) { h=f[i+1];F=i+1; } else if(i==0) F=i; } for(i=0,l=f[i];i { if(i==o&&i==0) { l=f[i+1]; r=i+1; continue; } if(l =o) { l=f[i+1];r=i+1; } else if(i==0) r=i; } for(i=0;i { d[i][N]=0; for(j=0;j { if(j! =o) { d[i][N]=d[i][N]+d[i][j]; } } d[i][N]=d[i][N]/(N-1);//平均值 } function1(N); for(i=0;i { d[i][N+1]=d[i][N]+(d[i][N]-d[i][o])*s;//反射 } function1(N+1); if(f[N+1] { for(i=0;i { d[i][N+2]=d[i][N]+(d[i][N+1]-d[i][N])*t;//扩展 } function1(N+2); if(f[N+2] { for(i=0;i { d[i][o]=d[i][N+2]; } f[o]=f[N+2]; y=0; for(i=0;i { y=y+(f[i]-f[N])*(f[i]-f[N]); } y=sqrt(y/(N*); if(y { for(i=0;i { printf("d[%d][%d]=%f",i,F,d[i][F]); printf("\n"); } printf("f[%d]=%f",F,f[F]); break; } else { function2(); break; } } else { for(i=0;i { d[i][o]=d[i][N+1]; } f[o]=f[N+1]; y=0; for(i=0;i { y=y+(f[i]-f[N])*(f[i]-f[N]); } y=sqrt(y/(N*); if(y { for(i=0;i { printf("d[%d][%d]=%f",i,F,d[i][F]); printf("\n"); } printf("f[%d]=%f",F,f[F]); break; } else { function2(); break; } } } if(f[N+1]>=f[F]&&f[N+1]<=f[r]) { for(i=0;i { d[i][o]=d[i][N+1]; } f[o]=f[N+1]; y=0; for(i=0;i { y=y+(f[i]-f[N])*(f[i]-f[N]); } y=sqrt(y/(N*); if(y { for(i=0;i { printf("d[%d][%d]=%f",i,F,d[i][F]); printf("\n"); } printf("f[%d]=%f",F,f[F]); break; } else { function2(); break; } } if(f[N+1]>f[r]) { if(f[N+1]>f[o])//压缩 { D=o; } else { D=N+1; } for(i=0;i { d[i][N+3]=d[i][N]+(d[i][D]-d[i][N])*u; } function1(N+3); if(f[N+3]<=f[D]) { for(i=0;i { d[i][o]=d[i][N+3]; } f[o]=f[N+3]; y=0; for(i=0;i { y=y+(f[i]-f[N])*(f[i]-f[N]); } y=sqrt(y/(N*); if(y { for(i=0;i { printf("d[%d][%d]=%f",i,F,d[i][F]); printf("\n"); } printf("f[%d]=%f",F,f[F]); break; } else { function2(); break; } } else { for(i=0;i { for(j=0;j { d[i][j]=d[i][j]+*(d[i][F]-d[i][j]);//收缩 } } for(i=0;i { function1(i); } y=0; for(i=0;i { y=y+(f[i]-f[N])*(f[i]-f[N]); } y=sqrt(y/(N*); if(y { for(i=0;i { printf("d[%d][%d]=%f",i,F,d[i][F]); printf("\n"); } printf("f[%d]=%f",F,f[F]); break; } else { function2(); break; } } } } } voidmain() { for(i=0;i { function1(i); } function2(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 无约束 优化 方法 可变 单纯 simplexNelderMead