CPLEX与Python API-如何使模型制定更快?

CPLEX与Python API-如何使模型制定更快?,python,cplex,Python,Cplex,我转向CPLEX,因为我有一个相当大的线性问题要解决。 如果我们使用符号: 最小化:c^T*x 受制于:A_ub*xDocplex有一个CplexTransformer类(Docplex.mp.sktrans.transformers.py),该类从矩阵和成本向量构建并求解线性模型。 它接受numpy矩阵、pandas数据帧和scipys的稀疏coo矩阵 (对于非常稀疏的矩阵,coo矩阵公式确实有帮助) 下面是一个非常小的代码片段,显示了CplexTransformer的使用: # -----

我转向CPLEX,因为我有一个相当大的线性问题要解决。
如果我们使用符号:

最小化:c^T*x

受制于:A_ub*xDocplex有一个CplexTransformer类(Docplex.mp.sktrans.transformers.py),该类从矩阵和成本向量构建并求解线性模型。 它接受numpy矩阵、pandas数据帧和scipys的稀疏coo矩阵 (对于非常稀疏的矩阵,coo矩阵公式确实有帮助)

下面是一个非常小的代码片段,显示了CplexTransformer的使用:

# ----- a very small CplexTransformer example
from docplex.mp.sktrans.transformers import CplexTransformer
import scipy.sparse as sp


def solve_cpxtrans_sparse_coo():
    xs = [0, 0, 1, 1, 0, 1]
    ys = [0, 1, 1, 2, 3, 3]
    dd = [1, 1, 1, 1, 5, 7]
    spm = sp.coo_matrix((dd, (xs, ys)), shape=(2, 4))
    ubs = 10
    res = CplexTransformer(sense="min").transform(spm, y=[3, 2, 1], ubs=ubs, sense='ge')
    print(res)
    xs= res['value'].tolist()
    print(xs)

假设A_ub是稀疏矩阵

a_rows = A_ub.row.tolist()
a_cols = A_ub.col.tolist()
a_vals = A_ub.data
list_rhs = list(b_ub)
problem.linear_constraints.add(rhs=list_rhs, senses=['L'] * n_less_cons)
problem.linear_constraints.set_coefficients(zip(a_rows, a_cols, a_vals))

你可以试试。在我的例子中效果更好。

这里讨论了相同的问题:。
这个问题似乎仍然没有解决办法

不幸的是,这个类似乎只是一个很好的包装器。在引擎盖下,它只是再次分解成行的numpy/scipy/pandas结构,创建问题并解决问题。与我在没有
CplexTransformer
的情况下的实现所花费的时间相同。有一件事会有所帮助,那就是关闭“CplexTransformer”。对于CPLEX Python API,默认情况下它是“打开”的。这可以通过在创建
problem
@rkersh之后添加
problem.parameters.read.datacheck.set(problem.parameters.read.datacheck.values.off)
来完成,谢谢!这并不能完全解决问题,但至少将准备时间减少了约40%。所以,现在整个过程大约需要22秒(从30秒下降)。但是它仍然比开源GLPK慢。顺便问一下,你的矩阵是否完全密集(即没有零)?如果不是,您可以直接构建稀疏阵列,您应该会获得更好的性能。此外,按列而不是按行构建模型的速度稍微快一些。上面的“直接构建稀疏数组”意味着你可以使用和朋友,例如。Ryan关于矩阵是否完全密集的问题从未得到回答。如果矩阵不是完全稠密的,但其中有大量的零,那么如果构建SparsePair实例时不包含任何零,则运行速度会快得多。在numpy中将矩阵创建为稀疏矩阵可能会使此操作更简单。
a_rows = A_ub.row.tolist()
a_cols = A_ub.col.tolist()
a_vals = A_ub.data
list_rhs = list(b_ub)
problem.linear_constraints.add(rhs=list_rhs, senses=['L'] * n_less_cons)
problem.linear_constraints.set_coefficients(zip(a_rows, a_cols, a_vals))