我试图在ubuntu 20.04上的pyomo中使用scip解算器,但在调用解算器时收到一条奇怪的错误消息:
FileNotFoundError:[Erno 2]没有这样的文件或目录:'/tmp/tmpxsrkdky5.pyomo.sol'
pyomo
是通过pip
安装的,scip
是通过下载页面上的安装程序脚本安装的。由于依赖性问题,我无法安装.deb
文件——在Ubuntu 20.04而不是18.04上。安装程序脚本将scip
安装在主目录中的一个文件夹中,但我确实在python脚本中提供了求解器的路径。
最小工作示例:
import pyomo.environ as pyo
# basic setup
Agents = list(range(10))
Values = [1, 3, 5, 3, 2, 4, 5, 6, 4, 1]
Weight = [1, 2, 3, 4, 5, 6, 4, 2, 3, 1]
# create pyo model and set variable
Dummy = pyo.ConcreteModel()
Dummy.x = pyo.Var(Agents, bounds=(0, 1))
# set objective
Dummy.obj = pyo.Objective(expr=(sum(Dummy.x[i]*Values[i] for i in Agents)))
# add a constraint
Dummy.constraint = pyo.ConstraintList()
Dummy.constraint.add(sum(Dummy.x[i]*Weight[i] for i in Agents) <= 10)
# select solver and solve problem
opt = pyo.SolverFactory('scip', executable='/path/to/solver/SCIPOptSuite-7.0.1-Linux/bin/scip')
opt.solve(Dummy)
编辑:我没能用scip解决pyomo模型。然而,我能够使用PySCIPOpt直接建模并解决问题。他们文档中的示例起到了很大的作用。
from pyscipopt import Model, quicksum
# basic setup
Agents = list(range(10))
Values = [1, 3, 5, 3, 2, 4, 5, 6, 4, 1]
Weight = [1, 2, 3, 4, 5, 6, 4, 2, 3, 1]
#==================solve it straight with scip================================
Dummy = Model("dummy")
# vtype='C' means the variable is continuous
x = [Dummy.addVar(lb = 0, ub=1, name=("x" + str(i)), vtype='C') for i in Agents]
# set objective
Dummy.setObjective(quicksum(x[i]*Values[i] for i in Agents), sense="maximize")
# add a constraint
Dummy.addCons(quicksum(x[i]*Weight[i] for i in Agents) <= 10)
# solve problem
Dummy.optimize()
sol = Dummy.getBestSol()
print(sol)
编辑编辑:昨天它仍然有效,但今天尝试再次运行它,它返回了一个微不足道的解决方案,而不是最优解决方案。
我也遇到了同样的问题。出现此问题是因为您将pyomo
直接指向scip
可执行文件,而不是pyomo
所需的AMPL接口。不幸的是,AMPL接口似乎不再包含在预编译的安装程序中(我尝试了*.deb方法,但它不存在(。
不过,幸运的是,从源代码构建scipampl
非常简单。我在7.0.3版本中完全遵循了这些说明:https://stackoverflow.com/a/66736905/7382307
然后只是的问题
from pyomo import environ as po
opt = po.SolverFactory('scipampl')
或者,对于那些愿意使用旧版本(6.0(的人来说,这似乎也解决了问题,至少在Windows上是这样:https://stackoverflow.com/a/56886542/7382307