要在 pyomo 中实例化求解器,通常使用求解器工厂:
from pyomo.opt import SolverFactory
opt = SolverFactory('glpk')
Run Code Online (Sandbox Code Playgroud)
有没有办法知道 SolverFactory 将接受哪些字符串?解决方案如下所示:
print(SolverFactory.list_detected_solvers())
Run Code Online (Sandbox Code Playgroud) 我有两个大的np.uint8 ndarrays,a和b。我需要计算:c = np.sum(np.abs(a - b), axis=(-2,-1,))
由于它们是未签名的,所以我不能仅减去它们。一种简单的解决方法是将它们转换为更大的数据类型:
c = np.sum(np.abs(a.astype(np.int16) - b.astype(np.int16)), axis=(-2,-1,))
Run Code Online (Sandbox Code Playgroud)
其中在总使用4 *倍数组的内存。在理想的世界中,我想成为这样的人:
c = np.sum(np.abssub(a, b), axis=(-2,-1,))
Run Code Online (Sandbox Code Playgroud)
它将使用与阵列相同的内存量。可悲的是,我在numpy的文档中找不到这样的功能。目前,我正在执行以下操作:
diff = np.empty_like(a)
mask = a > b
diff[mask] = (a - b)[mask]
# b shape is different but broadcasts to a
# That is why I use mask after substracting
mask = np.logical_not(mask, out=mask)
diff[mask] = (b - a)[mask]
c = np.sum(np.abs(diff, out=diff), axis=(-2,-1,))
Run Code Online (Sandbox Code Playgroud)
其用途是仅仅 2.5 **的存储器中作为阵列倍量。
有一个更好的方法吗?
* …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行一个简单的问题来测试我的设置:
#! /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 …Run Code Online (Sandbox Code Playgroud)