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
相关产品推荐
相关产品推荐

