Python中将Gurobi二次约束问题迁移至Pyomo及求解器调用报错咨询
首先你当前遇到两个核心错误:
SolverFactory参数错误:你传入了自定义的模型名optimizer,需要传入求解器的官方标识gurobi- 模型对象不兼容:你用Gurobi原生语法创建的
model对象无法直接传入Pyomo的solve方法,你需要用Pyomo语法完成变量、约束、目标函数的全流程构建
修正后的基础框架代码如下:
import pyomo.environ as pyo import pandas as pd import numpy as np # 初始化Gurobi求解器 opt = pyo.SolverFactory("gurobi", solver_io="python") # 预配置求解器参数(NonConvex、线程数等都可以在这里设置) opt.options["NonConvex"] = 2 opt.options["threads"] = 4
问题1 solve方法参数适配说明
optimizer.solve()仅需要传入构建完成的Pyomo模型对象即可,不需要额外调整模型内的常量、变量格式- options参数支持两种合法写法:
- 键值对字典格式:
options={"threads":4} - 空格分隔的字符串格式:
options="threads=4"
- 键值对字典格式:
- 两种写法效果完全一致,int、list等类型参数直接按规则传入即可,不需要额外转换
问题2 instance命名说明
- 不需要强制把所有模型相关调用替换为
instance,instance只是Pyomo官方文档对实例化后模型对象的常用命名,你可以继续用model作为变量名,只要保证传入solve的是完成了全部定义的Pyomo模型对象即可
问题3 s、d参数适配Pyomo的方法
首先你给出的字典存在语法错误,修正后按以下步骤适配即可:
- 修正字典语法错误
# 修正后的单维索引参数s s = {1:2, 2:3, 3:5, 4:5} # 修正后的二维索引参数d(已删除原重复的(1,1)键,你可以根据实际需求调整) d = { (1,1):1, (1,2):2, (1,3):3, (1,4):4, (2,1):3, (2,2):4, (2,3):5, (2,4):6 }
- 在Pyomo模型中定义参数
# 初始化Pyomo模型 model = pyo.ConcreteModel() # 先定义索引集 model.I = pyo.Set(initialize=[1,2,3,4]) model.J = pyo.Set(initialize=[1,2,3,4]) # 绑定单维参数s model.s = pyo.Param(model.I, initialize=s) # 绑定二维参数d model.d = pyo.Param(model.I, model.J, initialize=d)
后续写约束、目标函数时,直接用model.s[i]、model.d[i,j]调用即可。
问题4 options配置与约束目标定义说明
- options部分仅需要传入Gurobi求解器支持的参数即可,不需要把约束、目标函数内容添加进去
- 约束和目标函数直接定义在Pyomo模型对象中即可,不需要传入
solve方法,示例如下:
# 定义决策变量示例 model.x = pyo.Var(model.I, domain=pyo.NonNegativeReals) # 定义目标函数示例(二次目标) def obj_rule(model): return sum(model.s[i] * model.x[i]**2 for i in model.I) model.obj = pyo.Objective(rule=obj_rule, sense=pyo.minimize) # 定义约束示例 def con_rule(model, i): return sum(model.d[i,j] * model.x[j] for j in model.J) >= 10 model.con = pyo.Constraint(model.I, rule=con_rule)
所有内容定义完成后调用求解方法即可:
result = opt.solve(model, tee=True) # 求解完成后查看变量结果 model.x.display()
内容的提问来源于stack exchange,提问作者炎天下修羅
相关产品推荐
相关产品推荐

