0

ダイエットの問題を解決するために使用している 135 種類の食品のデータセットがあります: コストを最小化し、栄養価を最大化します。たとえば、ジャガイモを 80 食分、ホウレンソウを 50 食分だけ食べるように指示するモデルではなく、さまざまな食品を含むモデルを作成したいと考えています。次のいずれかを行います。

1)他の変数(食品グループなど)の上限と下限を変更せずに、食品のサービング数に上限を設定します(つまり、各食品の最大10サービング)。

2) モデルに必要な食品 (/変数) の最小数を指定できるようにする

現在、繊維、カロリー、オンスの最小値と最大値を指定することに加えて、モデル内のすべての変数を書き出しています。果物、オンス。野菜など:

minCost <- lp("min", SNAP$costPerServ,
           rbind(SNAP$protPerServ, SNAP$protPerServ, SNAP$fatPerServ,
 SNAP$fatPerServ, SNAP$costPerServ, SNAP$costPerServ, SNAP$sodiumPerServ,
 SNAP$sodiumPerServ, SNAP$fiberPerServ, SNAP$fiberPerServ, SNAP$sugarPerServ,
 SNAP$sugarPerServ, SNAP$calsPerServ, SNAP$calsPerServ, SNAP$fruit,     SNAP$vegs,
 SNAP$grains, SNAP$grains, SNAP$meatProtein, SNAP$dairy, SNAP$X1, SNAP$X2,
 SNAP$X3, SNAP$X4, SNAP$X5, SNAP$X6, SNAP$X7, SNAP$X8, SNAP$X9, ... [more foods
 here] ..., SNAP$X135),
           c(">=", "<=", ">=", "<=", ">=", "<=", ">=", "<=", ">=", "<=", ">=",
 "<=", ">=", "<=", ">=", ">=", ">=", "<=", ">=", ">=",
 "<=", "<=", "<=", "<=", "<=", "<=", "<=", "<=", "<=",
 "<=", ...[more "<="s here]..., "<="),
           c(input$prot[1]*7, input$prot[2]*7, input$fat[1]*7, input$fat[2]*7,
 input$budget[1], input$budget[2], input$sodium[1]*7, input$sodium[2]*7,
 input$fiber[1]*7, input$fiber[2]*7, input$sugar[1]*7, input$sugar[2]*7,
 input$cals[1]*7, input$cals[2]*7, 16, 28, 9, 25, 6.4, 24, input$serv,
 input$serv, input$serv, input$serv, input$serv, input$serv, input$serv,
 input$serv, input$serv, input$serv, ...[more input$servs here]...,
 input$serv))

これには光沢のあるパッケージを使用したため、具体的な数値ではなく「input$serv」になっています。ユーザーは、スライダー ウィジェットを使用してサービングの最大数を選択できます。デフォルトは 10 です。

モデルの元になる食品の栄養情報は、別の csv ファイルにあります。

glimpse(SNAP)
観測: 135
変数:
$ food (fctr) コカコーラ、サクラメント トマト ジュース、トロピカーナ Trop50 オレンジ ジュース、V8 ベジ...
$ foodGroup (fctr) 飲料、飲料、飲料、飲料、乳製品、乳製品、乳製品、乳製品、乳製品...
$ calsPerServ (dbl) 140.0, 35.0, 50.0, 50.0, 90.0, 90.0, 102.4, 150.0, 90.0, 90.0, 113.0, 50.0...
$ ozPerServ (dbl) 12.000000, 6.000000, 00,0 8.0 , 2.500000, 4.070000, 8.000000, 8.0...
$ fatPerServ (dbl) 0.00, 0.00, 0.00, 0.00, 5.00, 1.00, 0.24, 8.00, 0.00, 0.00, 9.00, 3.00, 7....
サーブ (d protPer) 0.0、1.0、1.0、2.0、8.0、16.0、7.2、8.0、6.0、3.0、7.0、4.0、2.0、2.0、6.0...
$sodiumPerServ (dbl) 45.00、560.00、10.00、590.00、80.00、360.00、120.80、120.00、100.00、60.00...
$ fiberPerServ (dbl) 0.0、1.0、0.0、2.0、0.0、0.0、0.0、.0. 0.0, 0.0, 0.0, 0.0, 0.0, 1.0,...
$ sugarPerServ (dbl) 39.00, 4.90, 10.00, 8.00, 0.00, 3.00, 11.20, 11.00, 12.00, 14.00, 0.00, 1....
$ costPerServ ( dbl) 0.4800000, 0.2400000, 0.5600000, 0.4737500, 0.1750000, 0.4884000, 0.240000...
$ グレイン (dbl) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
$ oilsFats (dbl) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
$フルーツ (dbl) 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000 、0.00000、0.00000、0....
$ 砂糖 (dbl) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0,...
$ 肉タンパク質 (dbl) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0,...
$ bev (整数) 12, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ vegs (dbl) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
$ 乳製品 (dbl) 0.000000, 0.000000, 0.000000, 0.000000, 2.500000, 4.070000, 8.000000, 8.00...
$ X1 (int) 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0,...
$ X2 (整数) 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 、0、0、0、0、0、0、0、0、...
$ X3 (整数) 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 、0、0、...

4

1 に答える 1

0

さて、SNAP データのソース ファイルがないので、私は独自の食品/栄養マトリックスを思いつきました. 問題に適応する方法が簡単にわかるはずです。これは非常に基本的なシンプレックス線形最適化問題です。各食品は、コスト、1 人あたりの最小および最大サービング、栄養成分 (現在はビタミン A と kCals に制限されています) の観点から定義されています。2つの栄養成分で5列あります。42 の栄養成分がある場合、45 列になります。

2 番目のマトリックス、最小および最大推奨日当 (RDA) には、各最小/最大 RDA の行があります。

とうもろこし、牛乳、パン、ソイレントの 4 つの食品の R コードは次のとおりです。

library(lpSolveAPI)

# Diet options (index, cost, min servings, max servings, vitA, calories)
food.corn <- c(0.18, 0, 10, 107, 72)
food.milk <- c(0.23, 0, 10, 500, 121)
food.bread <- c(0.05, 0, 10, 0, 65)
food.soylent <- c(0.50, 0, 10, 625, 250)

foods <- matrix(c(food.corn, food.milk, food.bread, food.soylent), 4, 5, byrow=TRUE)

# Recommended Daily Allowance (min, max)
rda.vitA <- c(5000, 50000)
rda.cal <- c(2000, 2250)

rdas <- matrix(c(rda.vitA, rda.cal), 2, 2, byrow=TRUE)

nr <- length(foods[,1])
varcount <- nr
const.count <- 0
lp <- make.lp (0, varcount, verbose="normal")
lp.control (lp, sense="min")
set.objfn (lp, foods[,1])

for (i in length(rdas[,1])) {
    add.constraint (lp, foods[,(3+i)], ">=", as.double(rdas[i,1]))
    add.constraint (lp, foods[,(3+i)], "<=", as.double(rdas[i,2]))
    const.count <- const.count + 1
}

for (i in nr) {
    add.constraint (lp, c(rep(0,i-1), 1, rep(0,nr-i)), ">=", as.double(foods[i,2]))
    add.constraint (lp, c(rep(0,i-1), 1, rep(0,nr-i)), "<=", as.double(foods[i,3]))
    const.count <- const.count + 1
}

set.bounds (lp, lower=foods[,2], upper=foods[,3])
set.type (lp, 1:varcount, type="integer")
resize.lp (lp, const.count, varcount)

if (solve (lp) == 0) {
    lps.out <- list(solution=get.variables(lp), objective=get.objective(lp))
} else {
    print ("No feasible solution")
    lps.out <- NA
}

味わう季節...

于 2015-08-06T10:52:09.977 に答える