2017-11-20 17 views
1

R "lpSolve"패키지 downloaded from Cran link을 사용하고 있는데 이상한 대답을하는 것 같습니다. 나는 물건을 어지럽히는 것이 아닌지 확인하기를 원했다.lpSolve 패키지가 이상한 결과를 나타냄

예를 들어, 내가 해결하기 위해 노력하고있는 문제는 R에있는

maximize -3x-2y 
s.t  5x -y <= 1 
     -2x-2y <= -1 
     -3x-2y <= 0 

설정입니다 : lp.solve에서 LP 기능에 적용이와

> obj 
    -3 -2 
> cond 
    5 -1 
    -2 -2 
    -3 -2 
> dir 
    "<=" "<=" "<=" 
> rhs 
    1 -1 0 

> lp(direction="max", objective.in=obj, const.mat=cond, const.dir=dir, const.rhs=rhs)$objval 

이 값은 -1을 반환하지만 해결 방법은 -1 대신 0입니다.

는 대신 "분"으로 목표를 설정 시도 I, 내가 얻을 :

> lp(direction = "max", objective.in = obj, const.mat = cond, const.dir = dir, const.rhs = rhs)$objval 
[1] -1 
> lp(direction = "min", objective.in = obj, const.mat = cond, const.dir = dir, const.rhs = rhs)$objval 
[1] 0 

어떻게 내가 목표를 최소화하려고 할 때 더 큰 가치를 얻을 가능성이있다? x와 음수 계수와 관련이 있습니까? 패키지 설명서를 살펴본 결과 목적 함수에 대한 관련 요구 사항이 없습니다.

답변

3

당신은 맞습니다. (x, y) = (-1, 1.5)은 객관적인 값인 0을 산출합니다. 이것은 제약 조건에서 분명히 최대 값입니다.

?lp에 다음 라인 얻기에서 당신을 다시 구금되는 일이 : 모든 변수가> = 0로 가정된다

주의!

모든 변수가 음수가 아니라는 가정하에 실제로 -1은 사용자가 할 수있는 최선의 결과입니다.

, 당신은 x+ 음이 아닌 의사 결정 변수를 정의 할 수 있습니다 원래의 문제를 해결하고 x-x의 양극과 음극 부분을 나타내며, y에 대해 동일한 작업을 수행 할 수 있습니다. 모든 경우에

mod <- lp(direction = "max", 
      objective.in = c(obj, -obj), 
      const.mat = cbind(cond, -cond), 
      const.dir = dir, 
      const.rhs = rhs) 
mod$objval 
# [1] 0 
mod$solution[1:2] - mod$solution[3:4] 
# [1] -1.0 1.5 

, 변수의 비 부정적 요구 사항을 제거하고 다른 같은 모든 것을 유지하고 여기에 사용되는 변환의 효과 : 여기에 결과 최적화 모델입니다.

lp(direction = "min", objective.in = obj, const.mat = cond, const.dir = dir, const.rhs = rhs) 
# Error: status 3 
:

마지막으로, 그것은 당신에게 0의 목표 값을주고 있었다처럼 최소화 모습 이유는 실제로 무제한의의와 그 응답으로 objval 값을 설정하지 않은 것입니다