微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 GEKKO 的变量“数组”中设置变量名称

如何解决如何在 GEKKO 的变量“数组”中设置变量名称

我在 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,integer=True)

我想为我的 FV 添加变量名称,以便我可以快速排除故障并选择最佳解决方案中的参数。这对于列表理解来说相当简单,但是对于数组,我唯一的选择似乎是使名称重复,这不太有用。

解决方法

问题是将变量重命名为 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 的更多信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。