我正在尝试在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进行最佳控制?
答案 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%之间的连续值。
具有二进制变量的模型预测控制
Q2