簡體   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