声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2675|回复: 1

[经典算法] 求助: 各位高手朋友谁能给我一个共轭梯度算法解决最优化的算法啊?

[复制链接]
发表于 2005-11-20 22:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
求助: 各位高手朋友谁能给我一个共轭梯度算法解决最优化的算法啊?<BR>
回复
分享到:

使用道具 举报

发表于 2005-11-21 02:03 | 显示全部楼层

回复:(laoqiao)求助: 各位高手朋友谁能给我一个共轭...

最优化-无约束共轭梯度法程序(C++)写的,网上的一个程序<BR><BR>/////////////////////////////////////////<BR>/////vector.h头文件/////<BR>/////定义向量及其基本运算/////<BR>/////////////////////////////////////////<BR><BR>#include<BR>#defineMAXLENGTH10<BR><BR>//向量定义<BR>typedefstruct{<BR>inttag;//行列向量标志。行向量为0,列向量为1。<BR>intdimension;//向量的维数<BR>doubleelem[MAXLENGTH];//向量的元素<BR>}vector;<BR><BR>vectorvecCreat(inttag,intn){<BR>//建立维数为n的向量<BR>vectorx;<BR>x.tag=tag;<BR>x.dimension=n;<BR>for(inti=0;i<BR>#include"vector.h"<BR>#defineSIZE10<BR>#defineMAX1e300<BR><BR>doublemin(doublea,doubleb){<BR>//求两个数最小<BR>returna共轭梯度法,H终止准则/////<BR>///////////////////////////////////////////////////<BR>#include"restrict.h"<BR><BR>vectorlineSearch(vectorx,vectorp,doublet){<BR>//从点x沿直线p方向对目标函数f(x)作直线搜索得到极小点x2,t为初始步长。<BR>vectorx2;<BR>doublel=0.1,n=0.4;//条件1和2的参数<BR>doublea=0,b=MAX;//区间<BR>doublef1=0,f2=0,g1=0,g2=0;<BR>inti=0;//迭代次数<BR>do{<BR>if(f2-f1&gt;l*t*g1){b=t;t=(a+b)/2;}//改变b,t循环<BR>do{<BR>if(g2共轭梯度法.<BR>//给定初始点xx.对vecFun函数求得最优点x和最优解f,分别用minx和minf返回<BR>intk=0,j=0;//迭代次数,j为总迭代次数<BR>doublec=10e-1;//终止限c<BR>intn=xx.dimension;//问题的维数<BR>doublef0,f,a;//函数值f(x),a为使p方向向量共轭的系数<BR>vectorg0,g;//梯度g0,g<BR>vectorp0,p;//搜索方向P0,p<BR>vectorx,x0;//最优点和初始点<BR>doublet=1;//直线搜索的初始步长=1<BR>x=xx;//x0<BR>f=vecFun(x);//f0=f(x0)<BR>g=vecGrad(vecFun,x);//g0<BR>p0=numMultiply(-1,g);//p0=-g0,初始搜索方向为负梯度方向<BR>do{<BR>x0=x;f0=f;g0=g;<BR>x=lineSearch(x0,p0,t);//从点x出发,沿p方向作直线搜索<BR>f=vecFun(x);//f=f(x)<BR>g=vecGrad(vecFun,x);//g=g(x)<BR>if(Himmulblau(x0,x,f0,f)==1){//满足H终止准则,返回最优点及最优解。<BR>cout&lt;&lt;"*总迭代次数:"&lt;优化方法***************"&lt;共轭梯度法)***"&lt;共轭梯度法求无约束最小化问题----------------"&lt;&lt;<BR>endl;<BR>cout&lt;&lt;"步骤:"&lt;<ENDL;<BR>cout&lt;&lt;"◆1.输入f(x)及其导数.(参考function.h文件说明)"&lt;<ENDL;<BR>cout&lt;&lt;"-----确认是否已输入&lt;目标函数&gt;及其&lt;导数&gt;?(Y/N)";<BR>cin&gt;&gt;key;<BR>if(key=='N'||key=='n')return;<BR>elseif(key=='Y'||key=='y'){<BR>vectorx0;//起始点<BR>intm;<BR>cout&lt;&lt;"◆2.起始点X0初始化"&lt;<ENDL<<"-----请输入X0的维数:";<br>cin&gt;&gt;m;<BR>x0=vecCreat(1,m);<BR>vectorminx;//求得的极小点<BR>doubleminf;//求得的极小值<BR>Fletcher_Reeves(x0,minx,minf);<BR>cout&lt;&lt;"◆最优解及最优值:";<BR>showPoint(minx,minf);<BR>}<BR>}<BR><BR>voidsub2(){<BR>charkey;<BR>cout&lt;&lt;"------------------H乘子法求约束最小化问题-----------------"&lt;<ENDL<BR>;<BR>cout&lt;&lt;"步骤:"&lt;<ENDL;<BR>cout&lt;&lt;"◆1.输入f(x)及其导数.(参考function.h文件说明)"&lt;<ENDL;<BR>cout&lt;&lt;"-----确认是否已输入&lt;目标函数及导数&gt;和&lt;约束条件&gt;?(Y/N)";<BR>cin&gt;&gt;key;<BR>if(key=='N'||key=='n')return;<BR>elseif(key=='Y'||key=='y'){<BR>vectorx0;//起始点<BR>intm;<BR>cout&lt;&lt;"◆2.起始点X0初始化"&lt;<ENDL<<"-----请输入X0的维数:";<br>cin&gt;&gt;m;<BR>x0=vecCreat(1,m);<BR>vectorminx;//求得的极小点<BR>doubleminf;//求得的极小值<BR>Hesternes(x0,minx,minf);<BR>showPoint(minx,minf);<BR>}<BR>}<BR><BR>voidmain(){<BR>intmark=1;<BR>while(mark){<BR>printSelect();<BR>intsel;<BR>cin&gt;&gt;sel;<BR>switch(sel){<BR>case1:<BR>sub1();<BR>break;<BR>case2:<BR>sub2();<BR>break;<BR>case3:<BR>mark=0;<BR>break;<BR>};<BR>}<BR>}</ENDL<<"-----请输入X0的维数:";<br></ENDL<<"-----请输入X0的维数:";<br>
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-4-30 22:21 , Processed in 0.054580 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表