matlab bnb20,关于bnb20()函数不好使的解决方案
新手发帖... ... :)
最近在准备数学建模,处理非线性的整数规划问题时,用到了bnb20()函数,最开始也遇到了很多问题,总是不好使,最后的解决方案如下:
Matlab环境:MATLAB R2008a
原始问题(来源于薛定宇等《高等应用数学问题的MATLAB求解》p188--例6-26):
>> A = [0 2 1 4 2; 3 4 5 -1 -1]; intlist = ones(5, 1); Aeq = []; Beq = [];
>> B = [54; 62]; xm = [0, 0, 3.32, 0.678, 2.57]‘; xM = 20000*ones(5, 1);
>> ix = (intlist == 1); xm(ix) = ceil(xm(ix)); x0 = xm;
>> [errmsg, f, x] = bnb20('test', x0, intlist, xm, xM, A, B, Aeq, Beq)
输出结果:
*** searched 0 % of three
*** Z : Inf
*** t : 0.0 secs
*** c : 0 cycles
*** fail : 0 cycles
Optimization terminated: first-order optimality measure less
than options.TolFun and maximum constraint violation is less
than options.TolCon.
Active inequalities (to within options.TolCon = 1e-006):
lower upper ineqlin ineqnonlin
2 1
3 2
5
??? Error using ==> lt
Matrix dimensions must agree.
Error in ==> bnb20 at 312
elseif all(abs(round(x(K))-x(K))0
查询bnb20原代码,关键注释代码如下:
>> edit bnb20
settings is a row vector with settings for BNB:
% settings(1) (standard 0) if 1: if the sub-problem does not converge do not branch it and
% raise fail by one. Normally BNB will always branch a nonconvergent sub-problem so it can
% try again to find a solution.
% A sub-problem that is a leaf of the branch-and-bound-tree cannot be branched. If such
% a problem does not converge it will be considered infeasible and fail will be raised by one.
% settings(2) is the handle of main BNB GUI. Leave empty.
% options is an options structure. For details type help optimset.
% options.maxSQPiter is a variable used by fmincon (if modified as described in bnb20.m).
% maxSQPiter cannot be set by optimset because it is not part of the
% standard options
% structure. maxSQPiter is 1000 by default.
这里面有个关键的地方,是option.maxSQPiter,"maxSQPiter cannot be set by optimset because it is not part of the standard options"按照中文解释是在Matlab中的options结构不含maxSQPiter一项(貌似和作者发布这个m文件的时间$Date: 1998/08/24 13:46:15 $)有关),但在命令窗口中输入:
>> ff = optimset; ff.MaxSQPIter
ans =
[]
可知新版的Matlab中的options结构中含有MaxSQLPIter一项,但为空,而在后面bnb20.m文件代码中,有如下if判断:
Line 111:
if nargin>3 && ~isempty(xl)
if isnumeric(xl) && isreal(xl) && all(size(xl)<=size(x0))
xlb(1:size(xl,1))=xl;
else
errmsg='xlb must be a real column vector the same size as x0.';
return;
end
end
可知MaxSQLPIter需要初始化一个正整数值,比如可以给默认值100。由于使用opt这一项参数,因此还需添加如下东西:
1.添加一个m文件,用于得到线性不等式约束(由于在本问题中无非线性约束,因此ceq,c全为空,注意只能以m文件的方式获得)
function [c, ceq] = nolinear(x)
%本文件实现了约束条件不等式的获取
ceq = []; c = [];
2.在命令窗口中添加参数设置
>> ff = optimset; ff.TolFun = 1e-6; ff.TolX = 1e-6; ff.TolCon = 1e-020;ff.MaxSQPIter = 1000;
%之前测试的时候,发现ff.TolFun和ff.Tolx貌似必须要进行设置 :)
>> settings = [0];
%settings的默认设置,具体见前面注释中对settings的解释 :)
>> [errmsg, f, x] = bnb20('test', x0, intlist, xm, xM, A, B, Aeq, Beq, nonlinear, settings, ff)
%'test‘是对目标函数的描述,intlist的设置为什么是[1 1 1 1 1]'在前面的注释中也提到 :)
输出结果:
errmsg =
''
f =
-89
x =
19.0000
0
4.0000
10.0000
5.0000
所输出的结果和书中给出的值一样,即正确。
PS:1.bnb20()函数和众多其它需要设置初始值的函数一样,其最终得出的结果有时候很依赖x0的选择,貌似和“全局最优”和“局部最优”有关,因此
得出结果后,还需尝试其它初始值,进行验证,有时候感觉就像碰运气 :)
2.上述的解决方案基本上可以解决使用bnb20()函数所遇到的所有问题,如果实在还不行,在参考bnb20.m文件的代码及注释吧... ... :)
matlab bnb20,关于bnb20()函数不好使的解决方案相关推荐
- Matlab中的lsqcurvefit函数的使用
Matlab中的lsqcurvefit函数的使用 lsqcurvefit函数 调用示例 lsqcurvefit函数 非线性曲线拟合是已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数 ...
- 【 MATLAB 】使用 filter 函数产生给定线性时不变系统的单位阶跃响应
先给出filter的大致介绍:[ MATLAB ]filter 函数介绍(一维数字滤波器) 上篇博文写了产生一个系统的脉冲响应的博文,有兴趣可以看看:[ MATLAB ]使用 impz 函数计算并画出 ...
- matlab拟合未定义函数或变量,关于matlab的未定义函数或变量的问题
1.首先需要知道matlab中查看数据类型函数是class,可以先在命令行窗口中help class.2.在命令行窗口中输入"a=123 class(a)".3.按回车键可以看到变 ...
- 【Matlab 控制】求函数极限
Matlab 求极限 求函数的0极限: >> syms x; >> y1=(4*x^3-2*x^2+x)/(3*x^2+2*x); >> limit(y1,x,0) ...
- Matlab:Matlab中常用的函数、案例详细攻略
Matlab:Matlab中常用的函数.案例详细攻略 目录 常用函数 1.与文件相关 2.MATLAB GUI不同控件函数间变量传递方法 常用函数 Matlab中的bwmorph函数解释 bwmorp ...
- MTM:matlab实现5主函数解码
前言 之前讲了MTM(多锥形窗谱估计)的相关原理,现在来分析一下它的matlab实现. 想要复习的可以参考一下之前的文件: 现代谱估计:多窗口谱 想要复习一下如何实现的可以参考: MTM:matlab ...
- [MATLAB学习笔记]peaks函数1013(2)
>> Z = peaksZ =1 至 10 列0.0001 0.0001 0.0002 0.0004 0.0007 0.0011 0.0017 0.0025 0.0034 0.00430. ...
- matlab作动态函数曲线图,[转载]Matlab中使用Plot函数动态画图方法总结
本帖最后由 sonictl 于 2012-12-31 12:18 编辑 请删除我 清楚超靠靠靠 没办法,一会儿限制这不能发表,那不能发表的.... [转载]Matlab中使用Plot函数动态画图方法总 ...
- MATLAB常用命令、函数与运算
MATLAB常用命令.函数与运算(自学笔记1) 笔者正在学习matlab的m函数,本文为学习笔记的其中之一. 本文主要介绍MATLAB中常用的命令.函数和运算. 文章目录 MATLAB常用命令.函数与 ...
最新文章
- 儿智展---国内首个少儿智能产品专业展11月登陆上海
- gRPC:Google开源的基于HTTP/2和ProtoBuf的通用RPC框架
- D. Binary Literature
- 理解Spring框架中Bean的作用域
- bzoj1334 [Baltic2008]Elect
- 前端接收pdf文件_原生ajax请求获取pdf文件流本地下载(支持谷歌IE)
- 4.linux 命令行 光标移动技巧
- html与css游戏开发工具,分享15个最佳的HTML/CSS设计和开发框架
- 冒泡排序c语言程序,冒泡排序(C语言实现)
- 教育系统APP(四)
- 使用Python自动提取内容摘要
- 树莓派Pico与ADXL345三轴加速度传感器SPI总线接口技术及MicroPython编程
- C语言商品订购系统(跟购物系统有些差别)
- 中文数字与阿拉伯数字转换(Python)
- 揭秘!苏宁“信息基础设施”型零售实践大解析
- 618买什么蓝牙耳机最划算?四款高品质蓝牙耳机测评
- 微信小程序页面上面的名字怎么改_微信小程序名称可以修改几次? 微信小程序修改名称的方法...
- Bugku - 代码审计 | md5函数
- 英语四级真题作文 计算机,2017年6月英语四级作文真题及范文:卖电脑
- C#,图像二值化(04)——全局阈值的凯勒算法(Kittler Thresholding)及源程序