如何在R中求解约束下的最优生产数量以最大化利润?
约束条件下利润最大化的R语言求解问题修正
问题背景
- 产品原料需求:
- 户外产品X:每单位需消耗原料M1=5、M2=2、M3=3
- 室内产品Y:每单位需消耗原料M1=6、M2=1、M3=3
- 原料总量限制:
- M1总量不超过26,M2不超过12,M3不超过15
- 利润计算规则:
- 室内产品Y每单位利润70000,总利润为
70000*y - 户外产品X利润分段计算:前4单位每单位60000,超过4的部分每单位80000,总利润为
60000*min(4,x) + 80000*max(x-4,0)
- 室内产品Y每单位利润70000,总利润为
原代码的核心问题
- 约束判断逻辑完全搞反:原代码用
|(或)判断,且条件写反了——应该是任何约束不满足时返回-Inf,但原代码是满足约束就返回-Inf - 目标函数错误:原函数返回的是总产量
production,但我们要最大化的是总利润total_profit - 原料需求计算错误:Y的M3需求被写成了2,实际应为3
- 约束逻辑混乱:原代码里的
y ≤5和prod_vec[1]>0、prod_vec[2]>0逻辑错误,生产数量应为非负(x≥0、y≥0),y≤5需作为约束正确加入
修正后的代码
# 定义目标函数:最大化总利润,不满足约束则返回-Inf total_profit_fun <- function(prod_vec){ x <- prod_vec[1] # X的生产数量 y <- prod_vec[2] # Y的生产数量 # 计算总利润 profit_indoor <- 70000 * y profit_outdoor <- 60000 * min(4, x) + 80000 * max(x - 4, 0) total_profit <- profit_indoor + profit_outdoor # 计算原料总需求 m1_needed <- x * 5 + y * 6 m2_needed <- x * 2 + y * 1 m3_needed <- x * 3 + y * 3 # 修正Y的M3需求为3 # 约束检查:违反任何一项则返回-Inf # 约束包括:原料不超限、x≥0、y≥0、y≤5 if(m1_needed > 26 || m2_needed > 12 || m3_needed > 15 || x < 0 || y < 0 || y > 5){ return(-Inf) } else { return(-total_profit) # optim默认最小化,最大化利润需返回负利润 } } # 测试可行解 feasible_sol <- c(2, 2) cat("可行解(2,2)的总利润:", -total_profit_fun(feasible_sol), "\n") # 测试不可行解 infeasible_sol <- c(10, 12) cat("不可行解(10,12)的返回值:", total_profit_fun(infeasible_sol), "\n") # 使用L-BFGS-B方法求解,设置变量边界(x≥0,y≥0且y≤5) result <- optim(par = feasible_sol, fn = total_profit_fun, method = "L-BFGS-B", lower = c(0, 0), upper = c(Inf, 5)) # 输出最优结果 cat("最优生产数量:X=", round(result$par[1], 2), ", Y=", round(result$par[2], 2), "\n") cat("最大总利润:", -result$value, "\n")
关键修正点说明
- 约束逻辑修正:用
||判断是否违反约束,只要有一项约束不满足就返回-Inf,保证只有合法解才会输出有效利润 - 目标函数对齐:因为
optim默认是最小化问题,所以要最大化利润,就返回负的总利润,让optim找到最小值对应的负利润,也就是最大的实际利润 - 原料计算修正:把Y的M3需求从2修正为3,匹配问题描述
- 优化方法选择:选用
L-BFGS-B方法,支持设置变量的上下边界,更适合有非负约束和y≤5约束的优化场景
内容的提问来源于stack exchange,提问作者MohnJulheren
相关产品推荐
相关产品推荐

