Python 有没有一种简便的方法可以用cvxpy来表示MIP的连续弛豫?

Python 有没有一种简便的方法可以用cvxpy来表示MIP的连续弛豫?,python,cvxpy,Python,Cvxpy,我想用cvxpy解一个(凸)混合整数规划及其连续松弛。是否有办法对两种计算使用相同的目标实现和约束条件 以cvxpy网站上的MIP示例问题为例,添加了一些约束“x[0]>=2”: np.random.seed(0) m, n= 40, 25 A = np.random.rand(m, n) b = np.random.randn(m) # Construct a CVXPY problem x = cp.Variable(n, integer=True) # x is an integer va

我想用cvxpy解一个(凸)混合整数规划及其连续松弛。是否有办法对两种计算使用相同的目标实现和约束条件

以cvxpy网站上的MIP示例问题为例,添加了一些约束“x[0]>=2”:

np.random.seed(0)
m, n= 40, 25
A = np.random.rand(m, n)
b = np.random.randn(m)
# Construct a CVXPY problem
x = cp.Variable(n, integer=True) # x is an integer variable
obj = cp.sum_squares(A@x - b)
objective = cp.Minimize(obj)
constraint = [x[0] >= 2]
prob = cp.Problem(objective, constraint)
prob.solve()
print("The optimal value is", prob.value)
print("A solution x is")
print(x.value)

x = cp.Variable(n) # Now, x is no longer an integer variable but continuous
obj = cp.sum_squares(A@x - b) # I want to leave out this line (1)
constraint = [x[0] >= 2] # I want to leave out this line (2)
objective = cp.Minimize(obj)
prob = cp.Problem(objective, constraint)
prob.solve()
print("The optimal value is", prob.value)
print("A solution x is")
print(x.value)
当省略第(2)行时,问题在没有约束的情况下得到解决。当省略第(1)行时,混合整数问题得到解决(因此,将“x”更改为连续变量没有任何效果)

我希望避免重新实现目标函数和约束,因为缺少复制和粘贴可能会导致奇怪的、难以发现的错误。 谢谢你的帮助


编辑:谢谢你的回复,萨沙。你是对的,外包模型构建解决了问题。所以

class ModelBuilder:
    m, n = 40, 25
    A = np.random.rand(m, n)
    b = np.random.randn(m)
    def __init__(self, solve_continuous):
        np.random.seed(0)
        if solve_continuous:
            self.x = cp.Variable(self.n)
        else:
            self.x = cp.Variable(self.n, integer=True)
    @staticmethod
    def constraint_func(x):
        return [x[0] >= 2]
    def objective_func(self, x):
        return cp.sum_squares(self.A@x - self.b)
    def build_problem(self):
        objective = cp.Minimize(self.objective_func(self.x))
        constraint = self.constraint_func(self.x)
        return cp.Problem(objective, constraint)

# Construct and solve mixed integer problem
build_cont_model = False
MIP_Model = ModelBuilder(build_cont_model)
MIP_problem = MIP_Model.build_problem()
MIP_problem.solve()
print("The optimal value is", MIP_problem.value)
print("A solution x is")
print(MIP_Model.x.value)

# Construct and solve continuous problem
build_cont_model = True
Cont_Model = ModelBuilder(build_cont_model)
Cont_problem = Cont_Model.build_problem()
Cont_problem.solve()
print("The optimal value is", Cont_problem.value)
print("A solution x is")
print(Cont_Model.x.value)
一切正常。由于我没有这个简单的想法,这表明我还不理解将
cvxpy.Variable
应用于表达式的概念

在我的第一次尝试中,我定义了变量
x
,并在定义
obj
时使用它。然后,我更改了
x
(第(1)行之前的一行)的值。我以为
obj
通过指针或类似的东西链接到
x
,这样它也会改变它的行为。显然,情况并非如此


你知道有什么资源可以帮助我理解这种行为吗?或者,对于熟悉Python的人来说,这是显而易见的吗?那么,我在哪里可以了解它呢?

我没有遵循你的
当省略第(1)行时,混合整数问题就解决了(因此,将“x”更改为连续变量没有任何效果。
,因为离散性仅由定义的变量暗示,而不是其他变量,但关于您的问题:只需将模型构建外包到类或函数中。参数
solve_continuous
或类似的东西随后在其内部分支s函数(例如变量定义)。非常感谢你的评论。外包模型构建工作。这表明我还不了解应用cvxpy.Variable的概念。你能帮我一下吗?我编辑了我的帖子来详细说明。或者用一个简单的函数来表示a、b和x而不是类:谢谢你的简短解决方案,AKX!我不懂你的意思ur
当省略第(1)行时,混合整数问题得到解决(因此,将“x”更改为连续变量没有任何效果。
,因为离散性仅由定义的变量暗示,而不是其他变量,但关于您的问题:只需将模型构建外包到类或函数中。参数
solve_continuous
或类似的东西随后在其内部分支s函数(例如变量定义)。非常感谢您的评论。外包模型构建工作。这表明我还不了解应用cvxpy.Variable的概念。您能帮我吗?我编辑了我的帖子来详细说明。或者使用简单的函数a、b和x而不是类:感谢您提供了较短的解决方案,AKX!