R: Как решить следующую задачу линейного программирования

Меня интересует решение следующей задачи линейного программирования.

В этом примере с игрушкой второе ограничение говорит мне, что x1 <= -1, то есть x1 должно быть отрицательным, поэтому минимальное значение x1 должно быть отрицательным. Используя lpSolveAPI, я закодировал этот игрушечный пример.

library(lpSolveAPI)
my.lp <- make.lp(nrow = 2, ncol = 2)
set.column(my.lp, 1, c(1, 2))
set.column(my.lp, 2, c(3, 0))
set.objfn(my.lp, c(1, 0))
set.constr.type(my.lp, rep("<=", 2))
set.rhs(my.lp, c(-4, -2))
set.bounds(my.lp, lower = c(-Inf, -Inf), upper = c(Inf, Inf))
> my.lp
Model name: 
            C1    C2        
Minimize     1     0        
R1           1     3  <=  -4
R2           2     0  <=  -2
Kind       Std   Std        
Type      Real  Real        
Upper      Inf   Inf        
Lower     -Inf  -Inf 

Однако решение этой задачи линейного программирования в R дает мне

> solve(my.lp)
[1] 3
> get.variables(my.lp)
[1]   3.694738e-57 -2.681562e+154
> get.objective(my.lp)
[1] 1e+30

get.objective(my.lp) возвращает значение 1e+30 для x1, что явно не удовлетворяет второму ограничению. Я специально использовал set.bounds, чтобы x1, x2 мог принимать любое значение в реальной строке, но я все равно не получил отрицательного числа. Где что-то пошло не так?


person Adrian    schedule 29.01.2021    source источник
comment
Проблема, которую вы описываете, безусловна. x1 может быть бесконечно отрицательным. Таким образом, вы, вероятно, видите нежелательные результаты усилий решателя. Я не уверен, как вы проверяете статус решателя в r, но это должно дать некоторую информацию.   -  person AirSquid    schedule 30.01.2021
comment
Я понимаю. Можно ли вместо этого, чтобы решатель возвращал -Inf? Я открыт для использования другого пакета / функции, кроме lpSolveAPI. Спасибо.   -  person Adrian    schedule 30.01.2021
comment
Я не знаю каких-либо решателей, которые могут интуитивно дать хороший ответ на неограниченную проблему, но, возможно, у кого-то есть комментарий по этому поводу. В зависимости от решателя и интерфейса вы можете получить несколько сообщений о статусе работы по решению.   -  person AirSquid    schedule 30.01.2021
comment
Решающая программа останавливается до того, как фактически сделает шаг. Вы можете получить лучшие результаты, заменив границы -Inf и Inf большим числом, например 999999. Или просто посмотрите на код состояния. 3 означает: модель не ограничена (см. Документацию)   -  person Erwin Kalvelagen    schedule 30.01.2021
comment
Выход 3 из solve говорит вам, что он неограничен. См. Коды ?solve.lpExtPrtr.   -  person G. Grothendieck    schedule 30.01.2021