如何解决整数问题是无界的,但它的线性松弛不在 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,integer = False,name = 'Relaxed')
x = make_problem(m,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
这意味着:求解器证明了非松弛问题的不可行性,并在这种情况下使用了无穷大的默认值!
这是模棱两可的 -> 松弛也可能是无界;因此:阅读状态!
参见示例 slides: page 13/14
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。