⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addmcgormick.m

📁 optimization toolbox
💻 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 + -