Converting a maximizing problem into a minimizing program using linprog

Hi guys,
i have a question about the function linprog.
I want to use this function, and according to the matlab database the function linprog can be applied so that it solves for:
In my case i want to maximize the vector x. Can Anyone help me and tell me how to convert it? What effects will it have on the A matrix and the upper / lower bounds?
Thanks a lot!
Kev

 Respuesta aceptada

Bruno Luong
Bruno Luong el 5 de Sept. de 2020
You just need to reverse the sign of f. Don't touch the rest.

6 comentarios

Hi Bruno,
also, if i have as my maximizing problem: A*x smaller or equal to b?
If i reverse the sign of f, do i leave everything else unchanged?
Thanks!
No. I repeat : "don't touch the rest." leaving anything else unchanged, including A*x <= b
wait, i leave everything else unchanged even if i want to go from
max x for A*x smaller/equal to b to min x for A*x smaller/equal to b?
just reverse the f function?
"max x for A*x smaller/equal to b"
What is "max x ..."?
I speak about solving this
x = argmax f'*x
such that A*x <= b, Aeq*x = beq, lo <= x <= hi
which is equivalent to solving this
x = argmin (-f)'*x
such that A*x <= b, Aeq*x = beq, lo <= x <= hi
Thus my recommendation "reverse the sign of f. Don't touch the rest", which requires a single change (Method 1).
  • f => -f
You could also do this if you like
y = argmin f'*y
such that (-A)*y <= b, (-Aeq)*y = beq, -hi <= y <= -lo
x = -y
but it clearly much more modifications (4+1):
  • A => (-A)
  • Aeq => (-Aeq)
  • lo => -hi
  • hi => -lo
  • x => -y
Or if you reuse the same variable name x for x/y (Method 2)
x = argmin f'*x
such that (-A)*y <= b, (-Aeq)*y = beq, -hi <= y <= -lo
x = -x
The modifications (4+1) are:
  • A => (-A)
  • Aeq => (-Aeq)
  • lo => -hi
  • hi => -lo
  • x => -x
For a canonic form of LP
x = argmax f'*x
such that A*x <= b, x >= 0
(Method 3) It is also possible to solve the DUAL problem (2)
y = argmin b'*x
such that (-A'*y) <= -f, y >= 0
and finally x is retrieved as
x = Lagrange multiplier of (2)
  • f => b
  • A = -A'
  • b => -f
  • x => Lagrange multiplier of (2)
Example:
f = [6; 14; 13];
A = [0.5 2 1;
1 2 4];
b = [24; 60];
% Primal argmax, method 1
x = linprog(-f, A, b, [], [], zeros(size(f)), [])
% Primal argmax, method 2
x = linprog(f, -A, b, [], [], [], zeros(size(f)));
x = -x
% Dual formulation, method 3
[y, ~, ~, ~, lambda] = linprog(b, -A', -f, [], [], zeros(size(b)), []);
x = lambda.ineqlin
It is also possible formulate the dual for general case, but it gets a bit messy.
Great,
thanks a lot for your help!

Iniciar sesión para comentar.

Más respuestas (1)

Alan Stevens
Alan Stevens el 5 de Sept. de 2020
Minimize -x. The maximum of x will then be the negative of this.

2 comentarios

do you mean that f = -1 then?
How will my constraint vector b be in the minimizing case?
Thanks!
Unfortunately, I don't have linprog available to check, but have a look at https://uk.mathworks.com/help/optim/examples/maximize-long-term-investments-using-linear-programming.html where there is a maximizing problem that uses linprog.

Iniciar sesión para comentar.

Productos

Versión

R2019a

Etiquetas

Preguntada:

el 5 de Sept. de 2020

Comentada:

el 7 de Sept. de 2020

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by