📄 root_node_tighten.m
字号:
% *************************************************************************
% Tighten bounds at root
% *************************************************************************
function p = root_node_tighten(p,upper);
p.feasible = all(p.lb<=p.ub) & p.feasible;
if p.options.bmibnb.roottight & p.feasible
if all(p.K.q == 0) & all(p.K.s == 0) & all(p.K.r == 0)
lowersolver = eval(['@' p.solver.lpcall]);
else
lowersolver = eval(['@' p.solver.lowercall]);
end
c = p.c;
Q = p.Q;
mt = p.monomtable;
p.monomtable = eye(length(c));
i = 1;
% Add an upper bound cut?
if (upper < inf)
% p.c'*x+p.f < upper
p.F_struc = [p.F_struc(1:p.K.f,:);upper-p.f -p.c';p.F_struc(1+p.K.f:end,:)];
p.K.l = p.K.l + 1;
end
while i<=length(p.linears) & p.feasible
j = p.linears(i);
if p.lb(j) < p.ub(j) & (ismember(j,p.branch_variables) | (p.options.bmibnb.roottight == 2))
p.c = eyev(length(p.c),j);
output = feval(lowersolver,p);
if (output.problem == 0) & (output.Primal(j)>p.lb(j))
p.lb(j) = output.Primal(j);
p = updateonenonlinearbound(p,j);
p = clean_bounds(p);
end
if output.problem == 1
p.feasible = 0;
elseif p.lb(j) < p.ub(j) % We might have updated lb
p.c = -eyev(length(p.c),j);
output = feval(lowersolver,p);
if (output.problem == 0) & (output.Primal(j) < p.ub(j))
p.ub(j) = output.Primal(j);
p = updateonenonlinearbound(p,j);
p = clean_bounds(p);
end
if output.problem == 1
p.feasible = 0;
end
i = i+1;
end
else
i = i + 1;
end
end
if upper < inf
p.F_struc(1+p.K.f,:) = [];
p.K.l = p.K.l - 1;
end
p.lb(p.lb<-1e10) = -inf;
p.ub(p.ub>1e10) = inf;
p.c = c;
p.Q = Q;
p.monomtable = mt;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -