Is it possible to reformulate the following objective function into a known form for optimization?

102 Views Asked by At

We have the objective function to be minimized as

$$f_0(\textbf{x}) = \sum_{i=1}^{N} \frac{\textbf{a}_i^T \textbf{x}}{\textbf{x}^T \textbf{B}_i \textbf{x}}$$

where $\textbf{x}, \textbf{a}_i$ are same sized vectors and $\textbf{B}_i$ is positive semidefinite matrix. My The values in $\textbf{a}_i$ are all positive and $\textbf{x}$ takes positive values as well.

The constraint on $\textbf{x}$ is linear. I just dont know how to simplify the objective function so I can use some sort of algorithm or optimization method to optimize the equation.

1

There are 1 best solutions below

0
On

As a follow up on my comment that the problem is nonconvex and most likely does not have any clever reformulation, here is an implementation using the MATLAB Toolbox YALMIP (disclaimer, developed by me) to solve the nonlinear problem using either a local solver or a global solver.

% Create a random problem
n = 2;
a1 = rand(n,1);
a2 = rand(n,1);
B1 = randn(n);B1 = B1*B1';
B2 = randn(n);B2 = B2*B2';

% Create YALMIP model with some linear constraints
x = sdpvar(2,1)
Model = [.1 <= x <= 3];
Objective = (a1'*x/(x'*B1*x))+(a2'*x/(x'*B2*x));

% Try to solve using a local nonlinear solver
% YALMIP can get confused by this model  and this it is a geometric
% programming problem so we have to tell YALMIP to use non-gp formulation
% by using 'standard' flag
ops = sdpsettings('solver','fmincon-standard');
optimize(Model,Objective,ops);

% Use YALMIPs global solver and aim for global solution
ops = sdpsettings('solver','bmibnb','bmibnb.upper','fmincon');
optimize(Model,Objective,ops)

% Improve linear relaxations in global solver by adding redundant cuts
% which says the quadratics are non-negative, reducing likelihood of 
% singularities in relaxations
optimize([Model,cut([x'*B1*x x'*B2*x]>=0)],Objective,ops)

For efficiency, you should have an efficient LP solver installed (Gurobi, Mosek, SCIP, CPLEX, ...)

I found a bug when testing this problem, so you have to download the develop version of YALMIP on github if you want to run it.