2015-06-15 5 views
5

Я просто проверить простую задачу линейного программирования с scipy.optimize.linprog:Линейное программирование с 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 

И получил очень странный результат, я ожидал, что х [1] будет быть 1 и х [2] будет 5, но:

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

Может кто-нибудь объяснить, почему я получил этот странный результат?

+4

Ну, это не так уж странно, больше, когда вы понимаете, что 'linprog 'фактически сводит к минимуму :) – cel

ответ

12

optimize.linprog всегда минимизирует вашу целевую функцию. Если вы хотите, чтобы максимизировать вместо этого, вы можете использовать это 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' 
) 

Это даст вам ваш ожидаемый результат, со значением -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 
Смежные вопросы