我在 MINLP 问题中有一个 (n x p) 矩阵参数。
当我使用如下列表理解定义 FV 时,我最终得到了可行性
for i in range(n):
test[i] = [m.FV(lb=0, ub=1, integer=True, name="example) for j in range(p)]
另一方面,当我使用数组时,我确实很快就能找到解决方案。
for i in range(n):
test[i] = m.Array(m.FV, p, lb=0, ub=1, integer=True)
我想为我的 FV 添加变量名称,以便我可以快速排除故障并选择最佳解决方案中的参数。这对于列表理解来说相当简单,但是对于数组,我唯一的选择似乎是使名称重复,这不太有用。
答案 0 :(得分:0)
问题是将变量重命名为 example
或其他名称会导致 test
变量不再是整数类型。底层 APMonitor 引擎会将以 int
开头的变量识别为整数类型。更改为其他内容可以使求解器不需要找到整数解,并且可以成功找到非整数解。
通常将问题解决为连续问题与整数问题要容易得多。我建议初始化:
m.options.SOLVER = 1
m.solver_options = ['minlp_as_nlp 1']
m.solve()
然后再次求解以获得整数解(如果可能):
m.options.SOLVER = 1
m.solver_options = ['minlp_as_nlp 0']
m.solve()
如果第二次求解失败,则可能没有整数解,否则求解器未能收敛所需的迭代次数。您可以通过以下方式增加迭代次数:
m.options.MAX_ITER=1000
如果很难找到整数解,那么尝试添加一个额外的选项来进行深度优先搜索:
m.options.SOLVER = 1
m.solver_options = ['minlp_as_nlp 0', \
'minlp_branch_method 1']
m.options.MAX_ITER=1000
m.solve()
关于在 Gekko 中设置求解器选项的更多信息:How to set solver options (such as error tolerance) in Python Gekko? 以及关于 solver options 的更多信息。