Chinaunix首页 | 论坛 | 博客

  • 博客访问: 474180
  • 博文数量: 86
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 878
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 14:11
文章分类

全部博文(86)

文章存档

2010年(12)

2009年(60)

2008年(14)

我的朋友

分类:

2009-03-16 22:13:47

    matlab的toolbox中没有提供0-1整数非线性规划的求解工具,《高等应用数学问题的matlab求解》中介绍了荷兰Groningen大学的bnb20工具可以进行大部分整数、非整数、混合类的线性、非线性优化问题的求解。
文件: bnb20_for_Matlab7.X.rar
大小: 139KB
下载: 下载
   将文件解压放在matlab的toolbox路径下,在matlab中添加路径即可。《高等应用数学问题的matlab求解》中详细介绍了bnb20的使用。实际使用过程中发现bnb20的求解过程比较快,使用起来也比较方便,有点类似于matlab优化工具箱中的bintprog,但使用更灵活。
Usage: [errmsg,Z,X,t,c,fail] = 
        BNB20(fun,x0,xstatus,xlb,xub,A,B,Aeq,Beq,nonlcon,settings,options,P1,P2,...)
   在求解0-1规划时,通过设置xstatus中的值来确定解向量中那些变量为整数,设置xlb为0向量,xub为1向量来限定解的范围为0,1。由于bnb20对整数的支持不好,使用中发现有小数解出现,可以用以下几条语句将解向量化成整数:

if length(err) == 0;
    X(xstatus == 1) = round(X(xstatus == 1));
end

   bnb20将目标函数以字符串的形式作为参数,字符串为一个function的名字,而且该function不能传参数,所以要使目标函数能够灵活改变系数,可以在function中将参数矩阵声明为global类型,这样就可以通过全局变量来传递参数矩阵了。

function f = bnb_use(x)
global b;
global c;
f = c * x + x'*b*x

注意:
由于bnb20中限制了本函数的参数类型,所以要向函数体内传递参数,必须通过全局变量的形式,使用全局变量是要小心,在使用前必须用global声明,特别注意的是global变量不能clear掉(至少我没遇到),所以在函数体外对全局变量赋值时必须先清除变量值,否则如果赋值的矩阵尺寸小于全局变量的过去尺寸时会遗留变量的上次值,可以在赋值处这样做:

global b;
global c;
b = zeros(1);
c = zeros(1)

阅读(9980) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~