使用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
对应的数学约束:
x_i ≤ 0.5 * y_i(限制y_i=0时x_i只能为0,y_i=1时x_i不超过0.5)x_i ≥ 0.125 * y_i(限制y_i=1时x_i至少为0.125,y_i=0时x_i≥0自动满足)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
相关产品推荐
相关产品推荐

