使用 R 进行优化:概念、起源、应用与案例研究
Source: Dev.to
优化的起源
数学优化领域可以追溯到 17 世纪,当时牛顿和莱布尼茨等数学家奠定了微积分的基础。早期的优化问题涉及寻找函数的最大值或最小值,随后逐步扩展到更复杂的多变量约束问题。
到 20 世纪初,优化通过运筹学获得了显著关注,尤其是在二战期间,各国需要有效分配有限的军事资源。线性规划由乔治·丹齐格在 1947 年提出 simplex 方法正式化,彻底改变了工业界处理资源分配的方式。
随着计算能力的提升,优化从理论数学转向广泛的实际应用。借助 R 等编程语言,优化变得对分析师、数据科学家和各领域研究者更加易用。
什么是优化?
优化指的是从一组可用备选方案中选择最佳解的过程。它包括:
- 目标函数 – 例如,最大化利润、最小化成本
- 决策变量 – 我们可以操控的输入
- 约束条件 – 资源、时间等限制
- 最优解 – 满足约束并产生最佳结果
优化问题通常分为两类:
- 无约束优化 – 决策变量可以在其定义域内取任意值。
- 有约束优化 / 线性规划 (LP) – 对变量施加限制或约束。
R 通过 optim() 函数以及 lpSolve、lpSolveAPI 等包同时支持这两类优化。
R 中的无约束优化
无约束优化是在没有限制条件的情况下寻找函数的最小值或最大值。R 提供了内置的 optim() 函数来求解此类问题。
示例
# Define the objective function
f <- function(x) 4 * (x[1] - 1)^2 + 7 * (x[2] - 3)^2 + 30
# Starting point
c0 <- c(1, 1)
# Run optimization
result <- optim(c0, f)
# Display results
result$par # Optimal parameters
result$value # Minimum value of the function
result$convergence # 0 indicates successful optimization
输出显示最优参数接近 (1, 3),函数最小值为 30,收敛状态为 0(表示优化成功)。
线性规划简介
线性规划(LP)专注于在线性约束下优化线性目标函数。它广泛用于资源分配、生产计划、运输、能源管理和排程等领域。
LP 问题的结构如下:
- 目标函数 – 最大化或最小化
- 决策变量 – 如
y1, y2, … - 约束条件 – 线性不等式或等式
- 非负性 –
y1 ≥ 0, y2 ≥ 0
像 lpSolve 这样的包使得在 R 中实现 LP 既简单又直观。
优化的实际应用
1. 供应链与物流
- 仓库选址
- 配送路线规划
- 库存管理
- 运输成本最小化
2. 制造业
- 生产排程
- 减少废料
- 机器利用率最大化
3. 金融
- 在收益、风险和市场约束之间平衡的投资组合构建(二次规划)
4. 农业
- 考虑土地面积、作物价格、资源约束和劳动力的种植策略
5. 医疗保健
- 护士排班
- 病人等待时间缩短
- 医院床位分配
案例研究 1:产品组合优化
某公司生产两种产品 A 和 B,售价分别为 $25 和 $20。资源和时间约束如下:
- 可用资源:1800 单位
- 可用时间:8 小时(480 分钟)
- 产品 A 需要 20 单位资源;B 需要 12 单位资源
- 两者均需 4 分钟的生产时间
目标: 最大化收入
[ \text{Revenue} = 25y_1 + 20y_2 ]
约束条件
[ \begin{aligned} 20y_1 + 12y_2 &\le 1800 \ 4y_1 + 4y_2 &\le 480 \ y_1, y_2 &\ge 0 \end{aligned} ]
在 R 中求解(lpSolve)
library(lpSolve)
objective.in <- c(25, 20) # Coefficients of the objective
const.mat <- matrix(c(20, 12, 4, 4), nrow = 2, byrow = TRUE)
rhs <- c(1800, 480)
dir <- c("<=", "<=")
optimum <- lp("max", objective.in, const.mat, dir, rhs)
# Results
optimum$solution # Production quantities (y1, y2)
optimum$objval # Maximum revenue
最优生产方案
- 产品 A:45 单位
- 产品 B:75 单位
- 最大收入:$2,625
案例研究 2:农业优化问题
一位农民拥有 75 英亩土地,想要种植小麦 (x) 和大麦 (y)。LP 模型考虑了种植成本、每蒲式耳利润、每英亩产量以及储存约束。
目标: 最大化利润
[ \text{Profit} = 143x + 60y ]
约束条件
[ \begin{aligned} 120x + 210y &\le 15000 \quad \text{(种植成本)}\ 110x + 30y &\le 4000 \quad \text{(储存限制)}\ x + y &\le 75 \quad \text{(土地限制)}\ x, y &\ge 0 \end{aligned} ]
在 R 中求解(lpSolveAPI)
library(lpSolveAPI)
lprec <- make.lp(0, 2) # 0 constraints, 2 decision variables
lp.control(lprec, sense = "max") # Maximization problem
set.objfn(lprec, c(143, 60)) # Objective coefficients
add.constraint(lprec, c(120, 210), "<=", 15000) # Planting cost
add.constraint(lprec, c(110, 30), "<=", 4000) # Storage limit
add.constraint(lprec, c(1, 1), "<=", 75) # Land limit
solve(lprec) # Solve the model
get.variables(lprec) # Optimal acres (x, y)
最优耕种面积
- 小麦:21.875 英亩
- 大麦:53.125 英亩
- 最大利润:$6,315.63
为什么使用 R 进行优化?
- 内置函数(
optim())和强大的库(lpSolve、lpSolveAPI、ROI、nloptr 等) - 可使用
ggplot2等工具直观展示约束和解 - 与统计建模、数据处理流水线无缝集成
- 开源、跨平台,拥有庞大的社区支持
结论
优化在现代决策中扮演关键角色,涉及制造、物流、农业、金融等众多行业。借助 R,实施优化模型变得更加便捷和实用,得益于其数学计算能力和友好的软件包。通过掌握核心概念、学习真实案例并进行实践,你即可自信地解决自己的优化问题。无论是最大化利润、最小化成本,还是在资源受限的情况下进行分配,R 中的优化工具都能帮助你做出更聪明、更高效的决策。