📄 addmcgormick.m
字号:
function pcut = addmcgormick(p)
pcut = p;
z = p.bilinears(:,1);
x = p.bilinears(:,2);
y = p.bilinears(:,3);
nn = length(p.c);
still_uncertain = find(abs(p.lb(z)-p.ub(z))>1e-8);
if ~isempty(still_uncertain)
x_lb = p.lb(x);
x_ub = p.ub(x);
y_lb = p.lb(y);
y_ub = p.ub(y);
m = length(x);
one = ones(m,1);
general_vals =[x_lb.*y_lb one -y_lb -x_lb,x_ub.*y_ub one -y_ub -x_ub,-x_ub.*y_lb -one y_lb x_ub,-x_lb.*y_ub -one y_ub x_lb]'; %3
general_cols = [one z+1 x+1 y+1 one z+1 x+1 y+1 one z+1 x+1 y+1 one z+1 x+1 y+1]';
general_row = [1;1;1;1;2;2;2;2;3;3;3;3;4;4;4;4];
quadratic_row = [1;1;1;2;2 ;2; 3; 3; 3];
quadratic_cols = [one z+1 x+1 one z+1 x+1 one z+1 x+1]';
quadratic_vals = [-x_ub.*x_lb -one x_lb+x_ub x_lb.*y_lb one -y_lb-x_lb x_ub.*y_ub one -y_ub-x_ub]';
m = 1+length(p.c);
rows = [];
cols = [];
vals = [];
nrow = 0;
% dummy = ismembc(p.bilinears(:,1),p.r);
for i =still_uncertain(:)'% 1:size(p.bilinears,1)
x = p.bilinears(i,2);
y = p.bilinears(i,3);
if x~=y
if 0%dummy(i)
here = find(p.bilinears(i,1) == p.r);
if p.s(here) > 0
rows = [rows;general_row(1:8,:)+nrow];
vals = [vals;general_vals(1:8,i)];
cols = [cols;general_cols(1:8,i)];
nrow = nrow + 2;
elseif p.s(here)<0
rows = [rows;general_row(1:8,:)+nrow];
vals = [vals;general_vals(9:end,i)];
cols = [cols;general_cols(9:end,i)];
nrow = nrow + 2;
end
else
rows = [rows;general_row+nrow];
vals = [vals;general_vals(:,i)];
cols = [cols;general_cols(:,i)];
nrow = nrow + 4;
end
else
if 0%dummy(i)
%col = quadratic_cols(:,i);
%val = quadratic_vals(:,i);
here = find(p.bilinears(i,1) == p.r);
if p.s(here) > 0
rows = [rows;quadratic_row(1:6,:)+nrow];
vals = [vals;quadratic_vals(4:end,i)];
cols = [cols;quadratic_cols(4:end,i)];
nrow = nrow + 2;
elseif p.s(here)<0
rows = [rows;quadratic_row(1:3,:)+nrow];
vals = [vals;quadratic_vals(1:3,i)];
cols = [cols;quadratic_cols(1:3,i)];
nrow = nrow + 1;
%rows = [rows;general_row+nrow];
%vals = [vals;val];
%cols = [cols;col];
%nrow = nrow + 4;
end
else
col = quadratic_cols(:,i);
val = quadratic_vals(:,i);
rows = [rows;quadratic_row+nrow];
vals = [vals;val];
cols = [cols;col];
nrow = nrow + 3;
% end
end
end
end
F_temp = sparse(rows,cols,vals,nrow,m);
% constraint_sign = sum(full(F_temp(:,(2+nn/2):end)),2);
% yy = constraint_sign .* kron(p.c(nn/2+1:end),ones(3,1));
keep = find(~isinf(F_temp(:,1)));
F_temp = F_temp(keep,:);
pcut.F_struc = [F_temp;pcut.F_struc];
pcut.K.l = pcut.K.l+size(F_temp,1);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -