python - 整数问题是无界的,但它的线性松弛不在 CVXPY 中
问题描述
亲爱的,
我正在尝试 CVXPY 并生成了一个简单的整数程序。为了比较,我还生成了它的线性松弛。但是,在求解时,我得到了松弛问题的值(1.429)。然而,对于整数问题,我得到 -inf。我错过了什么?
谢谢!
遵循代码:
import cvxpy as cp
import numpy as np
def make_problem(m, n, integer, name = 'Not named', solve = True, seed = 0):
np.random.seed(seed)
# Generating problem parameters
A = np.random.randn(m, n)
b = np.dot(A, np.ones(n))/2
c = -np.random.randn(n)
# Generation problem variables
x = cp.Variable(n, integer = integer)
# Generating problem objective
obj = cp.Minimize(c.T @ x)
# Generating problem constraints
cstr = [
A @ x <= b,
x >= 0,
x <= 1,
]
# Generating problem
prob = cp.Problem(obj, cstr)
if solve:
prob.solve()
print(f'PROBLEM {name}: STATUS: {prob.status} | VALUE: {prob.value}')
return x
else:
return prob
m = 300
n = 100
x_rlx = make_problem(m, n, integer = False, name = 'Relaxed')
x = make_problem(m, n, integer = True, name = 'Integer')
输出:
问题放松:状态:最佳 | 值:1.4295841445033348
问题整数:状态:无界 | 值:-inf
解决方案
通常,松弛是可行的,而原始问题则不是。想象一个简单的问题:
min(x)
x == 0.5
对于 x = 0.5 的最佳 0.5,这是可行的,而当我们强制 x 为二进制时,这是不可行的。
您观察到的可能性很高(如评论中所示:我们并不完全了解您的问题)。
重要提示:查询求解器状态!
为了:
np.random.seed(0)
m = 20
n = 10
...
print(prob_rlx.status)
print(prob_rlx.value)
...
print(prob.status)
print(prob.value)
我观察到:
optimal
0.0822089776045708
infeasible
inf
这意味着:求解器证明了非松弛问题的不可行性,并在这种情况下使用了无穷大的默认值!
这是模棱两可的 -> 放松也可能是无限的;因此:读取状态!
参见示例幻灯片:第 13/14 页
推荐阅读
- flutter - 颤动不同大小的gridview项目
- php - 没有智能按钮的 Vue/Laravel PayPal 集成
- arrays - 使用 $out 来满足此类需求的正确原型是什么?
- c# - 出现错误-“generator.exe”退出,代码为 -532462766”-RazorPay 集成
- javascript - 未找到 ContactUsComponent 的组件工厂。你把它添加到@NgModule.entryComponents 了吗?在角度 7
- php - PHP 会话问题。添加项目时,它会将 1 添加到所有项目
- python - 有没有一种聪明的方法可以将我的脏代码转换为另一种颜色?
- java - 在Java中将txt转换为堆栈
- django-rest-framework - 自定义过滤器和 Rest 框架不能同时工作
- latitude-longitude - 从球面角转换为经度和纬度