8

I've just check the simple linear programming problem with scipy.optimize.linprog:

1*x[1] + 2x[2] -> max

1*x[1] + 0*x[2] <= 5
0*x[1] + 1*x[2] <= 5
1*x[1] + 0*x[2] >= 1
0*x[1] + 1*x[2] >= 1
1*x[1] + 1*x[2] <= 6

And got the very strange result, I expected that x[1] will be 1 and x[2] will be 5, but:

>>> print optimize.linprog([1, 2], A_ub=[[1, 1]], b_ub=[6], bounds=(1, 5), method='simplex')
  status: 0
   slack: array([ 4.,  4.,  4.,  0.,  0.])
 success: True
     fun: 3.0
       x: array([ 1.,  1.])
 message: 'Optimization terminated successfully.'
     nit: 2

Can anyone explain, why I got this strange result?

1
  • 7
    Well, it's not that strange anymore once you realize that linprog actually minimizes :) Commented Jun 15, 2015 at 16:13

1 Answer 1

20

optimize.linprog always minimizes your target function. If you want to maximize instead, you can use that max(f(x)) == -min(-f(x))

from scipy import optimize

optimize.linprog(
    c = [-1, -2], 
    A_ub=[[1, 1]], 
    b_ub=[6],
    bounds=(1, 5),
    method='simplex'
)

This will give you your expected result, with the value -f(x) = -11.0

 slack: array([ 0.,  4.,  0.,  4.,  0.])
 message: 'Optimization terminated successfully.'
     nit: 3
       x: array([ 1.,  5.])
  status: 0
 success: True
     fun: -11.0
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.