内点法+外点法
內(nèi)點(diǎn)法屬于約束優(yōu)化算法。約束優(yōu)化算法的基本思想是:通過引入效用函數(shù)的方法將約束優(yōu)化問題轉(zhuǎn)換成無約束問題,再利用優(yōu)化迭代過程不斷地更新效用函數(shù),以使得算法收斂。?
內(nèi)點(diǎn)法(罰函數(shù)法的一種)的主要思想是:在可行域的邊界筑起一道很高的“圍墻”,當(dāng)?shù)c(diǎn)靠近邊界時(shí),目標(biāo)函數(shù)徒然增大,以示懲罰,阻止迭代點(diǎn)穿越邊界,這樣就可以將最優(yōu)解“檔”在可行域之內(nèi)了。
數(shù)學(xué)定義
對(duì)于下面的不等式約束的優(yōu)化問題:?
s.tgi(x)≤0,i=1,2,...,m
利用內(nèi)點(diǎn)法進(jìn)行求解時(shí),構(gòu)造懲罰函數(shù)的一般表達(dá)式為?
φ(X,r)=f(X)?r∑i=1m1gi(X)
或者?
φ(X,r)=f(X)?r∑i=1mln[?gi(X)]
算法步驟
仿真
| 1 用外點(diǎn)法求下列問題的最優(yōu)解 方法一:外點(diǎn)牛頓法: clc m=zeros(1,50);a=zeros(1,50);b=zeros(1,50);f0=zeros(1,50);%a b為最優(yōu)點(diǎn)坐標(biāo),f0為最優(yōu)點(diǎn)函數(shù)值,f1 f2最優(yōu)點(diǎn)梯度。 syms x1 x2 e; %e為罰因子。 m(1)=1;c=10;a(1)=0;b(1)=0; %c為遞增系數(shù)。賦初值。 f=x1^2+x2^2+e*(1-x1)^2;f0(1)=1; fx1=diff(f,'x1');fx2=diff(f,'x2');fx1x1=diff(fx1,'x1');fx1x2=diff(fx1,'x2');fx2x1=diff(fx2,'x1');fx2x2=diff(fx2,'x2');%求偏導(dǎo)、海森元素。 for k=1:100 %外點(diǎn)法e迭代循環(huán). x1=a(k);x2=b(k);e=m(k); for n=1:100 %梯度法求最優(yōu)值。 f1=subs(fx1); %求解梯度值和海森矩陣 f2=subs(fx2); f11=subs(fx1x1); f12=subs(fx1x2); f21=subs(fx2x1); f22=subs(fx2x2); if(double(sqrt(f1^2+f2^2))<=0.001) %最優(yōu)值收斂條件 a(k+1)=double(x1);b(k+1)=double(x2);f0(k+1)=double(subs(f)); break; else X=[x1 x2]'-inv([f11 f12;f21 f22])*[f1 f2]'; x1=X(1,1);x2=X(2,1); end end if(double(sqrt((a(k+1)-a(k))^2+(b(k+1)-b(k))^2))<=0.001)&&(double(abs((f0(k+1)-f0(k))/f0(k)))<=0.001) %罰因子迭代收斂條件 a(k+1) %輸出最優(yōu)點(diǎn)坐標(biāo),罰因子迭代次數(shù),最優(yōu)值 b(k+1) k f0(k+1) break; else m(k+1)=c*m(k); end end 方法二:外點(diǎn)梯度法: clc m=zeros(1,50);a=zeros(1,50);b=zeros(1,50);f0=zeros(1,50);? syms d x1 x2 e;? m(1)=1;c=10;a(1)=0;b(1)=0;? f=x1^2+x2^2+e*(1-x1)^2; f0(1)=1;? fx1=diff(f,'x1');? fx2=diff(f,'x2'); for k=1:100? x1=a(k);x2=b(k);e=m(k); for n=1:100? f1=subs(fx1); f2=subs(fx2); if(double(sqrt(f1^2+f2^2))<=0.002)? a(k+1)=double(x1);b(k+1)=double(x2);f0(k+1)=double(subs(f)); break; else D=(x1-d*f1)^2+(x2-d*f2)^2+e*(1-(x1-d*f1))^2;? Dd=diff(D,'d'); dd=solve(Dd); x1=x1-dd*f1; x2=x2-dd*f2; end end if(double(sqrt((a(k+1)-a(k))^2+(b(k+1)-b(k))^2))<=0.001)&&(double(abs((f0(k+1)-f0(k))/f0(k)))<=0.001)? a(k+1) b(k+1) k f0(k+1) break; else m(k+1)=c*m(k); end end 2,用內(nèi)點(diǎn)法求下列問題的最優(yōu)解 內(nèi)點(diǎn)牛頓法 clc m=zeros(1,50);a=zeros(1,50);b=zeros(1,50);f0=zeros(1,50); syms x1 x2 e; m(1)=1;c=0.2;a(1)=2;b(1)=-3; f=x1^2+x2^2-e*(1/(2*x1+x2-2)+1/(1-x1)); f0(1)=15; fx1=diff(f,'x1');fx2=diff(f,'x2');fx1x1=diff(fx1,'x1');fx1x2=diff(fx1,'x2');fx2x1=diff(fx2,'x1');fx2x2=diff(fx2,'x2'); for k=1:100 x1=a(k);x2=b(k);e=m(k); for n=1:100 f1=subs(fx1); f2=subs(fx2); f11=subs(fx1x1); f12=subs(fx1x2); f21=subs(fx2x1); f22=subs(fx2x2); if(double(sqrt(f1^2+f2^2))<=0.002) a(k+1)=double(x1);b(k+1)=double(x2);f0(k+1)=double(subs(f)); break; else X=[x1 x2]'-inv([f11 f12;f21 f22])*[f1 f2]'; x1=X(1,1);x2=X(2,1); end end if(double(sqrt((a(k+1)-a(k))^2+(b(k+1)-b(k))^2))<=0.001)&&(double(abs((f0(k+1)-f0(k))/f0(k)))<=0.001) a(k+1) b(k+1) k f0(k+1) break; else m(k+1)=c*m(k); end end
|
| ? |
總結(jié)
- 上一篇: 使用Tensorflow和MNIST识别
- 下一篇: OpenCV中直方图均衡化