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

Python中Gurobi求解MIP时固定约束索引i的问题求助

解决Gurobi中固定索引i=1的MIP约束问题

问题根源

你的代码存在几个核心错误:

  • 列表定义错误:sh[1,2,3,4,5] 写法无效,正确应为 sh = [1,2,3,4,5]
  • 变量未初始化:Gurobi决策变量w、x、s必须通过model.addVar()或model.addVars()创建,不能直接用列表下标访问
  • 索引逻辑依赖变量结构:固定i=1的思路没问题,但前提是变量x和s的二维索引包含i=1这个维度

修正后的完整代码

import gurobipy as gp
from gurobipy import GRB

# 初始化数据
d = [18,7,6,5,10,1,8]
sh = [1,2,3,4,5]  # 修正列表定义
p = len(d)
fixed_i = 1  # 要固定的i值

# 创建模型
model = gp.Model("MIP_FixedIndex")

# 创建决策变量
w = model.addVars(p, name="w")  # 一维变量,对应每个t
x = model.addVars(p, sh, name="x")  # 二维变量,t∈0~p-1,i∈sh集合
s = model.addVars(p, sh, name="s")

# 添加固定i=1的约束
for t in range(p):
    model.addConstr(w[t] == x[t, fixed_i] - s[t, fixed_i], name=f"Constr_W_{t}")

# 示例目标函数(可根据需求修改)
model.setObjective(gp.quicksum(w[t] for t in range(p)), GRB.MINIMIZE)

# 求解模型
model.optimize()

# 输出最优解(可选)
if model.status == GRB.OPTIMAL:
    for t in range(p):
        print(f"w[{t}] = {w[t].X:.2f}")
        print(f"x[{t},{fixed_i}] = {x[t,fixed_i].X:.2f}")
        print(f"s[{t},{fixed_i}] = {s[t,fixed_i].X:.2f}")

关键说明

  • 用model.addVars(p, sh)创建二维变量时,第二个参数直接传入sh列表,i的索引会自动对应1、2、3、4、5,直接通过x[t,1]即可访问i=1的变量
  • 若你的t集合从1开始而非0,可将range(p)改为range(1, p+1),同时创建变量时同步调整索引范围
  • 给约束命名是可选操作,但便于后续调试排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:38:18