繁体   English   中英

如何将 gurobi 更改为 pyomo 求解器

[英]how to change gurobi to pyomo solver

由于是python中从grobi到pyomo的二次约束问题,想改一下,所以苦恼不知如何去做。

from gurobipy import *
import pandas as pd
import numpy as np
import csv
from pyomo.environ import SolverFactory
opt = SolverFactory("optimizer", solver_io="python")
opt.solve(model, tee=True)
opt.options['NonConvex'] = 2

之后,我使用 pandas 从 excel 插入数据。

model=Model("optimizer")
model.params.NonConvex=2

并运行 gurobi 程序。 如果错误信息是

untimeError: Attempting to use an unavailable solver.

The SolverFactory was unable to create the solver "optimizer"
and returned an UnknownSolver object.  This error is raised at the point
where the UnknownSolver object was used as if it were valid (by calling
method "solve").

The original solver was created with the following parameters:
    executable: optimizer
    solver_io: python
    type: optimizer
    _args: ()
    options: {}

https://pyomo.readthedocs.io/en/stable/working_models.html?highlight=options#sending-options-to-the-solver

我以为我会参考这个网站进行各种更改,有很多我不明白的地方。 例如,

results = optimizer.solve(instance, options="threads=4", tee=True)

我需要将公式的常量和变量都更改为“optimizer.solve”吗? 改变的只是字典符号吗? 不需要更改 int 类型或列表? 另外,我应该将所有 () 更改为实例吗?

s={(1:2,2:3,3:5,4:5)}
d={(1,1):1(1,2):2(1:3):3(1:4):4
  (1,1):3(1,2):4(1:3):5(1:4):6}

我如何用上面的 s,d 改变它? "options="=dict name=dict number" 有什么我需要补充的吗?例如,如果有约束表达式或目标函数,请告诉我。因为我是初学者,如果你会有所帮助可以告诉我尽可能详细的信息。

看来你在混淆不同的方法

  1. gurobipy 允许您使用 model 和解决问题Python API
  2. Pyomo是一种建模语言,允许您解决 model 优化问题,然后使用 gurobi 或其他求解器(glpk、cbc、mosek 等)求解。

在你的代码中

from pyomo.environ import SolverFactory
opt = SolverFactory("optimizer", solver_io="python")

这是一个 Pyomo 语句,它告诉 Pyomo 你将使用optimizer器求解器(正如 RuntimeError 告诉你的那样,它不存在)

你的代码在这里

model=Model("optimizer")
model.params.NonConvex=2

告诉我您正在使用 python 中的 Gurobi API 为您的问题建模。

您需要选择 model 您的问题是使用 gurobipy 还是 pyomo。 您可以从两者中使用 gurobi 解决,但不要混合使用这两种方法。

由于在model=Model('optimizer')中,您是否已经拥有带有 gurobipy 的 model,如果您的 PC 中安装了许可证和 gurobi,则只需调用model.optimize()即可解决问题

PS:下面的代码只是告诉 Pyomo 你正在使用 solver optimizer solver(之前在SolverFactory行中声明)来解决名为instance的程序,使用计算机 CPU 中的 4 个线程并且你想看到登录屏幕

results = optimizer.solve(instance, options="threads=4", tee=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM