Целочисленное программирование CVXPY, возвращающее нецелочисленное решение

#python-3.x #integer-programming #cvxpy

#python-3.x #целочисленное программирование #cvxpy

Вопрос:

Я пытаюсь решить целочисленное программирование с помощью CVXPY. Но решение, возвращаемое CVXPY, кажется, нецелочисленным. Что не так с моим кодом?

 import cvxpy as cp

# Create two optimization variables of type integer.
x = cp.Variable(integer=True)
y = cp.Variable(integer=True)

# Create two constraints.
constraints = [x   y == 1,
               x - y >= 1]

# Form objective.
obj = cp.Minimize((x - y)**2)

# Form and solve problem.
prob = cp.Problem(obj, constraints)
prob.solve()  # Returns the optimal value.
print("status:", prob.status)
print("optimal value", prob.value)
print("optimal var", x.value, y.value)
  

Результат таков

 status: optimal
optimal value 1.0000001874501487
optimal var 0.9999999924717351 7.528264443746919e-09
  

Комментарии:

1. Для меня выглядит как (x, y) = (1,0). Вы ожидаете чудес от float s?

2. Но его отображение (x, y) = (0.9999999924717351 7.528264443746919e-09)

3. Затем округлите float s до целых чисел (используя, скажем, numpy.round ), а затем сравните результат округления с оригиналом. Если разница превышает определенный порог, значит, что-то пошло не так.

4. Это потому, что решатель внутренней точки используется без шага пересечения. Решение является очень точным приближением. Это также скорее игрушечный решатель, если используется ecosbb. Рекомендуется использовать cbc или glpk (более сложная настройка)