📄 preprocess_bilinear_bounds.m
字号:
function p = preprocess_bilinear_bounds(p)
% if ~isempty(p.bilinears)
% quadratics = find(p.bilinears(:,2) == p.bilinears(:,3));
% for i = quadratics(:)'
% if ismember(p.bilinears(i,2),p.binary_variables)
% p.binary_variables = [p.binary_variables p.bilinears(i,1)];
% elseif ismember(p.bilinears(i,2),p.integer_variables)
% p.integer_variables = [p.integer_variables p.bilinears(i,1)];
% end
% end
% end
if ~isempty(p.integer_variables)
for i = 1:size(p.bilinears,1)
if ismember(p.bilinears(i,2),p.integer_variables)
if ismember(p.bilinears(i,3),p.integer_variables)
p.integer_variables = [p.integer_variables p.bilinears(i,1)];
end
end
end
if p.K.f > 0
for i = 1:p.K.f
if all(p.F_struc(i,:) == fix(p.F_struc(i,:)))
involved = find(p.F_struc(i,2:end));
if nnz(ismember(involved,p.integer_variables)) == length(involved)-1
p.integer_variables = [p.integer_variables involved];
end
end
end
p.integer_variables = unique(p.integer_variables );
end
end
if ~isempty(p.binary_variables)
for i = 1:size(p.bilinears,1)
if ismember(p.bilinears(i,2),p.binary_variables)
if ismember(p.bilinears(i,3),p.binary_variables)
p.binary_variables = [p.binary_variables p.bilinears(i,1)];
end
end
end
for i = 1:p.K.f
if all(p.F_struc(i,:) == fix(p.F_struc(i,:)))
involved = find(p.F_struc(i,2:end));
if nnz(ismember(involved,p.binary_variables)) == length(involved)-1
p.binary_variables = [p.binary_variables involved];
end
end
end
p.binary_variables = unique(p.binary_variables );
end
if isempty(p.ub)
p.ub = repmat(inf,length(p.c),1);
end
if isempty(p.lb)
p.lb = repmat(-inf,length(p.c),1);
end
if ~isempty(p.F_struc)
[lb,ub,used_rows] = findulb(p.F_struc,p.K);
if ~isempty(used_rows)
lower_defined = find(~isinf(lb));
if ~isempty(lower_defined)
p.lb(lower_defined) = max(p.lb(lower_defined),lb(lower_defined));
end
upper_defined = find(~isinf(ub));
if ~isempty(upper_defined)
p.ub(upper_defined) = min(p.ub(upper_defined),ub(upper_defined));
end
% Remove linear bounds
used_rows = used_rows(find(~any(p.F_struc(p.K.f+used_rows,1+p.nonlinears),2)));
not_used_rows = setdiff(1:p.K.l,used_rows);
for i = 1:length(p.KCut.l)
p.KCut.l(i) = find(not_used_rows==p.KCut.l(i) );
p.originalModel.KCut.l(i) = find(not_used_rows==p.originalModel.KCut.l(i) );
end
if ~isempty(used_rows)
p.F_struc(p.K.f+used_rows,:)=[];
p.K.l = p.K.l - length(used_rows);
used_rows = used_rows(used_rows <= p.originalModel.K.l);
p.originalModel.F_struc(p.originalModel.K.f+used_rows,:)=[];
p.originalModel.K.l = p.originalModel.K.l - length(used_rows);
end
end
end
p.lb(p.binary_variables) = max(0,p.lb(p.binary_variables));
p.ub(p.binary_variables) = min(1,p.ub(p.binary_variables));
p.lb(p.integer_variables) = ceil(p.lb(p.integer_variables));
p.ub(p.integer_variables) = floor(p.ub(p.integer_variables));
p = clean_bounds(p);
if ~isempty(p.bilinears)
p = updatenonlinearbounds(p);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -