【问题标题】:cvxopt can't solve a simple linear optimizationcvxopt 无法解决简单的线性优化
【发布时间】:2014-07-31 23:21:00
【问题描述】:

我有这个模型

 min c' x
 s.t.
 G x <= h
 x are integers or binary variables

其中c 是一个 16x1 的 numpy 系数数组,G 是一个表示模型约束的 12 x 16 矩阵,h 是一个 12x1 的数组。

::::::::::::::
c
::::::::::::::
-0.00
-0.38
0.12
0.12
-0.38
-0.00
0.12
0.12
0.12
0.12
-0.00
-0.38
0.12
0.12
-0.38
-0.00
::::::::::::::
G
::::::::::::::
0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
0 0 1 -1 0 0 0 0 0 0 0 1 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 -1 0 0 0 0
0 0 -1 1 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 -1 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 1 0 0 0 -1 0 0 0 0
0 0 0 0 0 0 -1 1 0 0 0 1 0 0 0 0
::::::::::::::
h
::::::::::::::
1
1
1
1
1
1
1
1
1
1
1
1

从 cvxopt 文档中,我认为该模型应该实现为线性程序并使用 lp 求解器求解

cvxopt.solvers.lp(c=cvxopt.matrix(c), G=cvxopt.matrix(G), h=cvxopt.matrix(h) )

但我收到此错误:

/usr/local/lib/python2.7/dist-packages/cvxopt/coneprog.pyc in lp(c, G, h, A, b, solver, primalstart, dualstart)
   3006 
   3007     return conelp(c, G, h, {'l': m, 'q': [], 's': []}, A,  b, primalstart,
-> 3008         dualstart)
   3009 
   3010 

/usr/local/lib/python2.7/dist-packages/cvxopt/coneprog.pyc in conelp(c, G, h, dims, A, b, primalstart, dualstart, kktsolver, xnewcopy, xdot, xaxpy, xscal, ynewcopy, ydot, yaxpy, yscal)
    572     if kktsolver in defaultsolvers:
    573         if b.size[0] > c.size[0] or b.size[0] + cdim_pckd < c.size[0]:
--> 574            raise ValueError("Rank(A) < p or Rank([G; A]) < n")
    575         if kktsolver == 'ldl':
    576             factor = misc.kkt_ldl(G, dims, A, kktreg = KKTREG)

ValueError: Rank(A) < p or Rank([G; A]) < n

虽然使用 cvxopt 的 glpk 接口实际上工作顺利,它给了我很好的解决方案:

(status, sol) = cvxopt.glpk.ilp(c=cvxopt.matrix(c),   # c parameter
                                G=cvxopt.matrix(G),     # G parameter
                                h=cvxopt.matrix(h),     # h parameter
                                I=set(range(0, len(c))),
                                B=set(range(0, len(c)))
                                )

如何让 lp 求解器在 cvxopt 中解决这个问题?

【问题讨论】:

  • This 可能会有所帮助。似乎有些约束是多余的,而 cvxopt 不喜欢那样..
  • 我应该以某种方式降低G的等级吗?怎么样?
  • 如果问题确实是 presolve 没有返回满秩矩阵,我会使用不同的求解器..

标签: python optimization linear-programming cvxopt


【解决方案1】:

我不完全确定,但我认为,这个问题更多的是数学问题,而不是基于代码的问题。

矩阵的维度是c16 x 1G16 x 12h12 x 1。但是矩阵G 的秩要低得多。事实上,x 的 16 个条目中有 10 个没有限制。对于程序来说,这是一个不可行的解决方案,因为最小值将是负无穷大。

例如对于x[14]Gh 中没有约束,它可以是任何值。在最小化函数c[14] = -0.38中,因此最小化值将是x[14] = +inf,它给出了解决方案-inf = min c'x

这是对您描述的错误的解释:

ValueError: Rank(A) < p or Rank([G; A]) < n

这部分代码出现在不同的部分,通常检查问题的维度并确定是否有足够的约束来解决问题。

我解决了这个问题,但忽略了 x 的任何不受约束的值。结果仍然不可行,但这可能是由于约束或其他一些错误...

[Previous definition of the matrices]
>>> index = [1,2,3,6,7,11]
>>> c = c[index]
>>> G = G[::,index]
>>> cv.solvers.lp(c=c, G=G, h=h )
     pcost       dcost       gap    pres   dres   k/t
 0: -2.8000e-01 -1.3000e+01  1e+01  1e+00  5e+00  1e+00
 1: -1.7954e-01 -1.6503e+00  1e+00  1e-01  6e-01  7e-03
 2:  1.0328e-01 -1.5888e+01  1e+03  1e+00  6e+00  8e-01
 3: -1.1620e+01 -3.8498e+00  5e+03  3e-01  1e+00  1e+01
 4: -1.1605e+03 -3.8498e+00  5e+05  3e-01  1e+00  1e+03
 5: -1.1604e+05 -3.8498e+00  5e+07  3e-01  1e+00  1e+05
 6: -1.1604e+07 -3.8498e+00  5e+09  3e-01  1e+00  1e+07
 7: -1.1604e+09 -3.8498e+00  5e+11  3e-01  1e+00  1e+09
 Certificate of dual infeasibility found.
{'status': 'dual infeasible', 'dual slack': None, 'iterations': 7, 'residual as primal
infeasibility certificate': None, 'relative gap': None, 'dual objective': None, 
'residual as dual infeasibility certificate': 1.1035651154462114e-09, 'gap': None, 
's': <12x1 matrix, tc='d'>, 'primal infeasibility': None, 'dual infeasibility': None, 
'primal objective': -1.0, 'primal slack': 94.0289560690342, 'y': None, 'x': <6x1 
matrix, tc='d'>, 'z': None}

如果我错了,请随时纠正我。

【讨论】:

  • 问题是问题并非不可行,因为 GLPK 确实找到了正确的解决方案。所以我不明白为什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多