有约束多变量寻优方法——内点罚函数法
本文讨论内点罚函数法。
对于一个有不等式约束的优化问题:
这个问题通俗来讲就是在满足的条件下,寻找
使得
最小。我们将满足这个条件的
形成的集合叫做
的可行域,即
为了将它转化成无约束条件的优化问题,我们构造一个所谓的惩罚函数:
其中是连续函数,当点x从可行域内趋于可行域边界时,
的值要趋于无穷大。根据这个条件,
可以有两种形式:
或者
容易看出,若在可行域内部,当
逐渐趋于0时,
的最优解就趋于
的最优解。
对于固定的,由于
的存在,我们在可行域内求
的最小值这个问题,实际上和在全域内寻找
的最小值是可以等同起来的,因为在计算过程中
一旦接近可行域的边界(函数值非常大了),我们求最小值的程序肯定会将
马上退回到内部,所以我们可以认为这是一个无约束问题(约束是自动形成的)。
由于迭代总是在可行域内进行,每一个中间结果都是一个可行解,因此中间的结果可作为近似解。
从上面的分析可以看到内点法的缺点,第一,内点法不能求解等式约束;第二,迭代的初值必须是可行域内部的点。所以我们必须在寻优之前,先找一个内点作为初值。
下面的过程可以找到一个内点作为初始值
假设我们有一个任意的,代入到
中,可以有以下结果:
①所有条件均满足,则就是内点;
②一部分满足,一部分不满足或者都不满足:
令
然后构造新的目标函数,约束条件为
,因为
就是新的可行域的内点,所以直接以
为初值用内点罚函数法求
的最小值,
的最小值点
让
不断向大于零的方向发展,如此循环直到
。此时的
就是原可行域的内点了。
下面附上内点罚函数的matlab代码:
% 需要求解的目标函数f(x)function [y] = func(x)y=x(1)+x(2);end% 约束函数(需是大于等于0形式)function [G] = conf(x)g1=-x(1).^2+x(2);
g2=x(1);G=[g1;g2];end% 内点法求解函数function[X,fX,k]=InteriorPFM(fun,conf,X0,r,tol,Klimit,nonconf)% IPFM(Interior penalty function method)
% 适用范围
% 约束条件是不等式
% 需要寻找内点作为初始点% 输入参数
% fun:目标函数
% con: 约束条件(列向量形式,都是大于等于号)
% 例如:
% con(X)=[-x1+x2;x1^2+x2] 表示约束条件是
% -x1+x2>=0;
% x1^2+x2>=0
% X0: 任意取值(编程实现初始值的选取)
% r: 障碍因子(r>0)
% tol: 允许误差
% Klimit:最大迭代次数
% nonconf: 无约束多变量求解方法(降维法、梯度法、模式法等,可以用matlab内置函数fminbnd)% 输出参数
% X: 最优点
% fx: 目标函数的最小值
% k: 迭代次数k=0;
rt=r; % 求解初始值使用的障碍因子G=conf(X0); % 约束方程的值% 找到G中值>0的下标,此为内点下标集合
% 其他的就是非内点集合T=find(G>0); % 内点下标
S=find(G<=0); % 非内点下标% 判断S是否为空(isempty(S)=1或者size(S)=0),如果为空,说明X0就是内点% 把下标为非内点下标的约束函数的相反数作为“目标函数”
% 把下标为内点下标的约束函数作为“约束函数”function N_G=t_noconf(X)
Gt=conf(X);
N_G=-sum(Gt(S))-rt*sum(log(Gt(T)));
endwhile isempty(S)~=1f=@t_noconf;% f函数可以看做是全局搜索最小值,因为它的形式保证了在边界处很大X1=nonconf(f,X0);X0=X1;G=conf(X0); % 约束方程的值T=find(G>0); % 内点下标S=find(G<=0); % 非内点下标rt=rt*0.1;end% 此时X0是内点可以作为初始值function N_G=new_noconf(X)
Gt=conf(X);
Gt(Gt<0)=0;
N_G=fun(X)-r*sum(log(Gt));
endf=@new_noconf;X1=nonconf(f,X0);while abs(norm(X1-X0))>tol %迭代终止条件X0=X1;r=r*0.1;k=k+1;disp(['迭代次数',num2str(k)])f=@new_noconf;X1=nonconf(f,X0); if k>Klimitbreak;end
endX=X1;
fX=fun(X);
end
下面是求解的结果(只画出了在可行域内部的目标函数的图像)
有约束多变量寻优方法——内点罚函数法相关推荐
- 外罚法内罚法matlab,罚函数法
外点法 内点法 乘子罚函数法 1. 等式约束问题的罚函数 约束问题的罚函数 由于... [设计]罚函数法 MATLAB 程序 一.进退法.0.618 法.Powell 法.罚函数法的 Matlab 程 ...
- 罚函数法外点matlab,内点罚函数法matlab
罚函数的算法与实例 例3.24 Matlab 的使用 u=0; [x,y]=me... 5.6 约束变尺度法 7.2 乘子(罚函数)法信息与计算科学系 邵建峰邵建峰 本节内容: ? 一. 等式约束问题 ...
- 不等式约束的拉格朗日乘数法_Abaqus血管支架仿真|接触约束执行方式
根据支架的建模基础.几何和网格划分.单元选择.材料和截面属性.分析步设置.载荷接触和约束.收敛调整,以及后处理.参数优化等内容.接着Abaqus血管支架仿真|建模基础.Abaqus血管支架仿真|几何和 ...
- 拉格朗日乘子法、罚函数法、乘子罚函数法
1. 拉格朗日乘子法 1.1 无约束问题 1.2 等式约束问题 1.3 不等式约束问题(KKT条件) 1.4 拉格朗日乘子法问题 2. 罚函数法 2.1 定义 2.2 外罚函数法 2.3 内罚函数法 ...
- 机器学习模型调优方法(过拟合、欠拟合、泛化误差、集成学习)
机器学习模型调优方法 过拟合和欠拟合 降低过拟合风险的方法 降低欠拟合风险的方法 泛化误差.偏差和方差 泛化误差 偏差和误差 模型评估 Holdout检验 交叉检验 自助法 集成学习 Boosting ...
- Asp.Net数据库编程-10条最优方法[翻译]
Asp.Net数据库编程-10条最优方法[翻译] 原文标题:Using Data with ASP.Net - 10 of my 'Best Practices' 原文链接:http://www.de ...
- mysql port range_MySQL 数据库常见调优方法及参数设置_MySQL
1. 关闭 SELinux vim /etc/selinux/config 更改 SELINUX=enforcing 为 SELINUX=disabled 2. 更改 IO Schedule, 对于 ...
- 图解机器学习-l2约束的最小二乘学习法-matlab源码
约束条件 L2约束的最小二乘学习法是以参数空间的圆点为圆心,在一定半径范围的圆内进行求解. 拉格朗日对偶问题: 原始问题:在约束条件 下求 引入拉格朗日函数: 称 ...
- 不等式约束二次规划——有效集法
不等式约束二次规划--有效集法 预备知识:有效不等式约束是等式约束 总体思路 如何寻找有效集 1.x0∗=x0,λ≥0x_0^*=x_0,λ≥0x0∗=x0,λ≥0 2.x0∗=x0,λj≤0x_ ...
最新文章
- python异步封装_python中用协程(异步)实现map函数,爬虫也可以封装进去,
- SAP-注入“AI基因” 打造全球第一款“智能ERP
- VMware vSphere 5.0升级到5.1的思路
- InnoDB行格式(compact,redundant)对照
- select for update
- Http 与 Socket 区别
- 数据预处理(Python scikit-learn)
- Google编程题:最小操作数
- 怎样不停请求接口实现实时刷新_快狗打车实时数仓和基于Hologres的数据服务建设...
- ubuntu下docker简单安装mysql
- 境外WiFi市场持续升温 2016年或迎普及元年
- 在Windows 7 (SP1)上安装Visual Studio 2015
- 内存中常见异常值的解释(0xcccccccc 0xcdcdcdcd 0xfeeefeee等)
- Hokuyo‘s first try
- 转:浅析 Java Thread.join()
- Kafka从上手到实践 - 实践真知:Kafka Java Consumer | 凌云时刻
- 基于CC2430和DS18B20的无线测温系统设计
- 大厂内推的一些套路--校招、初中级社招
- 人脑(科普类)书籍视屏学习资料推荐(不定时更新)
- 第五篇 《小强升职记》
热门文章
- android弹出框自定义按钮,安卓(kotlin)自定义弹出框
- matlab中图像分割技术之二阈值分割
- SpringBoot+Vue项目月度员工绩效考核管理系统
- mc有无限火力的服务器地址,我的世界花雨庭无限火力怎么玩 花雨庭无限火力玩法教程...
- 三种滤波算法针对不同噪声处理
- 前端通用埋点工具web-hunter
- 修改2012服务器的默认端口,请问如何开启2012R2系统对外访问445等端口。
- 为什么串口传输速度比并口快?
- C#做的配套C做的SNIFFER(C#)--C#简单而实用
- 机器人运动仿真和3D建模可视化