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

Gurobi优化问题代码运行无输出无报错问题排查

问题根因定位

代码运行后无输出、无报错的核心原因非常直接:

  • 你只通过def opti()定义了函数,但全程没有编写调用该函数的代码。Python运行脚本时只会执行顶层的逻辑,函数内部的代码在被显式调用前不会执行,自然不会有任何输出或报错。这是当前代码无响应的最核心原因

除此之外,代码里还存在多个会导致调用后直接报错、逻辑不符合预期的问题:

  • 变量名大小写不匹配:目标函数中写的是大写开头的X_3,但实际定义的变量是小写开头的x_3,Python对大小写敏感,运行到此处会触发NameError
  • Gurobi API调用错误:添加多维度决策变量需要用addVars()方法,你使用的addVar()仅支持添加单个变量,传入列表作为参数会触发参数类型错误
  • 约束写法错误:y_1/y_2/y_3是存储多个变量的容器,不能直接写y_1 >= 0添加批量非负约束;实际上Gurobi连续变量默认下界就是0,不需要额外写非负约束,也可以在定义变量时通过lb=0参数明确指定
  • 变量名拼写错误:最后打印置信区间时,你定义的变量名是ci,打印时写的是ic,会触发NameError
  • 循环逻辑缩进错误:你把模型求解、指标统计、打印的逻辑全部缩进到了内层for k in range(K)循环中,会出现“每加一个约束就求解一次模型”的不合理逻辑;同时外层循环用m作为计数变量,循环内部又把m赋值为Gurobi模型对象,覆盖了循环计数变量,容易引发逻辑混乱;此外标准差、置信区间的统计应该等M次模拟全部完成、z_K收集完所有结果后再计算,不需要放在循环内重复计算
  • 缺失依赖导入:代码中使用了numpy、gurobipy的相关接口,但开头没有写对应的导入语句
  • 统计逻辑注释错误:你注释标注的是95%置信区间,但使用的1.29是标准正态分布90%置信度的双侧分位值,95%置信度对应的分位值是1.96,可根据实际需求调整。
修复后可直接运行的代码
import numpy as np
import gurobipy as gp
from gurobipy import GRB

def opti():
    M = 7
    K = 5
    z_K = []

    for sim_round in range(M):
        # 生成随机需求参数
        d1 = np.random.uniform(50, 250, K)
        d2 = np.random.uniform(20, 250, K)
        d3 = np.random.uniform(200, 500, K)
        
        # 初始化优化模型
        model = gp.Model("opti")
        # 定义采购量单变量,直接指定非负下界
        x_1 = model.addVar(vtype=GRB.CONTINUOUS, lb=0, name="procured_R1")
        x_2 = model.addVar(vtype=GRB.CONTINUOUS, lb=0, name="procured_R2")
        x_3 = model.addVar(vtype=GRB.CONTINUOUS, lb=0, name="procured_R3")
        # 定义产量批量变量,直接指定非负下界
        y_1 = model.addVars(K, vtype=GRB.CONTINUOUS, lb=0, name="P1_output")
        y_2 = model.addVars(K, vtype=GRB.CONTINUOUS, lb=0, name="P2_output")
        y_3 = model.addVars(K, vtype=GRB.CONTINUOUS, lb=0, name="P3_output")

        # 设置目标函数,修正变量名大小写,用gurobi自带的quicksum提升运算效率
        model.setObjective(
            2*x_1 + 4*x_2 + 5.2*x_3 + (1/K)*gp.quicksum(-17.6*y_1[i] - 12.2*y_2[i] + 0.6*y_3[i] for i in range(K)),
            GRB.MINIMIZE
        )

        # 添加所有需求约束
        for k in range(K):
            model.addConstr(y_1[k] == d1[k])
            model.addConstr(y_2[k] == d2[k])
            model.addConstr(y_3[k] == d3[k])
        
        # 所有约束添加完成后再求解模型
        model.optimize()
        # 存储本次模拟的最优目标值
        z_K.append(model.ObjVal)

    # 全部模拟完成后计算统计指标
    L_MK = sum(z_K) / M
    sigma = (1/(M-1) * sum((z - L_MK)**2 for z in z_K)) ** 0.5
    ci = [L_MK - sigma*1.29/(M**0.5), L_MK + sigma*1.29/(M**0.5)]

    print('z_K:', z_K)
    print('L_MK:', L_MK)
    print('standard deviation:', sigma)
    print('confidence interval:', ci)

if __name__ == "__main__":
    opti()
通用排查技巧

如果后续再遇到代码运行无响应、无输出的情况,可以按以下步骤快速定位:

  • 先检查入口逻辑:确认定义的函数、类是否被显式调用,脚本是否有可执行的顶层逻辑
  • 加打印断点:在代码的不同位置插入简单的print("运行到XX位置")语句,快速定位卡在哪一段逻辑
  • 开启求解器日志:默认Gurobi求解时会打印求解日志,如果没有日志输出,说明代码根本没有执行到optimize()步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:42:32