R中的优化:最大化和最小化许多变量

时间:2015-05-29 20:46:43

标签: r ggplot2 mathematical-optimization minimize maximize

我有一个包含70种食物的数据集,以及每种食物的营养价值(蛋白质/盎司,脂肪/盎司,cals / oz等)以及食物的信息。成本/盎司。我想弄清楚 - 给定一个预算在$ - 什么是最好的食物组合(和每种食物的amt。)将最大化蛋白质,减少脂肪,减少卡路里等。我的目标是这样做跨越一系列价格点,并绘制每个价格点。

我找到了一大堆不同的软件包可以帮助解决这个问题:http://cran.r-project.org/web/views/Optimization.html。但是,我是一个初学者,并不确定什么是最有用的/从哪里开始 - 会喜欢熟悉解决这些优化问题的人的一些建议。

1 个答案:

答案 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卡路里。