约束优化问题的罚函数求解方法(外罚)
惩罚函数法是求解有约束的最优化问题的一种算法。
惩罚函数法的要旨是将一个有约束的最优化问题转化为一系列的无约束问题;这些无约束问题由原问题及罚函数,再加上惩罚因子组成;而且,这些无约束问题的解会收敛于所求问题的解。
算法和步骤
程序和示例
写一个程序用罚函数方法求解:
计算前两部迭代的结果,也就是 x1 x 1 和 x2 x 2 。
clc
clear
%这个算法可能会收敛到局部极值点
f = @(t) t(1)+t(2);
c = @(t) t(1)^2 + t(2)^2 - 2;
Ce = [c];%等式约束
%Ci=[] 不等式约束,先不考虑这一部分
alpha = 2;
sigma0 = 10;
eps = 0.00001;
x0 = [-10,10]';%初始点要选在可行域外,外点法
[xk,k] = penalty(f,Ce,x0,sigma0,alpha,eps);
function [xk,k] = penalty(f,Ce,x0,sigma0,alpha,eps)
P = @(x) sum(Ce(x).^alpha);
H0 = [1 0;0 1];
epsilon = 0.00001;
sigma = sigma0;
xk = x0;
k = 0;
c = 2;
while abs(sigma*P(xk))>= eps
F = @(x) f(x)+ sigma*P(x);
%syms x1 x2;simplify(F([x1,x2]));
%xk = quasi_Newton(F,xk,epsilon,H0,'BFGS');
warning off;
xk = fminunc(F,xk);
%xk = fmincon(f,xk,[],[],[],[],[],[],@mycon)
sigma = c*sigma;
k = k+1;
xk
end
end
选定参数如下:
计算得到 x1=(−1.0179,−0.9942)T,x2=(−1.0031,−1.0031)T x 1 = ( − 1.0179 , − 0.9942 ) T , x 2 = ( − 1.0031 , − 1.0031 ) T 。
遇到的问题,求解无约束优化问题时,想用我原来的BFGS方法,但是结果趋于无穷。仔细分析原因,因为某个时刻 yk y k 项为0,导致了BFGS方法中 γk=1/yTksk γ k = 1 / y k T s k 趋向了无穷。那么,在BFGS方法中,如何保证 yk y k 项不为0呢?