一个线性规划问题 cvxpy 解决了,但 IBM ILOG CPLEX 是 'optimal with unscaled infeasabilities'?
An Linear Programming problem cvxpy solves but IBM ILOG CPLEX is 'optimal with unscaled infeasabilities'?
正在解决的问题是找到重量最小的桁架,完全按照本网站上的方法完成:https://www.layopt.com/truss/。这种方法也称为地结构法。我的目标是通过 MILP 优化为该方法添加一些功能。最初,我从 cvxpy
线性规划 (LP) 求解器开始,但由于它无法求解 MILP,我现在使用带有 python 模块 docplex 的 IBM ILOG CPLEX 求解器。不幸的是我遇到了一个问题,但首先简而言之,优化是如何工作的:
- 初始化:制作节点,放置负载(
f
)和支撑(dof
)
- 制作桁架的潜在成员,全连接所有节点将相互连接。这些潜在成员将形成桁架并具有两个变量
a
和 q
以及恒定长度 属性 l
.
- 计算平衡矩阵
B
,保证稀疏且对称
- 构建 LP 模型,这是通过调用
Model()
对象并开始求解来完成的。
..
"build the model"
model = Model()
a = model.continuous_var_list(len(members), name='a', lb=0, ub=1)
q = []
Bcons = []
for k, fk in enumerate(f):
qk = model.continuous_var_list(len(members), name=f'q{k}', lb=-10 ** 10, ub=10 ** 10)
Bconsk = model.add_constraints(
sum(B[i, j] * qk[j] for j in range(len(qk))) == fk[i] for i in range(len(dof)) if dof[i] != 0)
model.add_constraints(qk[i] <= sigma * a[i] for i in range(len(qk)))
model.add_constraints(qk[i] >= -sigma * a[i] for i in range(len(qk)))
q.append(qk)
Bcons.append(Bconsk)
model.set_objective('min', sum(a[i] * l[i] for i in range(len(a))))
model.print_information()
"solve model and update results"
sol = model.solve()
print(model.solve_details)
对于小型问题(少于 1000 个成员),LP 在 CPLEX 求解器中收敛并且工作完美。然而,对于更大的问题规模(例如超过 10 000 名成员),问题是 'optimal with unscaled infeasibilities'。这是什么意思,我该如何解决这个更大的 LP?
到目前为止我尝试了什么:
- 在 cvxpy 中解决同样的问题。这个模块最多可以解决120 000个成员没有任何问题。。所以我其实希望专业的解决者也能做到这一点。
- 找到 Coping with an Ill-Conditioned Problem or Handling Unscaled Infeasibilities,但我在模块
docplex
中找不到任何缩放参数
..
Results:
Nodes: 231 Members: 16290
Model: docplex_model1
- number of variables: 32580
- binary=0, integer=0, continuous=32580
- number of constraints: 33038
- linear=33038
- parameters: defaults
- objective: minimize
- problem type is: LP
status = optimal with unscaled infeasibilities
time = 131.297 s.
problem = LP
激进的缩放 mdl.parameters.read.scale = 1
就像@Philippe Couronne 评论的那样工作
正在解决的问题是找到重量最小的桁架,完全按照本网站上的方法完成:https://www.layopt.com/truss/。这种方法也称为地结构法。我的目标是通过 MILP 优化为该方法添加一些功能。最初,我从 cvxpy
线性规划 (LP) 求解器开始,但由于它无法求解 MILP,我现在使用带有 python 模块 docplex 的 IBM ILOG CPLEX 求解器。不幸的是我遇到了一个问题,但首先简而言之,优化是如何工作的:
- 初始化:制作节点,放置负载(
f
)和支撑(dof
) - 制作桁架的潜在成员,全连接所有节点将相互连接。这些潜在成员将形成桁架并具有两个变量
a
和q
以及恒定长度 属性l
. - 计算平衡矩阵
B
,保证稀疏且对称 - 构建 LP 模型,这是通过调用
Model()
对象并开始求解来完成的。
..
"build the model"
model = Model()
a = model.continuous_var_list(len(members), name='a', lb=0, ub=1)
q = []
Bcons = []
for k, fk in enumerate(f):
qk = model.continuous_var_list(len(members), name=f'q{k}', lb=-10 ** 10, ub=10 ** 10)
Bconsk = model.add_constraints(
sum(B[i, j] * qk[j] for j in range(len(qk))) == fk[i] for i in range(len(dof)) if dof[i] != 0)
model.add_constraints(qk[i] <= sigma * a[i] for i in range(len(qk)))
model.add_constraints(qk[i] >= -sigma * a[i] for i in range(len(qk)))
q.append(qk)
Bcons.append(Bconsk)
model.set_objective('min', sum(a[i] * l[i] for i in range(len(a))))
model.print_information()
"solve model and update results"
sol = model.solve()
print(model.solve_details)
对于小型问题(少于 1000 个成员),LP 在 CPLEX 求解器中收敛并且工作完美。然而,对于更大的问题规模(例如超过 10 000 名成员),问题是 'optimal with unscaled infeasibilities'。这是什么意思,我该如何解决这个更大的 LP?
到目前为止我尝试了什么:
- 在 cvxpy 中解决同样的问题。这个模块最多可以解决120 000个成员没有任何问题。。所以我其实希望专业的解决者也能做到这一点。
- 找到 Coping with an Ill-Conditioned Problem or Handling Unscaled Infeasibilities,但我在模块
docplex
中找不到任何缩放参数
..
Results:
Nodes: 231 Members: 16290
Model: docplex_model1
- number of variables: 32580
- binary=0, integer=0, continuous=32580
- number of constraints: 33038
- linear=33038
- parameters: defaults
- objective: minimize
- problem type is: LP
status = optimal with unscaled infeasibilities
time = 131.297 s.
problem = LP
激进的缩放 mdl.parameters.read.scale = 1
就像@Philippe Couronne 评论的那样工作