簡體   English   中英

使用 NEOS 作為 Pyomo 求解器

[英]Using NEOS as a Pyomo solver

最近開始做一些OR,一直在嘗試用Pyomo和NEOS做一些優化問題。 我一直在關注 UT Austin Pyomo 的一堂課,當我的 GLPT 難以安裝時,我轉向了 NEOS。 我現在在收到 NEOS 的已解決答案時遇到了一些困難。

我到目前為止是這樣的:

from pyomo import environ as pe
import os

os.environ['NEOS_EMAIL'] = 'my registered email' 

model = pe.ConcreteModel()

model.x1 = pe.Var(domain=pe.Binary)
model.x2 = pe.Var(domain=pe.Binary)
model.x3 = pe.Var(domain=pe.Binary)
model.x4 = pe.Var(domain=pe.Binary)
model.x5 = pe.Var(domain=pe.Binary)

obj_expr = 3 * model.x1 + 4 * model.x2 + 5 * model.x3 + 8 * model.x4 + 9 * model.x5
model.obj = pe.Objective(sense=pe.maximize, expr=obj_expr)

con_expr = 2 * model.x1 + 3 * model.x2 + 4 * model.x3 + 5 * model.x4 + 9 * model.x5 <= 20
model.con = pe.Constraint(expr=con_expr)


solver_manager = pe.SolverManagerFactory('neos')

results = solver_manager.solve(model, solver = "minos")
print(results)

我收到的回報是解決方案的數量 = 0,而我知道一個事實存在。 我也看到我沒有設置任何界限,那么我該怎么做呢? 再一次,我對此非常陌生,並且無法在其他地方找到任何關於此的文檔,或者我只是不知道如何查看。

謝謝你的幫助!

這是當前結果對象設計的“問題”。 由於歷史原因,該字段報告結果對象中包含的解數,而不是求解器生成的解數。 默認情況下,Pyomo 求解器直接將求解器返回的解加載到原始模型中(為了方便和效率)並且不在結果對象中返回它。 您可以通過向solve()調用提供load_solutions=False來更改該行為。

至於界限,你指的是什么界限? 使用Var()聲明的bounds=參數或domain=參數設置變量邊界。 對於您的示例,因為變量被聲明為Binary ,所以它們的邊界都是[0..1] 通過解析求解器輸出來收集目標的邊界。 這取決於打擾您正在使用的求解器(許多不報告邊界信息),以及用於解析求解器結果的接口。

最后要注意的是,您正在向 LP/NLP 求解器 (minos) 發送 MIP 問題。 將從求解器獲得二進制變量的小數值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM