如何在Python Gekko优化中强制执行二进制(或整数)变量?

时间:2019-09-16 15:09:24

标签: python mathematical-optimization nonlinear-optimization gekko

我正在尝试在Python Gekko中将Model Predictive Control with the TCLab的示例代码修改为使用二进制(开/关),而不是介于0到100%之间的连续加热器值。我切换了integer=True的选项,并将决策变量缩放为0到1,而不是0到100%,但是它仍然为Q1提供了一个连续值(不是二进制)的解决方案。

# Manipulated variables
Q1b = m.MV(value=0,lb=0,ub=1,name='q1',integer=True)
Q1b.STATUS = 1  # manipulated
Q1b.FSTATUS = 0 # not measured
Q1b.DMAX = 1.0
Q1b.DCOST = 0.1
Q1 = m.Intermediate(Q1b*100)

Q2 = m.MV(value=0,name='q2')
Q2.STATUS = 1  # manipulated
Q2.FSTATUS = 0 # not measured
Q2.DMAX = 30.0
Q2.DCOST = 0.1
Q2.UPPER = 100.0
Q2.LOWER = 0.0

当决策变量(操纵变量)必须为二进制或整数解时,如何使用Gekko进行最佳控制?

1 个答案:

答案 0 :(得分:1)

您引用的示例问题使用默认的T => T解算器。要获取二进制或整数解决方案,请切换到IPOPT求解器。

APOPT

您还需要做另一件事,因为您将m.options.SOLVER = 1 Q1更改为m.MV()类型。在您访问m.Intermediate值的循环中,进行以下修改:

Q1

Q1s[i+1] = Q1.value[1] Q2s[i+1] = Q2.NEWVAL 仍然是0到100%之间的连续值,您仍然可以使用Q2参数来访问移动计划的第一步。对于Q2.NEWVAL,您需要使用Q1来访问第一步,因为它是Q1.value[1]类型,并且没有m.Intermediate()属性。如果安装了NEWVAL,脚本将使用make_mp4=True生成视频动画。动画显示ffmpeg现在是Q1(0或1),而ON/OFF仍然是0到100%之间的连续值。

Model Predictive Control with Binary Variable

具有二进制变量的模型预测控制

Q2