进退法、0.618法、Powell法、罚函数法的程序设计,急!!
<p>RT,《最优化方法》的题目<br/>涉及进退法、0.618法、Powell法、罚函数法的程序设计<br/>可用Matlab或C程序语言编程,需包含这四类算法。<br/>实例已给出如下,编一例类似程序。实在不行,可在此实例上适当修改。<br/>有感兴趣的,完成后可发到本人邮箱:<a href="mailto:aleiho@163.com">aleiho@163.com</a><br/>见回复确认后,立即加分结贴。<br/>p.s.:谢谢,急需。19日16时之前。</p><p><br/>一、进退法、0.618法、Powell法、罚函数法的Matlab程序设计<br/>罚函数法(通用)<br/>function y=ff(x,k)<br/>y=-17.86*0.42*x(1)/(0.8+0.42*x(1))*(1-exp(-2*(0.8+0.42*x(1))/3))*exp(-1.6)*x(2)-22.99*x(1)/(0.8+x(1))*(1-exp(-2*(0.8+x(1))/3))*x(3)+k*(x(2)-(1.22*10^2*(9517.8*exp(-1.6-2*0.42*x(1)/3)*x(2)+19035.6*exp(-2*x(1)/3)*x(3)))/(1.22*10^2+9517.8*exp(-1.6-2*0.42*x(1)/3)*x(2)+19035.6*exp(-2*x(1)/3)*x(3)))^2+k*(x(3)-exp(-0.8-2*x(1)/3)*x(3)-exp(-2.4-2*0.42*x(1)/3)*x(2))^2;<br/>% 主函数,参数包括未知数的个数n,惩罚因子q,惩罚因子增长系数k,初值x0,以及允许的误差r<br/>function G=FHS(x0,q,k,n,r,h,a) <br/>l=1;<br/>while (l)<br/> x=powell(x0,n,q,r(1),h,a); %调用powell函数<br/> g(1)=ff1(x),g(2)=ff2(x) . . . g(p)=ffp(x); %调用不等式约束函数,将其值<br/> %存入数组g<br/> h(1)=hh1(x),h(2)=hh2(x) . . . h(t)=hht(x); %调用等式约束函数,将其值<br/>%存入数组h<br/> for i=1:p<br/> if g(i)<r<br/> for j=1:t<br/> if abs(h(j))<r(2)<br/> continue;<br/> else<br/> break;<br/> end<br/> end<br/> else<br/> break;<br/> end<br/> end<br/> if (i==p)&(j==t) %如果所有约束条件的值都在允许的范围内就结束<br/>%搜索,否则加大惩罚力度继续搜索<br/> l=0;<br/> else<br/> x0=x;<br/> q=k*q;<br/> end<br/>end<br/> G=x <br/>%powell算法,用于寻找无约束最优值点<br/> function powel=powell(x0,n,q,r,h,a) <br/> d=eye(n); %n个线性无关的初始搜索方向<br/> k=1;<br/> kk=1;<br/> xx(1,1:n)=x0;<br/> while (kk)<br/> y(1,1:n)=xx(k,1:n);<br/> for j=1:n<br/> s(j)=HJ(y(j,1:n),d(j,1:n),q); %调用0.618算法<br/> y(j+1,1:n)=y(j,1:n)+s(j).*d(j,1:n);<br/> end<br/> d(n+1,1:n)=y(n+1,1:n)-y(1,1:n);<br/> if (norm(d(n+1,1:n),2)<r)<br/> kk=0;<br/> break;<br/> else<br/> ww=0;<br/> m=1;<br/> for i=1:n<br/> gg=ff(y(i,1:n),q)-ff(y(i+1,1:n),q);<br/> if (gg>=ww)<br/> m=i;<br/> end<br/> end<br/> cha=ff(y(1,1:n),q)-2*ff(y(n+1,1:n),q)+ff(2*y(n+1,1:n)-y(1,1:n),q);<br/> cha1=2*(ff(y(m,1:n),q)-ff(y(m+1,1:n),q));<br/> if (cha<cha1)<br/> s(n+1)=HJ(y(n+1,1:n),h,a,d(n+1,1:n),q)<br/> xx(k+1,1:2)=y(n+1,1:n)+s(n+1).*d(n+1,1:n)<br/> for j=m+1:n<br/> d(j,1:n)=d(j+1,1:n);<br/> end<br/> k=k+1;<br/> else<br/> xx(k+1,1:n)=y(n+1,1:n);<br/> k=k+1;<br/> end<br/> end<br/> end<br/> powel=y(n+1,1:n)</p><p>function w=HJ(x0,h,d,dd,q) %0.618算法<br/> =JTF(x0,h,d,dd,q); %调用进退法算法,确定范围<br/> r=0.618;<br/> r1=a+(1-r)*(b-a);<br/> r2=a+r*(b-a);<br/> y1=ff(x0+r1.*dd,q);<br/> y2=ff(x0+r2.*dd,q);<br/> k=1;<br/> while (abs(r1-r2)>=0.1)<br/> if y1<y2<br/> b=r2;<br/> r2=r1;<br/> y2=y1;<br/> r1=a+(1-r)*(b-a);<br/> y1=ff(x0+r1.*dd,q);<br/> else<br/> a=r1;<br/> r1=r2;<br/> y1=y2;<br/> r2=a+r*(b-a);<br/> y2=ff(x0+r2.*dd,q);<br/> end<br/> end<br/> w=(r1+r2)/2<br/>%进退法<br/>function =JTF(x0,h,d,dd,q) <br/> r0=0;<br/> y0=ff(x0+r0.*dd,q);<br/> k=0;<br/> l=1;<br/> while (l)<br/> r1=r0+h;<br/> y1=ff(x0+r1.*dd,q);<br/> if y1<y0<br/> h=d*h;<br/> r=r0;<br/> r0=r1;<br/> y0=y1;<br/> else<br/> if k==0;<br/> h=-h;<br/> r=r0;<br/> else<br/> l=0;<br/> break;<br/> end <br/> end <br/> k=k+1;<br/> end<br/> a=min(r,r1);<br/> b=max(r,r1);<br/>二、进退法、0.618法的C语言程序设计<br/>例1 设f(x)=x^2-2*x+4 ,试确定初始搜索区间,并输出迭代次数</p><p>main()<br/>{int n=0;<br/>float t,h,a,b,c,d,f1,f2;<br/>printf(“t,h:”);<br/>scanf(“%f,%f”,&t,&h);<br/>f1=t*t-2*t+4;<br/>if((t+h)*(t+h)-2*(t+h)+4<=f1)<br/>{c=t+h;f2=c*c-2*c+4;}<br/>else<br/>{h=-h;c=t+h; f2=c*c-2*c+4;}<br/>while(f2<=f1)<br/>{h=2*h;d=t;t=c;f1=f2;c=t+h; f2=c*c-2*c+4;n=n+1;}<br/>if(c<=d)<br/>{a=c;b=d;}<br/>else<br/>{a=d;b=c;}<br/>printf(“=[%.2f,%f]\n”,a,b);<br/>printf(“n=%d\n”,n);<br/>}<br/>运行情况如下:<br/>(1)t,h:0,0.05 <br/> =<br/> n=4<br/>(2) t,h:-1.0,0.02 <br/> =<br/> n=7<br/>(3)t,h:-100,0.01 <br/> =[-59.05,63.83]<br/> n=13<br/>例2 用0.618法求f(x)=8x^3-2*x^2-7*x+3 的局部最优解.允许误差ε=0.0001 ,初始点设为x0=0 ,初始步长h=1 .</p><p>#include“math.h”<br/>float f(x)<br/>float x;<br/>float y;<br/>{y=((8.0*x-2.0)*x-7.0)*x+3.0;<br/>return(y);<br/>}<br/>main()<br/>{int n=0;<br/>float t,h,a,b,c,d,x0,f0,f1,f2,fc,fd;<br/>printf(“t,h:”);<br/>scanf(“%f,%f”,&t,&h);<br/>f1=f(t);<br/>if (f(t+h)<=f1)c=t+h;<br/>else{h=-h;c=t+h;}<br/>f2=f(c);<br/>while(f2<=f1)<br/>{d=t;t=c;f1=f2;c=t+h;f2=f(c);}<br/>if(c<=d){a=c;b=d;}<br/>else{a=d;b=c;}<br/>c=a+0.382*(b-a);fc=f(c);d=a+0.618*(b-a);fd=f(d);<br/>do<br/>{if (fc>=fd) {a=c;c=d;fc=fd;d=a+0.618*(b-a); fd=f(d);}<br/>else {b=d;d=c;fd=fc;c=a+0.382*(b-a);fc=f(c);}<br/>n++;<br/>}<br/>while (b-a>0.0001);<br/>x0=(a+b)/2.0;f0=f(x0);<br/>pintf(“n=%d,x0=%7.4f,f0=%7.4f\n”,n,x0,f0);<br/>}<br/>运行情况如下:<br/>t,h:0,1.0 <br/>n=21,xo=0.6298,f0=-0.2034.</p><p><br/> </p> 呵呵~~好长... 函数里面的参数的顺序是不不对啊,需要从新调整 <p>不太会啊,等待牛人</p> 确实感觉有些参数不对 有没有c++ 版?<br/><br/>
页:
[1]