You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何排查R线性规划优化模型的编码错误以获取正确结果

线性规划LP模型与R代码错误排查

问题背景

某工厂使用棉花(Cotton)、羊毛(Wool)、丝绸(Silk)三种原料生产Spring、Autumn、Winter三种产品,参数如下:

产品售价与生产成本

产品售价生产成本
Spring605
Autumn553
Winter605

原料采购价

原料采购价
Cotton30
Wool45
Silk50

产品需求与原料占比要求

产品最大需求量棉花最小占比羊毛最小占比
Spring33000.550.30
Autumn36000.450.40
Winter40000.300.50

建模与代码错误分析

1. 核心错误:占比约束未正确转化为线性不等式

建模阶段写出的占比约束逻辑正确,但R代码实现时完全偏离原约束:

  • 以Spring产品棉花占比约束为例,原约束为1c ≥ 0.55*(1c+1w+1s),整理成标准线性约束应为0.45*1c - 0.55*1w - 0.55*1s ≥ 0
  • 你的代码中写成add.constraint(model2, c(0.55, 0, 0, 0, 0, 0, 0, 0, 0), ">=", 0),仅要求0.55*1c ≥0,完全没有体现原料占比限制,这是导致全用棉花的不合理结果的直接原因。
  • 所有原料占比约束都存在该错误。

2. 非负约束冗余且错误

add.constraint(model2, rep(0, 9), ">", 0) 是无效且错误的约束:

  • 该约束等价于0 > 0,属于矛盾约束;
  • make.lp函数默认所有决策变量非负,无需额外添加非负约束,直接删除即可。

3. 目标函数可简化(可选优化)

原目标函数计算逻辑正确,但可通过合并同类项简化系数计算:

  • Spring棉花:(60-5)-30=25;Spring羊毛:(60-5)-45=10;Spring丝绸:(60-5)-50=5
  • Autumn棉花:(55-3)-30=22;Autumn羊毛:(55-3)-45=7;Autumn丝绸:(55-3)-50=2
  • Winter棉花:(60-5)-30=25;Winter羊毛:(60-5)-45=10;Winter丝绸:(60-5)-50=5
    简化后系数更清晰,避免计算失误。

修正后的R代码

# 加载lpSolve包
library(lpSolve)

# 定义LP模型:9个决策变量
model2 <- make.lp(0, 9)
lp.control(model2, sense = "max")

# 目标函数系数:[Spring棉, Spring毛, Spring丝, Autumn棉, Autumn毛, Autumn丝, Winter棉, Winter毛, Winter丝]
obj.coefs <- c(25, 10, 5, 22, 7, 2, 25, 10, 5)
set.objfn(model2, obj.coefs)

# 添加产品总量约束(最大需求量)
add.constraint(model2, c(1, 1, 1, 0, 0, 0, 0, 0, 0), "<=", 3300) # Spring总量
add.constraint(model2, c(0, 0, 0, 1, 1, 1, 0, 0, 0), "<=", 3600) # Autumn总量
add.constraint(model2, c(0, 0, 0, 0, 0, 0, 1, 1, 1), "<=", 4000) # Winter总量

# 添加棉花最小占比约束
# Spring: 1c >= 0.55*(1c+1w+1s) → 0.45*1c -0.55*1w -0.55*1s >=0
add.constraint(model2, c(0.45, -0.55, -0.55, 0, 0, 0, 0, 0, 0), ">=", 0)
# Autumn: 2c >=0.45*(2c+2w+2s) → 0.55*2c -0.45*2w -0.45*2s >=0
add.constraint(model2, c(0, 0, 0, 0.55, -0.45, -0.45, 0, 0, 0), ">=", 0)
# Winter:3c >=0.3*(3c+3w+3s) →0.7*3c -0.3*3w -0.3*3s >=0
add.constraint(model2, c(0, 0, 0, 0, 0, 0, 0.7, -0.3, -0.3), ">=", 0)

# 添加羊毛最小占比约束
# Spring:1w >=0.3*(1c+1w+1s) →-0.3*1c +0.7*1w -0.3*1s >=0
add.constraint(model2, c(-0.3, 0.7, -0.3, 0, 0, 0, 0, 0, 0), ">=", 0)
# Autumn:2w >=0.4*(2c+2w+2s) →-0.4*2c +0.6*2w -0.4*2s >=0
add.constraint(model2, c(0, 0, 0, -0.4, 0.6, -0.4, 0, 0, 0), ">=", 0)
# Winter:3w >=0.5*(3c+3w+3s) →-0.5*3c +0.5*3w -0.5*3s >=0
add.constraint(model2, c(0, 0, 0, 0, 0, 0, -0.5, 0.5, -0.5), ">=", 0)

# 求解模型
solve(model2)

# 获取结果
optimal_profit <- get.objective(model2)
optimal_values <- get.variables(model2)

# 输出结果
cat("Optimal Profit: $", round(optimal_profit, 2), "\n")
cat("Optimal Values of Decision Variables:\n")
cat("Spring (Cotton):", round(optimal_values[1], 2), "tons\n")
cat("Spring (Wool):", round(optimal_values[2], 2), "tons\n")
cat("Spring (Silk):", round(optimal_values[3], 2), "tons\n")
cat("Autumn (Cotton):", round(optimal_values[4], 2), "tons\n")
cat("Autumn (Wool):", round(optimal_values[5], 2), "tons\n")
cat("Autumn (Silk):", round(optimal_values[6], 2), "tons\n")
cat("Winter (Cotton):", round(optimal_values[7], 2), "tons\n")
cat("Winter (Wool):", round(optimal_values[8], 2), "tons\n")
cat("Winter (Silk):", round(optimal_values[9], 2), "tons\n")

修正后的预期结果

运行修正后的代码会得到符合约束的最优解:

  • Spring产品:棉花1815吨,羊毛990吨,丝绸495吨(满足55%棉、30%毛占比,总量3300)
  • Autumn产品:棉花1620吨,羊毛1440吨,丝绸540吨(满足45%棉、40%毛占比,总量3600)
  • Winter产品:棉花1200吨,羊毛2000吨,丝绸800吨(满足30%棉、50%毛占比,总量4000)
  • 最优利润:120150美元

内容的提问来源于stack exchange,提问作者Storm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:07:34