我有一个包含70种食物的数据集,并提供有关每种食物的营养价值(蛋白质/盎司,脂肪/盎司,卡路里/盎司等)以及食品价格/盎司的信息。我想弄清楚(给定的预算为$),哪种食物(以及每种食物的适量)的最佳组合是最大程度地增加蛋白质,最小化脂肪,最小化卡路里等。我的目标是跨越一系列价格点,并绘制每个价格点。
我在这里找到了很多可以帮助解决此问题的软件包:http : //cran.r-project.org/web/views/Optimization.html。但是,我是一个初学者,不确定什么是最有用的/从哪里开始-是否会喜欢熟悉解决这类优化问题的任何人的一些建议。
这被称为饮食问题,它是线性编程的流行介绍(例如,参见我发现的饮食问题的第一个Google命中)。通过诸如的程序包的线性编程求解器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卡路里的热量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句