You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从CVXPY迁移至Solver或如何提升CVXPY运行速度

凸优化问题快速求解方案咨询

我需要快速求解以下凸优化问题:
$$
\max_z \sum_i p_i \log\left( \sum_j z_j o_j m_{ji} \right)
$$
约束条件:

  • $0 \leq z_j \leq 1$(所有$j$)
  • $\sum_j z_j = 1$
  • $0 \leq p_i \leq 1$(所有$i$)

其中$p、m、o$为已知数值数组,$z$是待求解变量。

当前尝试与性能问题

我使用CVXPY搭配不同求解器实现求解,核心代码如下:

import cvxpy as cp

z = cp.Variable(num_values_z, nonneg=True)

combo_matrix = cp.multiply(z, o)
combo_matrix2 = cp.matmul(combo_matrix, m.T).T
log_sum = cp.sum(cp.multiply(cp.log(combo_matrix2), p))
obj = cp.Maximize(log_sum)

constraint_zero_one = [z <= 1]
constraint_sum_one = [cp.sum(z) == 1]
constraint_two = [p <= 1]

注:$p$和$z$已设置非负约束。

开启verbose后显示单次求解耗时约200微秒,符合预期,但运行10000次迭代总耗时约30秒,远高于单次求解的累加时间,耗时主要集中在CVXPY的编译环节。查阅CVXPY文档得知,CVXPY并非为性能优化设计,会消耗资源验证问题凸性(我已知该问题必然是凸的)。按照文档建议将输入设为参数后,性能提升微乎其微。

需求咨询

我希望直接调用CVXPY中表现最优的CLARABEL或ECOS求解器,但CLARABEL要求问题转化为如下标准形式:
$$
\begin{align*}
\min_x &\quad \frac{1}{2}x^T P x + q^T x \
\text{s.t.} &\quad A x + b \in \mathcal{K}
\end{align*}
$$
我不清楚如何将自身问题转化为该格式(CVXPY可自动转换但我不知手动方法),且CLARABEL文档示例与我的问题差异较大。

请问:

  • 如何将我的问题转化为CLARABEL或ECOS可直接读取的标准格式?
  • 有没有方法让CVXPY的运行速度接近单独求解的速度?
  • 还有其他可行的快速求解方案吗?

补充示例数据

p = [1.0, 5.5, 5.99, 5.9, 6.4, 5.8,
     5.9, 1.85, 2.07, 1.21276596, 1.19230769, 1.19607843,
     1.17857143, 1.2, 1.19607843, 2.03092784, 1.83333333]

m = [[1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1],
     [1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0],
     [1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1],
     [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0],
     [1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1],
     [1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0]]

o = [0.16666667, 0.16666667, 0.16666667, 0.16666667, 0.16666667, 0.16666667]

内容的提问来源于stack exchange,提问作者SSC Fan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:04:54