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

使用R的lpsolveapi求解MILP:变量0/0.125-0.5约束问题求助

解决lpsolveapi中“变量要么为0要么在区间内”的线性规划问题

你的代码核心错误是直接将决策变量设为二进制类型,但需求是变量要么取0,要么在0.125到0.5之间的连续值——二进制变量只能取0或1,这和约束完全冲突,导致模型无法得到符合预期的结果。

正确建模思路

需要为每个决策变量x_i引入对应的二进制辅助变量y_i,通过以下约束实现逻辑控制:

  • 当y_i=0时,x_i必须等于0
  • 当y_i=1时,0.125 ≤ x_i ≤ 0.5

对应的数学约束:

  1. x_i ≤ 0.5 * y_i(限制y_i=0时x_i只能为0,y_i=1时x_i不超过0.5)
  2. x_i ≥ 0.125 * y_i(限制y_i=1时x_i至少为0.125,y_i=0时x_i≥0自动满足)
  3. y_i ∈ {0,1}(二进制变量)

修正后的完整代码

library(lpsolveapi)

# 目标函数系数
obj.coef <- c(3, 2, 5, 4)
n_vars <- length(obj.coef)

# 创建模型:4个连续决策变量x + 4个二进制辅助变量y,共8个变量
lpmodelapi <- make.lp(0, n_vars * 2)
lp.control(lpmodelapi, sense='max')

# 设置目标函数:仅优化x变量,y变量系数为0
set.objfn(lpmodelapi, c(obj.coef, rep(0, n_vars)))

# 原约束:2x1 + x2 + 4x3 + 3x4 ≥ 2
add.constraint(lpmodelapi, c(2, 1, 4, 3, rep(0, n_vars)), ">=", 2)

# 变量权重和为1:sum(x_i) = 1
add.constraint(lpmodelapi, c(rep(1, n_vars), rep(0, n_vars)), "=", 1)

# 为每个x_i添加区间约束(通过辅助y_i实现)
for (i in 1:n_vars) {
  # x_i ≤ 0.5*y_i
  coef_vec <- rep(0, n_vars*2)
  coef_vec[i] <- 1
  coef_vec[n_vars + i] <- -0.5
  add.constraint(lpmodelapi, coef_vec, "<=", 0)
  
  # x_i ≥ 0.125*y_i
  coef_vec <- rep(0, n_vars*2)
  coef_vec[i] <- 1
  coef_vec[n_vars + i] <- -0.125
  add.constraint(lpmodelapi, coef_vec, ">=", 0)
  
  # 设置y_i为二进制变量
  set.type(lpmodelapi, n_vars + i, type = "binary")
}

# 求解并输出结果
solve_status <- solve(lpmodelapi)
cat("求解状态码:", solve_status, "\n") # 0表示求解成功

results <- get.variables(lpmodelapi)
x_vars <- results[1:n_vars]
y_vars <- results[(n_vars+1):(n_vars*2)]

cat("决策变量x的值:", x_vars, "\n")
cat("辅助二进制变量y的值:", y_vars, "\n")
cat("目标函数最大值:", get.objective(lpmodelapi), "\n")

代码关键说明

  • 模型总变量数为8:4个连续决策变量x_i负责取值,4个二进制变量y_i控制x_i是否处于有效区间
  • 目标函数仅针对x_i,y_i不参与优化计算
  • 通过循环批量添加约束,避免重复代码,同时保证每个变量的逻辑控制生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:37:27