Pyomo can't find gurobi solver
我正在尝试运行一个简单的问题来测试我的设置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #! /usr/bin/env python3 import pyomo.core as pyomo from pyomo.opt import SolverFactory, IOptSolver model = pyomo.ConcreteModel() model.d = pyomo.Var(initialize=1, bounds=(0,2,)) model.g = pyomo.Var(initialize=1, bounds=(0,2,)) model.s = pyomo.Var(initialize=1, bounds=(0,2,)) model.b = pyomo.Var(initialize=1, bounds=(0,2,)) objective_rule = model.d - model.b*model.g + model.s*model.b model.objective = pyomo.Objective(rule=objective_rule, sense=pyomo.minimize) # After digging in pyomo source I figured out this # should print all solvers available in my system print(IOptSolver._factory_cls) # This fails opt = SolverFactory("gurobi", solver_io="python") # opt = SolverFactory("neos") This also fails # Create a model instance and optimize instance = model results = opt.solve(instance) instance.display() |
但是pyomo在检测古罗比方面有问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | {} Traceback (most recent call last): File"./__test__2.py", line 21, in <module> results = opt.solve(instance) File"/usr/local/lib/python3.5/dist-packages/pyomo/opt/base/solvers.py", line 125, in solve self._solver_error('solve') File"/usr/local/lib/python3.5/dist-packages/pyomo/opt/base/solvers.py", line 153, in _solver_error +"\ \\toptions: %s" % ( self.options, ) ) RuntimeError: Attempting to use an unavailable solver. The SolverFactory was unable to create the solver"gurobi" 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: gurobi solver_io: python type: gurobi _args: () options: {} |
我已经使用pip安装了pyomo:
1 | pip3 install pyomo |
我已经使用以下命令下载并安装了gurobi(解压缩后):
1 2 3 4 | mv gurobi801 /opt/gurobi/gurobi801 cd /opt/gurobi/gurobi801/linux64/ python3 setup.py build python3 setup.py install |
并添加到我的.bash_profile:
1 2 | export GUROBI_HOME="/opt/gurobi/gurobi801/linux64" export PATH="${PATH}:${GUROBI_HOME}/bin" |
如果我从命令行调用它,Gurobi可以正常运行:
1 2 3 4 5 6 7 8 9 10 11 | gurobi.sh Python 2.7.13 (default, Sep 4 2017, 15:40:17) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2 Type"help","copyright","credits" or"license" for more information. Academic license - for non-commercial use only Gurobi Interactive Shell (linux64), Version 8.0.1 Copyright (c) 2018, Gurobi Optimization, LLC Type"help()" for help gurobi> |
但是pyomo无法显示全部帮助:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | pyomo help -s Pyomo Solvers and Solver Managers --------------------------------- Pyomo uses 'solver managers' to execute 'solvers' that perform optimization and other forms of model analysis. A solver directly executes an optimizer, typically using an executable found on the user's PATH environment. Solver managers support a flexible mechanism for asyncronously executing solvers either locally or remotely. The following solver managers are available in Pyomo: neos Asynchronously execute solvers on the NEOS server serial Synchronously execute solvers locally If no solver manager is specified, Pyomo uses the serial solver manager to execute solvers locally. The pyro and phpyro solver managers require the installation and configuration of the pyro software. The neos solver manager is used to execute solvers on the NEOS optimization server. Serial Solver Interfaces ------------------------ The serial, pyro and phpyro solver managers support the following solver interfaces: Traceback (most recent call last): File"/usr/local/lib/python3.5/dist-packages/pyomo/scripting/driver_help.py", line 338, in help_solvers logger.disable(logging.WARNING) AttributeError: 'Logger' object has no attribute 'disable' During handling of the above exception, another exception occurred: Traceback (most recent call last): File"/usr/local/bin/pyomo", line 11, in <module> sys.exit(main()) File"/usr/local/lib/python3.5/dist-packages/pyomo/scripting/pyomo_main.py", line 82, in main retval = _options.func(_options) File"/usr/local/lib/python3.5/dist-packages/pyomo/scripting/driver_help.py", line 452, in help_exec help_solvers() File"/usr/local/lib/python3.5/dist-packages/pyomo/scripting/driver_help.py", line 351, in help_solvers logger.disable(logging.NOTSET) AttributeError: 'Logger' object has no attribute 'disable' |
在设置中我可能错过了什么?我正在运行ubuntu 16.04 x64
事实证明,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #! /usr/bin/env python3 import pyomo.environ # <--- HAD MISSING # from pyomo.opt import SolverFactory, IOptSolver import pyomo.core as pyomo model = pyomo.ConcreteModel() model.d = pyomo.Var(initialize=0, bounds=(0,2,)) model.g = pyomo.Var(initialize=0, bounds=(0,2,)) model.s = pyomo.Var(initialize=0, bounds=(0,2,)) model.b = pyomo.Var(initialize=0, bounds=(0,2,)) objective_rule = model.d - model.b*model.g + model.s*model.b model.objective = pyomo.Objective(rule=objective_rule, sense=pyomo.minimize) # Should print all available solvers print(sorted(IOptSolver._factory_cls.keys())) opt = SolverFactory("gurobi", solver_io="python") # Create a model instance and optimize instance = model results = opt.solve(instance) instance.display() |
收益率:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ['_cbc_shell', '_cplex_shell', '_gams_direct', '_gams_shell', '_glpk_direct', '_glpk_shell', '_glpk_shell_4_42', '_glpk_shell_old', '_gurobi_shell', '_mock_asl', '_mock_cbc', '_mock_cplex', '_mock_glpk', '_mock_pico', '_mock_xpress', '_neos', '_pico_shell', '_xpress_shell', 'asl', 'baron', 'bilevel_blp_global', 'bilevel_blp_local', 'bilevel_ld', 'cbc', 'conopt', 'cplex', 'cplex_direct', 'cplex_persistent', 'gams', 'gdpopt', 'glpk', 'gurobi', 'gurobi_direct', 'gurobi_persistent', 'ipopt', 'mpec_minlp', 'mpec_nlp', 'path', 'pico', 'ps', 'py', 'scip', 'trustregion', 'xpress'] Academic license - for non-commercial use only Model unknown Variables: d : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : 0 : 0 : 2 : False : True : Reals g : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : 0 : 0 : 2 : False : True : Reals s : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : 0 : 0 : 2 : False : True : Reals b : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : 0 : 0 : 2 : False : True : Reals Objectives: objective : Size=1, Index=None, Active=True Key : Active : Value None : True : 0.0 Constraints: None |
未进行适当的优化,但至少解决了求解器检测问题。