R中复现含二元选择变量的预算约束整数优化问题
0-1整数优化模型R复现:瞭望塔选址决策
问题说明
- 研究对象:共10个独立地块,地块大小等其余属性不参与计算
- 决策变量:各地块对应的二元变量Bᵢ,
Bᵢ=1表示在该地块建设瞭望塔,Bᵢ=0表示不建设 - 约束条件:所有建设瞭望塔的地块对应建设成本总和≤30
- 优化目标:最小化全部地块的期望价值(EV)总和
- 验证参照:已通过Excel Solver规划求解得到最优建设决策结果,可用于校验R代码输出正确性
EV计算规则
通用EV计算公式:
EV = 火灾发生概率(p) × 火灾发生时损失 + (1-p) × 无火灾时损失 + 建设成本(K)
结合场景规则可对公式做简化:
- 无火灾时损失固定为0
- 地块未建塔且发生火灾时,产生高损失H
- 地块已建塔且发生火灾时,仅产生低损失L
- 简化后单地块EV计算逻辑:
- 建塔时:
EV(B=1) = p*L + K - 不建塔时:
EV(B=0) = p*H
- 建塔时:
- 成本核算规则:仅地块建塔时计入对应建设成本K,不建塔时成本计为0
参数定义
- Plot i:序号为i的地块,i取值1到10
- H:未建塔地块发生火灾时产生的高损失值
- L:已建塔地块发生火灾时产生的低损失值
- p:单个地块的火灾发生概率
- K:单座瞭望塔的建设成本
- B:二元决策变量,取值为0或1,对应地块不建/建塔状态
R实现代码
该问题属于标准0-1整数线性规划问题,可直接通过lpSolve包求解,代码如下:
# 加载整数规划计算包 library(lpSolve) # ========== 替换为实际参数值 ========== plot_num <- 10 # 地块总数 p <- c() # 填入10个地块各自的火灾概率 H <- c() # 填入10个地块各自的高损失值 L <- c() # 填入10个地块各自的低损失值 K <- c() # 填入单座瞭望塔的建设成本(若每块地建塔成本一致可填rep(成本值,10)) budget_limit <- 30 # 总预算上限 # ====================================== # 构造目标函数系数 # 总EV整理后可拆分为固定项+决策变量线性项,固定项不影响最优决策求解 fixed_ev <- sum(p * H) obj_coef <- p*L + K - p*H # 构造预算约束 constraint_matrix <- matrix(K, nrow = 1) constraint_dir <- "<=" constraint_rhs <- budget_limit # 求解0-1整数规划 opt_result <- lp( direction = "min", objective.in = obj_coef, const.mat = constraint_matrix, const.dir = constraint_dir, const.rhs = constraint_rhs, all.bin = TRUE ) # 输出计算结果 total_opt_ev <- opt_result$objval + fixed_ev build_decision <- opt_result$solution total_cost <- sum(build_decision * K) print(paste0("最优方案总期望价值:", round(total_opt_ev, 2))) print(paste0("各地块建设决策(1=建塔,0=不建):", paste(build_decision, collapse = ", "))) print(paste0("总建设成本:", total_cost))
结果校验
代码输出的建设决策序列可直接和Excel Solver得到的结果比对,若参数填入一致,二者决策结果、总EV、总成本应当完全匹配。
内容的提问来源于stack exchange,提问作者StrugglingMastersStudent
相关产品推荐
相关产品推荐

