一、算法原理

1、问题引入

之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。

2、约束优化问题的分类

约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。

其数学模型为:

等式约束

s.t   

不等式约束

s.t   

等式+不等式约束问题

s.t   

s.t   

3、惩罚函数法定义

惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。

按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法

内点法:迭代点再约束条件的可行域之内,只用于不等式约束。

外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。

4、外点惩罚函数法

等式约束:

s.t   

算法步骤

a、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;

b、然后用无约束优化极值算法求解(牛顿法);

c、   如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;

否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;

d、转步骤a继续迭代;

matlab代码

关于牛顿法的具体讲解,给出该博客网址https://blog.csdn.net/STM89C56/article/details/105643162

%% 外点惩罚函数法-等式约束
syms x1 x2
f=x1.^2+x2.^2;
hx=[x1-2;x2+3];%列x0=[0;0];
M=0.01;
C=2;
eps=1e-6;
[x,result]=waidian_EQ(f,x0,hx,M,C,eps)function [x,result]=waidian_EQ(f,x0,hx,M,C,eps)
% f 目标函数
% x0 初始值
% hx 约束函数
% M 初始罚因子
% C 罚因子放大系数
% eps 容差%计算惩罚项
CF=sum(hx.^2);  %chengfawhile 1F=matlabFunction(f+M*CF);%目标函数,使用之前的牛顿法,需要转换成句柄x1=Min_Newton(F,x0,eps,100);if norm(x1-x0)<epsx=x1;result=double(subs(f,symvar(f),x'));break;elseM=M*C;x0=x1;end
end
end
%牛顿法
function [X,result]=Min_Newton(f,x0,eps,n)
%f为目标函数
%x0为初始点
%eps为迭代精度
%n为迭代次数
TiDu=gradient(sym(f),symvar(sym(f)));% 计算出梯度表达式
Haisai=jacobian(TiDu,symvar(sym(f)));
Var_Tidu=symvar(TiDu);
Var_Haisai=symvar(Haisai);
Var_Num_Tidu=length(Var_Tidu);
Var_Num_Haisai=length(Var_Haisai);TiDu=matlabFunction(TiDu);
flag = 0;
if Var_Num_Haisai == 0  %也就是说海塞矩阵是常数Haisai=double((Haisai));flag=1;
end
%求当前点梯度与海赛矩阵的逆
f_cal='f(';
TiDu_cal='TiDu(';
Haisai_cal='Haisai(';
for k=1:length(x0)f_cal=[f_cal,'x0(',num2str(k),'),'];for j=1: Var_Num_Tiduif char(Var_Tidu(j)) == ['x',num2str(k)]TiDu_cal=[TiDu_cal,'x0(',num2str(k),'),'];endendfor j=1:Var_Num_Haisaiif char(Var_Haisai(j)) == ['x',num2str(k)]Haisai_cal=[Haisai_cal,'x0(',num2str(k),'),'];endend
end
Haisai_cal(end)=')';
TiDu_cal(end)=')';
f_cal(end)=')';switch flagcase 0Haisai=matlabFunction(Haisai);dk='-eval(Haisai_cal)^(-1)*eval(TiDu_cal)';case 1dk='-Haisai^(-1)*eval(TiDu_cal)';Haisai_cal='Haisai';
endi=1;
while i < n if abs(det(eval(Haisai_cal))) < 1e-6disp('逆矩阵不存在!');break;endx0=x0(:)+eval(dk);if norm(eval(TiDu_cal)) < epsX=x0;result=eval(f_cal);return;endi=i+1;
end
disp('无法收敛!');
X=[];
result=[];
end

不等式约束:

s.t   

算法步骤

a、构造惩罚函数:F=f+M * u*{ [ g1(x) ]^2 + [ g2(x) ]^2 } ,式中M为初始惩罚因子,

,(外电惩罚函数,迭代点再可行域之外,不等式约束才起作用)

b、然后用无约束优化极值算法求解;

c、   如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;

否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;

d、转步骤a继续迭代;

matlab代码

牛顿法代码与等数约束相同这里不再给出

%% 外点惩罚函数法-不等式约束
syms x1 x2
f=x1.^2+(x2-2).^2;% x1-1>=0,x2-2>=0
g=[x1-1;-x2+2];%修改成大于等于形式x0=[0 0];
M=0.03;
C=3;
eps=1e-6;
[x,result]=waidian_Neq(f,g,x0,M,C,eps,100)function [x,result]=waidian_Neq(f,g,x0,M,C,eps,k)
% f 目标函数
% g 不等式约束函数矩阵
% x0 初始值
% M 初始惩罚因子
% C 罚因子放大倍数
% eps 退出容差
% k 循环次数
n=1;
while n<k%首先判断是不是在可行域内gx=double(subs(g,symvar(g),x0));%计算当前点的约束函数值index=find(gx<0);%寻找小于0的约束函数F_NEQ=sum(g(index).^2);F=matlabFunction(f+M*F_NEQ);x1=Min_Newton(F,x0,eps,100);x1=reshape(x1,1,length(x0))if norm(x1-x0)<epsx=x1;result=double(subs(f,symvar(f),x));break;elseM=M*C;x0=x1;endn=n+1;
end

混合约束:

s.t   

算法步骤

a、构造惩罚函数:F=f+M * { u*[ g1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子,

,(外电惩罚函数,迭代点再可行域之外,不等式约束才起作用)

b、然后用无约束优化极值算法求解;

c、   如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;

否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;

d、转步骤a继续迭代;

matlab代码

%% 外点惩罚函数-混合约束
syms x1 x2
f=(x1-2)^2+(x2-1)^2;
g=[-0.25*x1^2-x2^2+1];%修改成大于等于形式
h=[x1-2*x2+1];x0=[2 2];
M=0.01;
C=3;
eps=1e-6;
[x,result]=waidian_hunhe(f,g,h,x0,M,C,eps,100)function [x,result]=waidian_hunhe(f,g,h,x0,M,C,eps,k)
% f 目标函数
% g 不等式约束函数矩阵
% h 等式约束函数矩阵
% x0 初始值
% M 初始惩罚因子
% C 罚因子放大倍数
% eps 退出容差
% 循环次数CF=sum(h.^2);  %chengfa
n=1;
while n<k%首先判断是不是在可行域内gx=double(subs(g,symvar(g),x0));%计算当前点的约束函数值index=find(gx<0);%寻找小于0的约束函数F_NEQ=sum(g(index).^2);F=matlabFunction(f+M*F_NEQ+M*CF);x1=Min_Newton(F,x0,eps,100);x1=x1'if norm(x1-x0)<epsx=x1;result=double(subs(f,symvar(f),x));break;elseM=M*C;x0=x1;endn=n+1;
end
end

5、内点惩罚函数法

s.t   

算法步骤

a、构造惩罚函数:F=f+M * 1/{ g1(x)  +  g2(x) } ,式中M为初始惩罚因子,

b、然后用无约束优化极值算法求解;

c、   如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;

否则缩小惩罚因子M=C*M,式中C为 罚因子缩小系数;

d、转步骤a继续迭代;

matlab代码

%% 内点惩罚函数
syms x1 x2 x
f=x1.^2+x2.^2;
g=[x1+x2-1;2*x1-x2-2];
x0=[3 1];
M=10;
C=0.5;
eps=1e-6;
[x,result]=neidian(f,g,x0,M,C,eps,100)function [x,result]=neidian(f,g,x0,M,C,eps,k)
% f 目标函数
% g 不等式约束函数矩阵
% h 等式约束函数矩阵
% x0 初始值
% M 初始障碍因子
% C 障碍因子缩小倍数
% eps 退出容差
% k 循环次数%惩罚项
Neq=sum((1./g));n=1;
while n<kF=matlabFunction(f+M*Neq);[x1,result]=Min_Newton(F,x0,eps,100);x1=reshape(x1,1,length(x0));tol=double(subs(Neq,symvar(Neq),x1)*M);if tol < epsif norm(x1-x0) < epsx=x1;result=double(subs(f,symvar(f),x));break;elsex0=x1;M=M*C;endelseif norm(x1-x0) < epsx=x1;result=double(subs(f,symvar(f),x));break;elsex0=x1;M=M*C;endendn=n+1;
end
end

MATLAB约束优化之惩罚函数法相关推荐

  1. matlab 约束函数,【优化求解】MATLAB约束优化之惩罚函数法

    一.算法原理 之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等.但在实际工程问题中,大多数优化问题都属于有约束优化问题.惩罚函数法就可以将约 ...

  2. 最优化课程笔记07——约束问题的非线性规划方法(重点:拉格朗日乘子法和惩罚函数法)

    7.1 间接法:约束转化为无约束问题(含一个重点:拉格朗日乘子法) 当维数多的时候不适用 7.1.2拉格朗日乘子法(重点) 7.1.2.1 等式约束问题 7.1.2.2 不等式约束问题 7.1.3 惩 ...

  3. 模拟退火算法(惩罚函数法求约束优化问题)

    构造惩罚函数: p1 = (max(0, 4642 - X[0] - X[1] - X[2] - X[3] - X[4] - X[5] - X[6] - X[7] - X[8] - X[9])) ** ...

  4. 惩罚函数内点法c语言,分享:惩罚函数法(内点法、外点法)求解约束优化问题最优值...

    方法一:外点牛顿法: clc m=zeros(1,50);a=zeros(1,50);b=zeros(1,50);f0=zeros(1,50);%a b为最优点坐标,f0为最优点函数值,f1 f2最优 ...

  5. 约束优化求解之罚函数法

    罚函数法 本部分考虑约束优化问题: min ⁡ f ( x ) s . t . x ∈ χ (1) \begin{aligned} \min f(x) \\ s.t. x\in\chi \end{al ...

  6. 内点惩罚函数法matlab_拉格朗日乘数法求解多元条件极值问题

    点击蓝字,关注废柴姐姐 拉格朗日乘数法 " 一种不直接依赖消元法而求解条件极值问题的有效方法 二元函数入手 我们从  皆为二元函数这一简单情况人手. 欲求函数 的极值,其中受条件 的限制. ...

  7. matlab外罚函数实验报告,外罚函数法matlab

    罚函数法 37页 1下载券 罚函数法 11页 1下载券 罚函数法MATLAB程序 5页 2下载券 1120 罚函数法 (罚函数法... 52页 1下载券 ...... c Ax ? b . 3 算法的 ...

  8. 外罚法内罚法matlab,罚函数法

    外点法 内点法 乘子罚函数法 1. 等式约束问题的罚函数 约束问题的罚函数 由于... [设计]罚函数法 MATLAB 程序 一.进退法.0.618 法.Powell 法.罚函数法的 Matlab 程 ...

  9. 乘子法罚函数法matlab实例,罚函数法(罚函数法与乘子法合订).ppt

    罚函数法(罚函数法与乘子法合订) 收敛性定理 5 算法评价(优缺点) 二.内点罚函数法(碰壁函数法)-内点法 2 罚函数的特点 3. 算法实现 收敛性定理 构造新的辅助函数 2. 算法实现 乘子法是由 ...

  10. 最优化方法外罚函数法Matlab,最优化方法 第三篇(罚函数法).pdf

    一 简介 罚 函 二 外点法 数 三 内点法 法 四 混合法 一.罚函数法简介 f x min   xRn s.t . g x  0,i I 1, ,m , i    e  h x ...

最新文章

  1. 找出文件1中有而文件2中没有的数据
  2. Android权限处理,Android校招面试指南
  3. 如何看电脑安装了python-Python教程第1篇:查看电脑是否安装python
  4. python空行拼接字符串_python基础---文本和字符串操作
  5. Oracle 默认时间格式 Date格式转换
  6. 【NLP】XLnet:GPT和BERT的合体,博采众长,所以更强
  7. 一台机器上运行多个ActiveMq
  8. windows 7系统搭建本地SVN服务器的过程
  9. 【Druid IO】Instantiation of [simple type, class druid.indexing.kafka.supervisor.KafkaSupervisorTunin
  10. 编解码格式 -- AAC
  11. js实现简单pdf打印功能
  12. FoveaBox(Beyond Anchor-based Object Detector) 学习笔记
  13. 【Java类的封装性】封装的日期类。Person类,使用对象作为成员变量并实现深拷贝。(利用了类的封装性)
  14. openpyxl 打开大文件很慢_解决python执行较大excel文件openpyxl慢问题
  15. 校园网站毕业设计,学校网站毕业设计论文模板案例,校园网毕业设计
  16. 计算机智能科学与技术专业大学排名,全国智能科学与技术专业大学排名
  17. 银行存取款哪年开始用计算机打印,浙江2009年《初级会计电算化》模拟题二
  18. 【洛谷P3951】小凯的疑惑【数论】
  19. 服务器s4系列固态,尘埃落定 揭晓四大顶级主控胜负_固态硬盘_固态硬盘评测-中关村在线...
  20. 计算机课作业要求做一张简报,教案作业检查简报模板

热门文章

  1. 超全山东华为天翼网关电信光猫HS8145c超级密码获取
  2. 中职计算机录取分数线是多少,中职技校录取分数线划定
  3. Android提取分区镜像命令,Android取证:使用ADB和DD对文件系统做镜像
  4. javascript跨域
  5. PHP公文签报源码,基于PHP企业公文流转系统.docx
  6. 基于php的企业公文流转审批系统
  7. 如何在 Linux 上安装服务器程序?
  8. 光学遥感和微波遥感异同点?影响微波散射的因素有哪些?
  9. html展开折叠菜单,纯CSS竖向滑动展开折叠菜单
  10. Mac 使用终端彻底格式化U盘