我有这个模型
min c' x
s.t.
G x <= h
x are integers or binary variables
其中c
是16x1 numpy系数数组,G
是12 x 16
矩阵,表示模型的约束,h
是12x1数组。< / p>
::::::::::::::
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中解决此问题?
答案 0 :(得分:0)
我不完全确定,但我认为,问题更多的是数学问题,而不是基于代码。
矩阵的维度为c
16 x 1
,G
为16 x 12
,h
为12 x 1
。但矩阵G
的等级要低得多。实际上,x
的16个条目中有10个没有约束。对于该程序,它是一个不可行的解决方案,因为最小值将是负无穷大。
E.g。 x[14]
和G
中的h
没有约束,它可以是任何值。在最小化函数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}
如果我错了,请随意纠正我。