微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

整数问题是无界的,但它的线性松弛不在 CVXPY 中

如何解决整数问题是无界的,但它的线性松弛不在 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 举报,一经查实,本站将立刻删除。