удаление неявной границы, помещенной в задачу линейного программирования - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь использовать функцию линейного программирования из библиотеки Сципиона питонов, однако я не могу удалить ограничение неотрицательности, наложенное на переменную. Чтобы продемонстрировать это, рассмотрим следующий код.

from scipy.optimize import linprog

c = [-1]
A = [[1]]
b = [-3]
print(linprog(c, A_ub=A, b_ub=b, bounds=None))

это дает следующий вывод:

     fun: 3.0
 message: 'Optimization failed. Unable to find a feasible starting point.'
     nit: 0
  status: 2
 success: False
       x: nan

Это должна быть формулировка следующей задачи: минимизировать c * x так, чтобы Ax≤b или эквивалентно минимизировать -1 * x st. 1x≤-3. Надеюсь, я сделал это правильно. Основываясь на токовом выходе, я подозреваю, что существует дополнительное ограничение, что x≥0. Я не знаю, как снять это ограничение.

Я установил границы на None при том понимании, что это означает, что никакие дополнительные границы не ставятся для задачи, кроме Ax≤b, однако явно существует и другая граница для задачи. Как я могу удалить эту границу? Спасибо

1 Ответ

1 голос
/ 12 апреля 2019

Вы не первый, кого это смущает - строка документации должна объяснить это лучше.

Когда вы используете bounds=None, вы говорите linprog использовать поведение по умолчанию, которое предполагает наличие неотрицательного ограничения. Только установив bounds на что-то другое, можно изменить поведение по умолчанию. В этом случае bounds=(None, None) удалит границу для каждой переменной.

In [40]: from scipy.optimize import linprog                                                                                                                                              

In [41]: c = [-1]                                                                                                                                                                        

In [42]: A = [[1]]                                                                                                                                                                       

In [43]: b = [-3]                                                                                                                                                                        

In [44]: print(linprog(c, A_ub=A, b_ub=b, bounds=(None, None)))                                                                                                                          
     con: array([], dtype=float64)
     fun: 3.0
 message: 'The solution was determined in presolve as there are no non-trivial constraints.'
     nit: 0
   slack: array([0.])
  status: 0
 success: True
       x: array([-3.])
...