2017-11-20 16 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であることがわかります。

私はまた、代わりに「分」であることを客観的に設定してみました、そして私が手:

> 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値を設定していなかったということです