资源简介
利用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
评论
共有 条评论