6

私はかなりRに慣れています。私はExcelでSolverと何をしていたかのスクリプトを書こうとしています。私のデータには、仕事の種類がA〜Eの労働者のリストがあります。各労働者には給与と生産率があります。私が欲しいのは、累積給与が10万人で、最大の生産量を見つけることです。< 100,000です。制約は、私が10人の労働者の正確な合計が必要であり、私は仕事のタイプAからD、Eから1、そしてどのタイプのものでも2つが必要であるということです。Rを使って仕事のために最良の人を解決/選ぶにはどうすればいいですか?

私は、optim、IpSolveなどでこれを行う方法を検索して検索しましたが、私の限られた知識で私は多くの運がありませんでした。

ありがとうございました!

Name Pos Salary Producton 
Joe  A 12001 13.1 
Jim  A 17753 23.5 
Jill A 11447 14.8 
Brian A 11447 14.8 
Sally B 2171 1.2 
Nancy B 4537 2.1 
Francis B 2840 1.8 
Ace  B 2840 1.8 
Bill C 3818 1.6 
Ted  C 11447 0.1 
Henry C 2000 1.1 
Kyle C 3818 1.6 
Sam  D 11447 0.1 
Trevor D 2000 1.1 
John D 4317 11.7 
Jerome D 2000 1.1 
Rebecca E 3818 1.6 
Sunny E 11447 0.1 
Britt E 2000 1.1 
Sara E 4317 11.7 
+0

はい、最低2です。ありがとうございました! –

+0

考えてみましょう:(20,10)= 184756を選んでください。そうすれば、この小さなケースで可能なすべての組み合わせをテストする時間はかかりません。もちろん、これは宿題で、ソルバーを使用する必要があります。 –

+0

幸いにも宿題ではありませんが、完全なリストには300人以上の人がいます。私の間違い、私は元のポストでそれを言及すべきでした。 –

答えて

6

lpSolveパッケージでlpを使用すると、基本的な整数プログラミングの問題を解決できます。最初の5つの制約はそれぞれA、B、C、D、Eのポジションにあり、6番目は選択するスタッフの数であり、7番目は合計給与にある。

library(lpSolve) 

obj <- DF$Prod 
con <- rbind(t(model.matrix(~ Pos + 0, DF)), rep(1, nrow(DF)), DF$Salary) 
dir <- c(">=", ">=", ">=", ">=", ">=", "==", "<") 
rhs <- c(2, 2, 2, 2, 1, 10, 100000) 

result <- lp("max", obj, con, dir, rhs, all.bin = TRUE) 

与える:生産は問題のスペルが間違っているか、おそらくそれが意図されていた

> result 
Success: the objective function is 84.7 
> DF[result$solution == 1, ] 
    Name Pos Salary Producton 
2  Jim A 17753  23.5 
3 Jill A 11447  14.8 
4 Brian A 11447  14.8 
6 Nancy B 4537  2.1 
8  Ace B 2840  1.8 
9 Bill C 3818  1.6 
12 Kyle C 3818  1.6 
14 Trevor D 2000  1.1 
15 John D 4317  11.7 
20 Sara E 4317  11.7 

注意をDFと仮定すると、質問に示したデータフレームはこれを試してさ。

を追加しました:アイデアは実行不可能最善の解決策になりますが、他の潜在的な解決策を排除するものではない制約を追加することである第二の最善の解決策について

:この場合

con2 <- rbind(con, result$solution) 
dir2 <- c(dir, "<=") 
rhs2 <- c(rhs, 9) 
result2 <- lp("max", obj, con2, dir2, rhs2, all.bin = TRUE) 

を我々は次を得ます最良の解と同じ最適な客観的価値を持っているので、それと同じように良いでしょう:

> result2 
Success: the objective function is 84.7 
> DF[result2$solution == 1, ] 
    Name Pos Salary Producton 
2  Jim A 17753  23.5 
3 Jill A 11447  14.8 
4 Brian A 11447  14.8 
6 Nancy B 4537  2.1 
8  Ace B 2840  1.8 
9 Bill C 3818  1.6 
12 Kyle C 3818  1.6 
15 John D 4317  11.7 
16 Jerome D 2000  1.1 
20 Sara E 4317  11.7 

にも引数がありますは、複数の溶液を直接生成することを可能にする。ただし、ヘルプファイルにはいくつかのバグがあり、上記の方法をとる方が安全かもしれません。

+0

すごい、ありがとう!ケーキのアイシングとして、2番目に良い解決策を得る方法はありますか? –

+0

質問:私は1)メリット、すなわち生産/給与を計算する、2)必要なすべてのカテゴリ(AE)からトップFOM候補を取得する、3)残りのスロットを残りのFOMで埋める値。それは本質的に 'lpSolve'がやっていることですか? –

+0

@Derek、2番目に優れたソリューションを追加しました。 @Carl、 'lp'はブランチアンドバインドアルゴリズムを使用します。 –

関連する問題