我有一个包含70种食物的数据集,以及每种食物的营养价值(蛋白质/盎司,脂肪/盎司,cals / oz等)以及食物的信息。成本/盎司。我想弄清楚 - 给定一个预算在$ - 什么是最好的食物组合(和每种食物的amt。)将最大化蛋白质,减少脂肪,减少卡路里等。我的目标是这样做跨越一系列价格点,并绘制每个价格点。
我找到了一大堆不同的软件包可以帮助解决这个问题:http://cran.r-project.org/web/views/Optimization.html。但是,我是一个初学者,并不确定什么是最有用的/从哪里开始 - 会喜欢熟悉解决这些优化问题的人的一些建议。
答案 0 :(得分:4)
这被称为饮食问题,它是线性编程的流行介绍(参见,例如,the first Google hit I found for the diet problem)。通过诸如lpSolve
之类的包的线性编程求解器可用于解决饮食问题的许多变体。
例如,请考虑上面链接中的问题版本,您可以从中选择以下食物:
(food <- data.frame(Food=c("Corn", "2% Milk", "Wheat Bread"), CostPerServing=c(.18, .23, .05), VitaminA=c(107, 500, 0), Calories=c(72, 121, 65)))
# Food CostPerServing VitaminA Calories
# 1 Corn 0.18 107 72
# 2 2% Milk 0.23 500 121
# 3 Wheat Bread 0.05 0 65
假设您想要查找每种食物的份数,以最大限度地降低总成本,但总卡路里必须在2000到2500之间且维生素A的量必须在5000到50000之间。如果你定义变量X1,X2和X2,那么你的目标是.18 * X1 + .23 * X2 + .05 * X3,变量的线性函数。类似地,每个约束在变量的线性函数中;例如,卡路里数量的下限是形式72 * X1 + 121 * X2 + 65 * X3> = 2000的约束。
来自lp
包的lpSolve
函数将指示目标值中的系数的向量和有关约束的信息(约束矩阵,每个约束的方向和右侧)作为输入。每个约束的手边)。对于所述问题,这将是:
library(lpSolve)
mod <- lp("min", # min/max
food$CostPerServing, # Objective
rbind(food$VitaminA, food$VitaminA, food$Calories, food$Calories), # Constraint matrix
c(">=", "<=", ">=", "<="), # Constraint directions
c(5000, 50000, 2000, 2500))
模型解决后,您可以查看目标函数和值:
mod$objval
# [1] 2.907692
mod$solution
# [1] 0.00000 10.00000 12.15385
sum(food$VitaminA * mod$solution)
# [1] 5000
sum(food$Calories * mod$solution)
# [1] 2000
满足限制条件的最便宜的成本是2.91美元,你可以通过使用0份玉米,10份2%牛奶和12.15份小麦面包来达到这个目的。这产生了5000单位的维生素A和2000卡路里。