Python I';我正在使用cvxpy测试一个简单的MILP程序。但是,在我稍微增加变量数量后,解算器停止收敛
任务是将n个非重叠段放入一个区间,最大化区间内的总覆盖空间。这是一个1D玩具问题,将扩展到未来“将盒子装配到更大的盒子”类问题 间隔定义为[x0,x1]。每个段由起始席和宽度Wi定义。目标函数是在给定一些约束条件下,使所有宽度之和最大化 存在使所有线段保持在间隔内的直接约束,以及线段之间的碰撞约束以避免重叠。碰撞约束使用二进制辅助变量Python I';我正在使用cvxpy测试一个简单的MILP程序。但是,在我稍微增加变量数量后,解算器停止收敛,python,cvxpy,Python,Cvxpy,任务是将n个非重叠段放入一个区间,最大化区间内的总覆盖空间。这是一个1D玩具问题,将扩展到未来“将盒子装配到更大的盒子”类问题 间隔定义为[x0,x1]。每个段由起始席和宽度Wi定义。目标函数是在给定一些约束条件下,使所有宽度之和最大化 存在使所有线段保持在间隔内的直接约束,以及线段之间的碰撞约束以避免重叠。碰撞约束使用二进制辅助变量 import cvxpy as cp # Problem set up x0 = 2 x1 = 20 num_segments = 4 # Segment v
import cvxpy as cp
# Problem set up
x0 = 2
x1 = 20
num_segments = 4
# Segment variables
X = cp.Variable(num_segments) # starting x's
W = cp.Variable(num_segments) # widths
# Constraints keeping segments in interval
constraints = [X + W <= x1, X >= x0, W >=1]
# Pairwise collision constraints
for i in range(num_segments-1):
for j in range(i+1, num_segments):
# Helper binary variables
sigma_r = cp.Variable(boolean=True)
sigma_l = cp.Variable(boolean=True)
# segment i can be on the left or the right of segment j
constraints += [X[i] - W[j] >= X[j]-4000*(1-sigma_r)]
constraints += [X[i] + W[i] <= X[j]+4000*(1-sigma_l)]
# require at least one sigma to be 1
constraints += [sigma_r + sigma_l >= 1]
# maximize sum of widths
objective = cp.Maximize(cp.sum(W))
prob = cp.Problem(objective, constraints)
prob.solve()
将cvxpy作为cp导入
#问题设置
x0=2
x1=20
num_段=4
#段变量
X=cp.Variable(num_段)#开始X
W=cp.Variable(num_段)#宽度
#保持分段间隔的约束
约束=[X+W=x0,W>=1]
#成对碰撞约束
对于范围内的i(num_段-1):
对于范围内的j(i+1,num_段):
#辅助二进制变量
sigma_r=cp.Variable(布尔值=True)
sigma_l=cp.Variable(布尔值=True)
#段i可以位于段j的左侧或右侧
约束+=[X[i]-W[j]>=X[j]-4000*(1-sigma_r)]
约束+=[X[i]+W[i]=1]
#最大化宽度之和
目标=cp.max(cp.sum(W))
prob=cp.问题(目标、约束)
问题解决()
这对于num_段(最多为6个)非常有效,任何超过该值的情况下,解算器都不会收敛。我觉得对于100以下的变量数量,这不应该是一个困难的优化。你知道是什么导致了这个问题吗?我是否应该查看其他解算器?检查使用的解算器(详细模式)。cvxpy只提供了一个现成的玩具解算器,非商业性的解决方案在安装过程中需要特别小心(参见文档)。检查使用了哪个解算器(详细模式)。cvxpy只提供了一个现成的玩具解决方案,非商业替代方案在安装过程中需要特别小心(参见文档)。