2015-06-15 27 views
5

Właśnie sprawdzić proste zadania programowania liniowego z scipy.optimize.linprog:programowanie liniowe z 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 

I dostał bardzo dziwne wyniki, spodziewałem się, że x [1] będzie być 1 i x [2] będzie 5, ale:

>>> 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 

Czy ktoś może wyjaśnić, dlaczego mam ten dziwny wynik?

+4

dobrze, to nie jest takie dziwne, już raz okazuje się, że 'linprog 'faktycznie minimalizuje :) – cel

Odpowiedz

12

optimize.linprog zawsze minimalizuje funkcję celu. Jeśli chcesz, aby zmaksymalizować zamiast tego można użyć, że 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' 
) 

To daje swój oczekiwany rezultat, o wartości -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