2015-06-15 15 views
5

ho appena controllare il semplice problema di programmazione lineare con scipy.optimize.linprog:programmazione lineare con 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 

e ottenuto il risultato molto strano, mi aspettavo che x [1] sarà essere 1 e x [2] saranno 5, ma:

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

qualcuno può spiegare, perché ho avuto questo strano risultato?

+4

Beh, non è più quello strano, una volta ti rendi conto che 'linprog 'in realtà minimizza :) – cel

risposta

12

optimize.linprog riduce sempre al minimo la funzione target. Se si vuole massimizzare invece, è possibile utilizzare tale 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' 
) 

Questo vi darà il risultato atteso, con il valore -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 
Problemi correlati