• 大小: 3KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-14
  • 语言: Matlab
  • 标签: 分支定界  

资源简介

利用MATLAB实现了分支定界法,内有三个.m文件,含有中文注释。

资源截图

代码片段和文件信息

function [newxnewfvalstatusnewbound] = branchbound(fABIxfvalboundAeqBeqlbube)

% 分支定界法求解整数规划
% fABAeqBeqlbub与线性规划相同
% I为整数限制变量的向量
% x为初始解,fval为初始值

options = optimset(‘display‘‘off‘);
[x0fval0status0]=linprog(fABAeqBeqlbub[]options);

%递归中的最终退出条件
%无解或者解比现有上界大则返回原解
if status0 <= 0 || fval0 >= bound
    newx = x;
    newfval = fval;
    newbound = bound;
    status = status0;
    return;
end

%是否为整数解如果是整数解则返回
intindex = find(abs(x0(I) - round(x0(I))) > e);
if isempty(intindex)
    newx(I) = round(x0(I));
    newfval = fval0;
    newbound = fval0;
    status = 1;
    return;
end

%当有非整可行解时,则进行分支求解
%此时必定会有整数解或空解
%找到第一个不满足整数要求的变量
n = I(intindex(1));
addA = zeros(1length(f));
addA(n) = 1;
%构造第一个分支 x<=floor(x(n))
A = [A;addA];
B = [Bfloor(x(n))];
[x1fval1status1bound1] = branchbound(fABIx0fval0boundAeqBeqlbube);
A(end:) = [];
B(:end) = [];
%解得第一个分支,若为更优解则替换,若不是则保持原状

status = status1;
if status1 > 0 && bound1 < bound
    newx = x1;
    newfval = fval1;
    bound = fval1;
    newbound = bound1;
else
    newx = x0;
    newfval = fval0;
    newbound = bound;
end

%构造第二分支
A = [A;-addA];
B = [B-ceil(x(n))];
[x2fval2status2bound2] = branchbound(fABIx0fval0boundAeqBeqlbube);    
A(end:) = [];
B(:end) = [];

%解得第二分支,并与第一分支做比较,如果更优则替换
if status2 > 0 && bound2 < bound
    status = status2;
    newx = x2;
    newfval = fval2;
    newbound = bound2;
end


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2010-05-25 23:52  运筹学整数规划分支定界法MATLAB实现(中文注释)\
     文件        1679  2010-05-25 23:34  运筹学整数规划分支定界法MATLAB实现(中文注释)\branchbound.m
     文件        1294  2010-05-25 23:33  运筹学整数规划分支定界法MATLAB实现(中文注释)\intprog.m
     文件         208  2010-05-25 23:51  运筹学整数规划分支定界法MATLAB实现(中文注释)\test.m

评论

共有 条评论