2017-10-16 2 views
1

私はこの最適化問題を持っていますが、列Xの一意の値に基づいて列zを最大化しようとしていますが、Xの一意の値のそれぞれがYの列を最大に加算したこのようになりますLpSolveを使用してRで線形計画最適化を設定しますか?

d=data.frame(x=c(1,1,1,2,2,2,3,3,3),y=c(9,7,5,9,7,5,9,7,5),z=c(25,20,5,20,10,5,10,5,3)) 

:例)例えば23

、私はこのサンプルデータを持っている

X Y Z 
1 1 9 25  
2 1 7 20 
3 1 5 5  
4 2 9 20  
5 2 7 10  
6 2 5 5  
7 3 9 10  
8 3 7 5    
9 3 5 5 

結果は次のようになります。

X Y Z 
1 1 9 25 
4 2 9 20  
9 3 5 5 

この問題をlpSolve :: lp関数で設定するにはどうすればよいですか?

あなたは、制約の2種類の対象に選択したオプションのz値の総和を最大化しようとしている
+0

何を試しましたか?あなたは既にLP対IPを考えましたか? – sascha

+0

本質的に私はソルバーを使ってExcelでこれをやっており、それをRに移動しようとしています。私はあなたがLPやIP(彼らが意味するもの)をかなり追っているわけではありません。私はこれを移動する方法を示すスタック内の他の例を見つけましたが、ピック制約の合計を使用する方法は含まれていませんでした。 – CooperBuckeye05

+0

あなたは(おそらく)純粋なリニアプログラムとしてそれを解決することはできません。混合整数プログラミング(これはlpsolveでサポートされています)が必要です。使用したいラッパーのドキュメントを読んで、必要な標準形式をチェックし、あなた自身で何かを試してください。 * picking *の性質は、バイナリ変数として定式化されます.x0が選択された場合、x0 = 1です。 3つのx候補のうちの1つだけを選ぶことは、x0 + x1 + x2 <= 1 (and > = 1である。 – sascha

答えて

3

  • 選択したオプションのためのyの値の合計が23
  • あなたを超えていませんあなたは、各オプションのバイナリ変数を作成し、lpSolveで解決することができ、それぞれ独自のx値

のための1つの値を選択します。

d=data.frame(x=c(1,1,1,2,2,2,3,3,3),y=c(9,7,5,9,7,5,9,7,5),z=c(25,20,5,20,10,5,10,5,3)) 
library(lpSolve) 
all.x <- unique(d$x) 
d[lp(direction = "max", 
    objective.in = d$z, 
    const.mat = rbind(outer(all.x, d$x, "=="), d$y), 
    const.dir = rep(c("==", "<="), c(length(all.x), 1)), 
    const.rhs = rep(c(1, 23), c(length(all.x), 1)), 
    all.bin = TRUE)$solution == 1,] 
# x y z 
# 1 1 9 25 
# 4 2 9 20 
# 9 3 5 3 
+0

これは素晴らしい作品です、ありがとうございます!私はあなたの助けに感謝します。私はまだこのパッケージを学んでいるうちに、コードを覚えて遊んで学びます。これは、(他の以前のコメント作成者とは対照的に)いくつかの方向性と助けを与える完璧な例です。再度、感謝します! – CooperBuckeye05

+0

これは新しいスレッドを必要とするかもしれませんが、all.xを1,1,2,3のように変更したい場合は(1つ以上の1がある場合)、どうすればよいですか?関数のconst.mat行を変更しますか?私はlp関数の他の部分を変更する必要がありますか? – CooperBuckeye05

+0

@ CooperBuckeye05現在、制約は各グループから1つに制限されています。特定の値に対して複数のものを許可したい場合は、 'const.rhs'をすべての1以外のものに変更するだけです。 – josliber

関連する問題