CVXOPT: решение простой программы целочисленного линейного программирования

Я использую CVXOPT для решения очень простой проблемы:

min -7890424934354.171875*x1 -7890424934354.274414*x2 -7890424934354.246093*x3
s.t: 
  x1 + x2 + x3 = 1
  x1,x2,x3 are binary

Мы видим, что оптимальное решение должно быть очевидно:

x1 =0; x2 = 1; x3 = 0

Однако я не получил правильный ответ, используя ILP от CVXOPT(я знаю, что вышеупомянутая проблема слишком проста, чтобы использовать ILP, но мне просто любопытно). Подробное описание ILP CVXOPT здесь.

Моя программа такая:

from cvxopt.glpk import ilp
from cvxopt import matrix
c = matrix([-7890424934354.171875,-7890424934354.274414,-7890424934354.246093],tc='d')
G = matrix(0.0, (1,3)) #since I do not have a constraint like G*x <= h, I make them zeros here
h = matrix(0.0, (1,1))
A = matrix([1,1,1],tc='d')
b = matrix(1,tc='d')
(status, x) = ilp(c,G,h,A.T,b,B=set([0,1,2]))

Результат:

GLPK Integer Optimizer, v4.61
2 rows, 3 columns, 3 non-zeros
3 integer variables, all of which are binary
Preprocessing...
1 row, 3 columns, 3 non-zeros
3 integer variables, all of which are binary
Scaling...
 A: min|aij| =  1.000e+00  max|aij| =  1.000e+00  ratio =  1.000e+00
Problem data seem to be well scaled
Constructing initial basis...
Size of triangular part is 1
Solving LP relaxation...
GLPK Simplex Optimizer, v4.61
1 row, 3 columns, 3 non-zeros
*     0: obj =  -7.890424934e+12 inf =   0.000e+00 (0)
OPTIMAL LP SOLUTION FOUND
Integer optimization begins...
+     0: mip =     not found yet >=              -inf        (1; 0)
+     0: >>>>>  -7.890424934e+12 >=  -7.890424934e+12   0.0% (1; 0)
+     0: mip =  -7.890424934e+12 >=     tree is empty   0.0% (0; 1)
INTEGER OPTIMAL SOLUTION FOUND
optimal
[ 0.00e+00]
[ 0.00e+00]
[ 1.00e+00]

который не возвращает оптимальное решение.

Но если я изменю свою целевую функцию на -171875 * x1 - 274414 * x2 - 246093 * x3, я смогу получить правильный ответ: x1 = 0, x2 = 1, x3 = 0.

Я действительно смущен, почему это происходит:

Во-первых, я догадался, теряют ли точность значения с плавающей точкой, такие как -7890424934354.171875, при передаче в ILP, но, похоже, это не причина.

Другое предположение состоит в том, что я не должен делать нули G и h, если у меня нет ограничения, такого как G*x <= h. Но что мне делать, если я хочу использовать ILP, когда G и h пусты, так как это требует

  G: mxn dense or sparse 'd' matrix with m>=1

Буду признателен за любой совет. Спасибо заранее.

0 ответов

Другие вопросы по тегам