95 lines
2.9 KiB
Matlab
Executable File
95 lines
2.9 KiB
Matlab
Executable File
function [p,x_min,upper] = initializesolution(p);
|
|
|
|
x_min = zeros(length(p.c),1);
|
|
upper = inf;
|
|
if p.options.usex0
|
|
x = p.x0;
|
|
z = evaluate_nonlinear(p,x);
|
|
residual = constraint_residuals(p,z);
|
|
relaxed_feasible = all(residual(1:p.K.f)>=-p.options.bmibnb.eqtol) & all(residual(1+p.K.f:end)>=p.options.bmibnb.pdtol);
|
|
if relaxed_feasible
|
|
upper = p.f+p.c'*z+z'*p.Q*z;
|
|
x_min = z;
|
|
end
|
|
else
|
|
x0 = p.x0;
|
|
p.x0 = zeros(length(p.c),1);
|
|
% Avoid silly warnings
|
|
if ~isempty(p.evalMap)
|
|
for i = 1:length(p.evalMap)
|
|
if (isequal(p.evalMap{i}.fcn,'log') | isequal(p.evalMap{i}.fcn,'log2') | isequal(p.evalMap{i}.fcn,'log10'))
|
|
p.x0(p.evalMap{i}.variableIndex) = (p.lb(p.evalMap{i}.variableIndex) + p.ub(p.evalMap{i}.variableIndex))/2;
|
|
end
|
|
end
|
|
end
|
|
x = p.x0;
|
|
z = evaluate_nonlinear(p,x);
|
|
z = propagateAuxilliary(p,z);
|
|
|
|
residual = constraint_residuals(p,z);
|
|
relaxed_feasible = all(residual(1:p.K.f)>=-p.options.bmibnb.eqtol) & all(residual(1+p.K.f:end)>=p.options.bmibnb.pdtol);
|
|
if relaxed_feasible
|
|
infs = isinf(z);
|
|
if isempty(infs)
|
|
upper = p.f+p.c'*z+z'*p.Q*z;
|
|
x_min = z;
|
|
x0 = x_min;
|
|
else
|
|
% Allow inf solutions if variables aren't used in objective
|
|
if all(p.c(infs)==0) & nnz(p.Q(infs,:))==0
|
|
ztemp = z;ztemp(infs)=0;
|
|
upper = p.f+p.c'*ztemp+ztemp'*p.Q*ztemp;
|
|
x_min = z;
|
|
x0 = x_min;
|
|
end
|
|
end
|
|
end
|
|
p.x0 = (p.lb + p.ub)/2;
|
|
if ~isempty(p.integer_variables)
|
|
p.x0(p.integer_variables) = round(p.x0(p.integer_variables));
|
|
end
|
|
if ~isempty(p.binary_variables)
|
|
p.x0(p.binary_variables) = round(p.x0(p.binary_variables));
|
|
end
|
|
|
|
x = p.x0;
|
|
x(isinf(x))=eps;
|
|
x(isnan(x))=eps;
|
|
z = evaluate_nonlinear(p,x);
|
|
z = propagateAuxilliary(p,z);
|
|
|
|
residual = constraint_residuals(p,z);
|
|
relaxed_feasible = all(residual(1:p.K.f)>=-p.options.bmibnb.eqtol) & all(residual(1+p.K.f:end)>=p.options.bmibnb.pdtol);
|
|
if relaxed_feasible & ( p.f+p.c'*z+z'*p.Q*z < upper)
|
|
upper = p.f+p.c'*z+z'*p.Q*z;
|
|
x_min = z;
|
|
x0 = x_min;
|
|
end
|
|
p.x0 = x0;
|
|
end
|
|
|
|
|
|
function z = propagateAuxilliary(p,z)
|
|
|
|
try
|
|
% New feature. If we introduce new variables xx = f(x) to be used
|
|
% in a nonlinear operator, we can derive its value when x is chosen
|
|
|
|
if ~isempty(p.aux_variables)
|
|
if p.K.f > 1
|
|
A = p.F_struc(1:p.K.f,2:end);
|
|
b = p.F_struc(1:p.K.f,1);
|
|
for i = 1:length(p.aux_variables)
|
|
j = find(A(:,p.aux_variables(i)));
|
|
if length(j)==1
|
|
if A(j,p.aux_variables(i))==1
|
|
z(p.aux_variables(i)) = -b(j)-A(j,:)*z;
|
|
end
|
|
end
|
|
end
|
|
z = evaluate_nonlinear(p,z);
|
|
end
|
|
end
|
|
catch
|
|
end
|