Pyomo Integer Programming - 启发式地将特定变量设置为固定数字
Pyomo Integer Programming - Setting specific variables to fixed numbers heurestically
使用pyomo/cplex:
假设我有一个需要求解 25 个整数的成本函数,每个整数可以从 (0 到 4)
实际模型比这更复杂,但我尽量减少这个想法。
model.x = Var(range(25), range(5), domain=Binary, initialize=0)
for i in range(25):
model.constraint.add(sum([model.x[i, j] for j in range(5)]) == 1)
假设我发现使用不同的逻辑方法,整数 0、1、2 应该等于 4。
我所做的是按如下方式设置约束:
model.constraint.add(model.x[0, 4]) == 1
model.constraint.add(model.x[1, 4]) == 1
model.constraint.add(model.x[2, 4]) == 1
我的想法是,我想将预定义的整数设置为我通过其他方式找到的固定解决方案,以加快计算时间。但是,我读到通过添加更多约束,您应该花更多时间来找到解决方案。
有经验的大神能不能给我个好的意见,有更好的办法吗?
别担心。 Cplex 将预先解决这个问题。在 Cplex 开始迭代之前,这些变量将从模型中移除。
Cplex 日志将显示一些有关预求解成功程度的消息。您应该会看到如下消息:
MIP Presolve eliminated 497 rows and 497 columns.
MIP Presolve modified 8530 coefficients.
Reduced MIP has 8556 rows, 8915 columns, and 34502 nonzeros.
Reduced MIP has 8915 binaries, 0 generals, 0 SOSs, and 0 indicators.
这将显示模型在预求解阶段后变小了多少。
如果生成大量此类单例约束,指定边界可能更有效。这可以为 Pyomo 生成模型节省一些时间。在许多情况下,这并不是真正需要担心的事情,使用边界而不是约束更多是一个品味问题。
如果 Cplex 可以消除模型的大部分,有时检查模型并查看模型是否真的比需要的大是很有用的。
当然,直接使用整数变量可能比使用一系列二进制变量更好。我假设有充分的理由使用这些二进制变量。
使用pyomo/cplex:
假设我有一个需要求解 25 个整数的成本函数,每个整数可以从 (0 到 4)
实际模型比这更复杂,但我尽量减少这个想法。
model.x = Var(range(25), range(5), domain=Binary, initialize=0)
for i in range(25):
model.constraint.add(sum([model.x[i, j] for j in range(5)]) == 1)
假设我发现使用不同的逻辑方法,整数 0、1、2 应该等于 4。 我所做的是按如下方式设置约束:
model.constraint.add(model.x[0, 4]) == 1
model.constraint.add(model.x[1, 4]) == 1
model.constraint.add(model.x[2, 4]) == 1
我的想法是,我想将预定义的整数设置为我通过其他方式找到的固定解决方案,以加快计算时间。但是,我读到通过添加更多约束,您应该花更多时间来找到解决方案。
有经验的大神能不能给我个好的意见,有更好的办法吗?
别担心。 Cplex 将预先解决这个问题。在 Cplex 开始迭代之前,这些变量将从模型中移除。
Cplex 日志将显示一些有关预求解成功程度的消息。您应该会看到如下消息:
MIP Presolve eliminated 497 rows and 497 columns.
MIP Presolve modified 8530 coefficients.
Reduced MIP has 8556 rows, 8915 columns, and 34502 nonzeros.
Reduced MIP has 8915 binaries, 0 generals, 0 SOSs, and 0 indicators.
这将显示模型在预求解阶段后变小了多少。
如果生成大量此类单例约束,指定边界可能更有效。这可以为 Pyomo 生成模型节省一些时间。在许多情况下,这并不是真正需要担心的事情,使用边界而不是约束更多是一个品味问题。
如果 Cplex 可以消除模型的大部分,有时检查模型并查看模型是否真的比需要的大是很有用的。
当然,直接使用整数变量可能比使用一系列二进制变量更好。我假设有充分的理由使用这些二进制变量。