📄 presolve_bounds_from_equalities.m
字号:
function p = presolve_bounds_from_equalities(p)
if p.K.f >0
for j = 1:p.K.f
% Simple x == y
done = 0;
if p.F_struc(j,1)==0
[row,col,val] = find(p.F_struc(j,:));
if length(row) == 2
if val(1) == -val(2)
p.lb(col(1)-1) = max(p.lb(col(1)-1),p.lb(col(2)-1));
p.lb(col(2)-1) = max(p.lb(col(1)-1),p.lb(col(2)-1));
p.ub(col(1)-1) = min(p.ub(col(1)-1),p.ub(col(2)-1));
p.ub(col(2)-1) = min(p.ub(col(1)-1),p.ub(col(2)-1));
done = 1;
elseif val(1) == val(2)
p.lb(col(1)-1) = max(p.lb(col(1)-1),-p.ub(col(2)-1));
p.lb(col(2)-1) = max(-p.ub(col(1)-1),p.lb(col(2)-1));
p.ub(col(1)-1) = min(p.ub(col(1)-1),-p.lb(col(2)-1));
p.ub(col(2)-1) = min(-p.lb(col(1)-1),p.ub(col(2)-1));
done = 1;
end
end
end
if ~done
b = p.F_struc(j,1);
a = p.F_struc(j,2:end);
ap = a.*(a>0);
am = a.*(a<0);
for k = find(a)
L = p.lb;
U = p.ub;
L(k) = 0;
U(k) = 0;
if a(k) > 0 & (p.ub(k)-p.lb(k)) > 1e-8
newlower = (-b - ap*U - am*L)/a(k);
newupper = (-b - am*U - ap*L)/a(k);
p.ub(k) = min(p.ub(k),newupper);
p.lb(k) = max(p.lb(k),newlower);
end
end
b = -p.F_struc(j,1);
a = -p.F_struc(j,2:end);
ap = a.*(a>0);
am = a.*(a<0);
for k = find(a)
L = p.lb;
U = p.ub;
L(k) = 0;
U(k) = 0;
if a(k) > 0 & (p.ub(k)-p.lb(k)) > 1e-8
newlower = (-b - ap*U - am*L)/a(k);
newupper = (-b - am*U - ap*L)/a(k);
p.ub(k) = min(p.ub(k),newupper);
p.lb(k) = max(p.lb(k),newlower);
end
end
end
end
end
close = find(abs(p.lb - p.ub) < 1e-12);
p.lb(close) = (p.lb(close)+p.ub(close))/2;
p.ub(close) = p.lb(close);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -