Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Gekko中目标函数的约束_Python_Dynamic Programming_Mathematical Optimization_Ipopt_Gekko - Fatal编程技术网

Python-Gekko中目标函数的约束

Python-Gekko中目标函数的约束,python,dynamic-programming,mathematical-optimization,ipopt,gekko,Python,Dynamic Programming,Mathematical Optimization,Ipopt,Gekko,在Python Gekko中,有没有一种方法可以将目标函数限制在一个范围内?我正在通过一个10年的操作来完成这个示例。可调参数是鱼的生产率(收获率)。目标函数是10年期间运营的利润。数学上的优化问题是: 解决方案和Python Gekko代码是: 从gekko导入gekko 将numpy作为np导入 将matplotlib.pyplot作为plt导入 #创建GEKKO模型 m=GEKKO() #时点 n=501 m、 时间=np.linspace(0,10,n) #常数 E=1 c=17.5

在Python Gekko中,有没有一种方法可以将目标函数限制在一个范围内?我正在通过一个10年的操作来完成这个示例。可调参数是鱼的生产率(收获率)。目标函数是10年期间运营的利润。数学上的优化问题是:

解决方案和Python Gekko代码是:

从gekko导入gekko
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#创建GEKKO模型
m=GEKKO()
#时点
n=501
m、 时间=np.linspace(0,10,n)
#常数
E=1
c=17.5
r=0.71
k=80.5
U_max=20
#捕捞率
u=m.MV(值=1,磅=0,磅=1)
u、 状态=1
u、 DCOST=0
#鱼类种群
x=m.Var(值=70)
#鱼类种群平衡
m、 方程(x.dt()==r*x*(1-x/k)-u*u_max)
#目标(利润)
J=m.Var(值=0)
#最终目标
Jf=m.FV()
Jf.STATUS=1
m、 连接(Jf,J,pos2='end')
m、 方程(J.dt()==(E-c/x)*u*u_max)
#利润最大化
m、 最大化(Jf)
#选择权
m、 options.IMODE=6#最优控制
m、 options.NODES=3个#配置节点
m、 options.SOLVER=3#SOLVER(IPOPT)
#求解优化问题
m、 解决()
#印刷利润
打印('最佳利润:'+str(Jf.值[0]))
#绘图结果
plt.图(1)
plt.子地块(2,1,1)
plt.plot(m.time,J.value,'r--',label='profit')
plt.绘图(m.时间[-1],Jf.值[0],'ro',markersize=10\
label='final profit='+str(Jf.value[0]))
plt.plot(m.time,x.value,'b-',label='fish population')
plt.ylabel('值')
plt.legend()
plt.子地块(2,1,2)
plt.绘图(m.时间,u.值,'k.-',标签='fishing rate')
plt.ylabel('费率')
plt.xlabel(‘时间(年)’)
plt.legend()
plt.show()

我在化学制造业中观察到的一个现象是,优化有时会导致非直观的解决方案,因为优化器(IPOPT)将把过程带到绝对极限,以实现甚至几美元的盈利。是否有办法约束目标函数(本例中为利润),使业务保持可行,但优化器不会给出超出设备(或本例中为鱼类种群)限制的解决方案。

您可以通过添加上限来设置目标限制,例如:

Jf=m.FV(ub=100)#最终目标
这将设置
100
的上限
ub
。即使你能做到这一点,你也有很多理由不想对目标施加限制。一个是,如果优化器无法达到该限制,这可能导致不可行的解决方案。另一个原因是,您可能仍然无法实现“直观的解决方案”,或者无法在特定时期内将设备(如渔船或化工厂)推向极限。正如蒂姆在评论中提到的,更好的方法是对你可以控制的事情施加限制,比如捕鱼率。您可能会发现一些有用的参数是移动抑制因子
DCOST
、最大移动
DMAX
、捕鱼率成本
cost
。也许在一年内将捕鱼率提高到最高水平,然后在5年以上的时间内降至40%是不合理的。还可能存在与建立捕鱼船队相关的成本,这些成本不会反映在您当前的解决方案中

您还可以将目标设置为特定目标值之间的软约束,然后让其他目标(如最大化鱼类种群)成为利润率上限和下限目标之间决策的驱动力

#目标(利润)
J=m.CV(值=0)
J.SPHI=100;J.WSPHI=1000
J.SPLO=80;J.WSPLO=1000
m、 options.CV_WGT_START=n-1#从n-1开始
J.状态=1
m、 最大化(x)#最大化鱼类种群
这提供了一个80到100之间的利润限制的解决方案,但也最大限度地提高了鱼类种群

从gekko导入gekko
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#创建GEKKO模型
m=GEKKO()
#时点
n=501
m、 时间=np.linspace(0,10,n)
#常数
E=1
c=17.5
r=0.71
k=80.5
U_max=20
#捕捞率
u=m.MV(值=1,磅=0,磅=1)
u、 状态=1
u、 DCOST=0
#鱼类种群
x=m.Var(值=70)
#鱼类种群平衡
m、 方程(x.dt()==r*x*(1-x/k)-u*u_max)
#目标(利润)
J=m.CV(值=0)
J.SPHI=100;J.WSPHI=1000
J.SPLO=80;J.WSPLO=1000
m、 options.CV_WGT_START=n-1#从n-1开始
J.状态=1
m、 最大化(x)#最大化鱼类种群
m、 方程(J.dt()==(E-c/x)*u*u_max)
#选择权
m、 options.IMODE=6#最优控制
m、 options.NODES=3个#配置节点
m、 options.SOLVER=3#SOLVER(IPOPT)
#求解优化问题
m、 解决()
#印刷利润
打印('最佳利润:'+str(J.值[-1]))
#绘图结果
plt.图(1)
plt.子地块(2,1,1)
plt.plot([0,10],[100100],'k:',label='target profit range')
plt.绘图([0,10],[80,80],'k:')
plt.plot(m.time,J.value,'r--',label='profit')
plt.绘图(m.时间[-1],J.值[-1],'ro',markersize=10\
label='最终利润='+str(J.value[-1]))
plt.plot(m.time,x.value,'b-',label='fish population')
plt.ylabel('值')
plt.legend()
plt.子地块(2,1,2)
plt.绘图(m.时间,u.值,'k.-',标签='fishing rate')
plt.ylabel('费率')
plt.xlabel(‘时间(年)’)
plt.legend()
plt.show()

从建模的角度来看,我通常不会对目标施加约束。无法保证解算器不会将某些度量推到其极限。事实上,它仍然有可能这样做,因为这正是这些解决者倾向于做的。我宁愿对你能控制(或想要控制)的东西施加约束。比如限制最大捕鱼率,一个时期到下一个时期的最大变化率,每个时期和最后一个时期结束时的最小鱼类存量水平,等等。