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

R语言如何使用lpSolve库搭建线性模型并正确设置约束

R中lpSolveAPI搭建0-1线性规划实现最小旅行里程赛程模型

核心问题修正说明

你当前代码存在4个核心问题,可直接对应解决二进制变量设置、约束添加的卡点:

  • 模型维度错误:4队4馆的0-1指派问题共16个决策变量(x[i,j]表示第i队是否到第j馆比赛,取值0或1),初始设置ncol=4维度不足
  • 变量类型错误:初始设置为real实数型,不符合0-1变量要求
  • 目标函数错误:初始系数全为1,无法计算最小总里程,需要替换为对应组合的旅行里程值
  • 约束缺失:仅添加了1条无效约束,需要补充两类等式约束,满足匹配规则(注:若你需要实现“每队在每个馆各打1场”的全赛程规则,需要额外增加比赛日维度,以下为基础指派模型,可在此基础上扩展)

具体实现方法

1. 二进制变量设置方法

调用set.type()函数时,将type参数指定为"binary"即可,函数会自动约束变量只能取0或1,无需额外设置上下界。

2. 约束添加逻辑

需要添加两类共8条等式约束:

  • 球队约束:共4条,对每支球队,它在所有4个场馆的决策变量求和等于1,保证每队恰好参加1场比赛
  • 场馆约束:共4条,对每个场馆,所有4支球队对应该馆的决策变量求和等于1,保证每个馆恰好承办1场比赛

3. 可运行修正代码

library(lpSolveAPI)
library(lpSolve)

# 初始化模型:8个约束(4队+4馆),16个0-1决策变量
lps.model <- make.lp(nrow=8, ncol=16)

# 所有变量设为二进制类型
set.type(lps.model, columns = 1:16, type="binary")

# 模型命名
name.lp(lps.model, name="The ACC Basketball")

# 定义里程数据:行对应球队A/B/C/D,列对应场馆Raleigh/Atlanta/Durham/Clemson
mileage <- rbind(
  c(210,90,180,160),   # A队到各馆里程
  c(100,70,130,200),   # B队到各馆里程
  c(175,105,140,170),  # C队到各馆里程
  c(80,65,105,120)     # D队到各馆里程
)
# 变量名、约束名设置
ColNames <- as.vector(t(outer(c("A","B","C","D"), c("Raleigh", "Atlanta", "Durham", "Clemson"), paste, sep="_")))
RowNames <- c(paste0("Team_", c("A","B","C","D")), paste0("Venue_", c("Raleigh", "Atlanta", "Durham", "Clemson")))
dimnames(lps.model) <- list(RowNames, ColNames)

# 设置目标函数:最小化总里程,目标系数为对应变量的里程值
lp.control(lps.model, sense="min")
set.objfn(lps.model, obj = as.vector(t(mileage)))

# 添加球队约束:每队恰好打1场
for(i in 1:4){
  const_coef <- rep(0, 16)
  var_pos <- ((i-1)*4 + 1) : (i*4)
  const_coef[var_pos] <- 1
  add.constraint(lps.model, const_coef, "=", 1)
}

# 添加场馆约束:每馆恰好承办1场
for(j in 1:4){
  const_coef <- rep(0, 16)
  var_pos <- seq(j, 16, by=4)
  const_coef[var_pos] <- 1
  add.constraint(lps.model, const_coef, "=", 1)
}

# 求解模型
solve(lps.model)

# 读取结果
min_mileage <- get.objective(lps.model)
match_result <- matrix(get.variables(lps.model), nrow=4, byrow=TRUE,
                       dimnames = list(c("A","B","C","D"), c("Raleigh", "Atlanta", "Durham", "Clemson")))

# 打印结果
cat("最小总旅行里程:", min_mileage, "\n")
cat("对阵安排(1表示安排对应球队到该馆比赛):\n")
print(match_result)

结果说明

求解后得到的match_result是4x4的0-1矩阵,值为1的位置就是最终的球队-场馆匹配方案,min_mileage为对应的最小总里程。如果需要扩展多轮次赛程,只需要新增比赛日维度的决策变量,补充对应“每轮每队只打1场、每轮每馆只办1场、每队在每馆恰好打1场”的约束即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:48:25