【问题标题】:Extremely Sparse Integer Quadratic Programming极稀疏整数二次规划
【发布时间】:2021-10-17 23:19:02
【问题描述】:

我正在研究一个包含大量变量(数亿以上)的优化问题。它们中的每一个都应该是一个 0-1 的二进制变量。

我可以将它写成 (maximize x'Qx) 形式,其中 Q 是半正定的,而且我使用的是 Julia,所以包 COSMO.jl 看起来很合适。但是,我的问题有很多稀疏性。 Q 为 0,除了近似 sqrt(|Q|) 条目,并且对于约束,变量上存在近似 sqrt(|Q|) 线性约束。

我可以使用 SparseArrays 很容易地描述这个系统,但是将问题输入 COSMO 的最自然的方法似乎是使用标准数组。有没有办法利用这个大规模问题的稀疏性?

【问题讨论】:

  • 你能分享你正在运行的代码,它会给你你描述的问题吗? COSMO.jl expects only AbstractMatricies,因此在给定稀疏问题和约束矩阵的情况下它可以正常工作。
  • 我同意@PaSTE,听起来它应该可以工作,如果没有,或者有一些性能缺陷,它应该很容易在 COSMOS 中修复,因为它不需要密集矩阵

标签: julia sparse-matrix julia-jump quadratic-programming


【解决方案1】:

虽然您的文件中没有示例代码,但也许这会有所帮助:

JuMP 适用于稀疏数组,所以也许最简单的方法就是在目标函数的构造中使用它:

julia> using JuMP, SparseArrays, COSMO

julia> m = Model(with_optimizer(COSMO.Optimizer));

julia> q = sprand(Bool, 20, 20,0.05) # for readability I use a binary q
20×20 SparseMatrixCSC{Bool, Int64} with 21 stored entries:
⠀⠀⠀⡔⠀⠀⠀⠀⡀⠀
⠀⠀⠂⠀⠠⠀⠀⠈⠑⠀
⠀⠀⠀⠀⠀⠤⠀⠀⠀⠀
⠀⢠⢀⠄⠆⠀⠂⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠄⠀⠀⠌

julia> @variable(m, x[1:20], Bin);

julia> x'*q*x
x[1]*x[14] + x[14]*x[3] + x[15]*x[8] + x[16]*x[5] + x[18]*x[4] + x[18]*x[13] + x[19]*x[14] + x[20]*x[11]

你可以看到方程得到了正确的简化。

确实,您可以使用具有 100M 个元素的非常稀疏的 q 来检查性能:

julia> q = sprand(10000, 10000,0.000001)
10000×10000 SparseMatrixCSC{Float64, Int64} with 98 stored entries:
...

julia> @variable(m,z[1:10000], Bin);

julia> @btime $z'*$q*$z
  1.276 ms (51105 allocations: 3.95 MiB)

您可以看到,在构建目标函数时,您刚刚获得了预期的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多