bnb20工具箱版本比较老,很多地方与Maltab新版本不兼容,甚至没法使用,不建议一般用户使用
附件中提供了4个版本的Matlab中的bnb20函数,第一个是5.3版本的(提供了GUI界面,而其他三个没有),建议下载最新版本的bnb_ml70.rar
该工具箱的主要功能是完成,一般非线性整数规划
在实际应用着经常需要求解非线性整数规划或混合规划问题,该领域中的一种常用的算法是分支定界(branch and bound)算法,但是matlab工具箱中没有相关的函数。荷兰Groningen大学的Koert Kuipers编写的的BNB20工具箱可以用来求解一般非线性整数规划问题。
% BNB20 Finds the constrained minimum of a function of several possibly integer variables.
% Usage: [errmsg,Z,X,t,c,fail] =
% BNB20(fun,x0,xstatus,xlb,xub,A,B,Aeq,Beq,nonlcon,settings,options,P1,P2,...)
%
% BNB solves problems of the form:
% Minimize F(x) subject to: xlb <= x0 <=xub
% A*x <= B Aeq*x=Beq
% C(x)<=0 Ceq(x)=0
% x(i) is continuous for xstatus(i)=0
% x(i) integer for xstatus(i)= 1
% x(i) fixed for xstatus(i)=2
注意:在使用该工具箱之前请保证安装了优化工具箱,由于该工具箱需要调用Matlab中的fmincon函数
下面给出一个例子说明bnb20的使用方法
对著名的Rosenbrock函数稍加修改,使得下面的方程
%===================================主调函数===================================
%一般非线性整数型优化问题
%bnb20工具箱优化工具箱使用实例说明
%建议使用最新版本的,老版本会出现不兼容
%平台Matlab7.6 for windows
%使用程序bnb20_7.0
clc
clear
disp('按任意键开始执行')
pause();
display('正在求解........')
%目标函数,注意必须是字符串(就是M函数名),不支持inline和@()函数
objfun= 'objfun';
%初值,必须是列向量
x0= [1 1]';
%变量类型,0为实数,1为整数,2为常数
xstatus= [0 1]';
%边界,必须和x0具有相同的size,同时如果说变量的类型是整数,那么对应的边界也必须是整数,即使给出的边界不是,也要将它改为最近的整数
xlb= -100*[1 1]';
xub= 100*[1 1]';
%线性不等式约束
A= [];
b= [];
%线性等式约束
Aeq = [];
beq= [];
%非线性约束,必须是字符串
nonlcon= 'nonlcon';
%相关一些设置,具体看说明
settings= [];
%优化选项,必须给出tolx和maxsqpiter两个参数
options= optimset('display','off','MaxSQPIter',1000,'tolx',1e-4);
%调用bnb20工具箱
[errmsg,Z,X,t,c,fail]= bnb20(objfun,x0,xstatus,xlb,xub,A,b,Aeq,beq,nonlcon,settings,options)
%调用优化工具箱验证下
[x,fval,exitflag,output] = fmincon(objfun,x0,A,b,Aeq,beq,xlb,xub,nonlcon,options)
%===================================bnb20工具箱的运行结果===================================
Branch and Bound completed
time elapsed: 0.1 secs
total cycles: 9 cycles
cycles failed: 0 cycles
response value at optimum: 9.8479e+000
optimum design points for subproblem:
1.4181 2.0000
errmsg =
''
Z =
9.8479
X =
1.4181
2.0000
t =
0.1247
c =
10
fail =
0
%===================================优化工具箱的运行结果===================================
x =
1.5434
2.3705
fval =
9.0791
exitflag =
1
output =
iterations: 8
funcCount: 39
lssteplength: 1
stepsize: 1.5650e-006
algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'
firstorderopt: 5.8883e-007
constrviolation: 3.3005e-012
message: [1x144 char]
%注意到了,两个工具箱的运行结果不一样,这是因为我们在bnb20中设置x2必须是整数,可是优化工具箱中没有如此限制
复制代码%===================================目标函数===================================
function f=objfun(x)
f=100.*(x(2)-x(1).^2).^2+(4.5543-x(1)).^2;
复制代码%===================================非线性约束===================================
function [c,ceq] = nonlcon(x)
%nonlinear inequality constraints
c = -8.63*x(1)+x(2)^3;
%nonlinear equality constraints
ceq=[];
复制代码