Python 在gekko中定义最大函数时出错
在gekkopython中定义max函数时遇到问题 sum函数工作正常,但当我创建另一个函数时,只是用max替换sum,然后抛出以下错误: 这是我使用的脚本的描述(包括模型、一些数据和结果)Python 在gekko中定义最大函数时出错,python,numpy,gekko,Python,Numpy,Gekko,在gekkopython中定义max函数时遇到问题 sum函数工作正常,但当我创建另一个函数时,只是用max替换sum,然后抛出以下错误: 这是我使用的脚本的描述(包括模型、一些数据和结果) #模型 将numpy作为np导入 从gekko进口gekko 将numpy作为np导入 作为pd进口熊猫 来自《熊猫》的作者 从导入Excel文件 m=GEKKO()#初始化GEKKO m、 options.SOLVER=3#IPOPT是NLP解算器 m、 options.MAX_ITER=10000#最大
#模型
将numpy作为np导入
从gekko进口gekko
将numpy作为np导入
作为pd进口熊猫
来自《熊猫》的作者
从导入Excel文件
m=GEKKO()#初始化GEKKO
m、 options.SOLVER=3#IPOPT是NLP解算器
m、 options.MAX_ITER=10000#最大迭代次数
m、 options.MAX_MEMORY=6#(2-10)内存分配
R_sect_bin={'W1':{'S1':1},'W2':{'S1':1,'S2':1,'S4':1},'W3':{'S1':1,'S2':1,'S3':1,'S4':1},'W4':{'S4':1,'S5':1,'S6':1},'W6':{'S6':1},'
输入服务非零={'S1':{'L1':1,'L3':1},'S2':{'L2':1},'S3':{'L4':1},'S4':{'L1':1},'S5':{'L3':1},'S6':{'L1':1,'L2':1}
V={}
对于R_sect_bin中的w:
V[w]={}
对于R_sect_bin[w]中的s:
V[w][s]={}
对于输入\u服务\u非零[s]中的l:
V[w][s][l]=m.Var(值=10,磅=0,磅=100)
#职能:
sum_Vws1={}
def VWS1():
全局和Vws1
对于R_sect_bin中的w:
sum_Vws1[w]={}
对于R_sect_bin[w]中的s:
sum_Vws1[w][s]=m.Intermediate(输入服务中l的sum([V[w][s][l]))
返回和Vws1
vws1=vws1()
sum_Vws2={}
def VWS2():
全局和Vws2
对于R_sect_bin中的w:
sum_Vws2[w]={}
对于R_sect_bin[w]中的s:
sum_Vws2[w][s]=m.Intermediate(输入服务中l的最大值([V[w][s][l]))
返回和_Vws2
vws2=vws2()
TypeError回溯(最近一次调用)
在里面
89和Vws2[w][s]=m.中间值(输入服务中l的最大值([V[w][s][l]))
90返回和_Vws2
--->91 vws2=vws2()
92
93#sum_Vws={}
在VWS2()中
87和Vws2[w]={}
88对于R_sect_bin[w]中的s:
--->89和Vws2[w][s]=m.中间值(输入服务中l的最大值([V[w][s][l]))
90返回和_Vws2
91 vws2=vws2()
~\Anaconda3\lib\site packages\gekko\gk\u operators.py in\uuuu\u len\uu(self)
23返回自己的名字
24 def____________(自):
--->25返回长度(自身值)
26 def_uugetItem_uu(self,key):
27返回自身值[键]
~\Anaconda3\lib\site packages\gekko\gk\u operators.py in\uuuu\u len\uu(self)
132
133定义长度(自):
-->134返回长度(自身值)
135
136 def_uuugetItem_uuuu(自身,密钥):
TypeError:类型为“int”的对象没有len()
何登仁教授的回答:
您需要使用内置的GEKKOmax2
或max3
函数。否则,Python函数将创建一个没有连续的一阶或二阶导数的表达式,并且基于梯度的解算器可能无法找到解决方案
要使用max2
或max3
gekko函数,您需要使用pip install gekko==0.2rc6升级到最新的gekko版本(>0.2rc5)
下面是max2
或max3
的源代码,您也可以在中找到
def max2(自身、x1、x2):
“”“生成第一个和第二个连续的最大值。”
二阶导数。最大值(max)的传统方法不适用
连续可微,可导致基于梯度的优化器
未能趋同。
用法:y=m.max2(x1,x2)
输入:GEKKO变量、参数或表达式
输出:GEKKO变量
"""
#验证x1和x2是否为有效的GEKKO变量或参数
如果isinstance(x1,(GK变量,GK参数)):
xin1=x1
其他:
#如果是表达式,则创建输入变量
xin1=self.Var()
自方程(xin1==x1)
如果isinstance(x2,(gk变量,gk参数)):
xin2=x2
其他:
#如果是表达式,则创建输入变量
xin2=self.Var()
自回归方程(xin2==x2)
#生成具有唯一对象名称的max对象
max_name='max2_'+str(len(self._对象)+1)
self.\u objects.append(max\u name+'=max')
#在x和最大对象属性x之间添加连接
self._connections.append(xin1.name+'='+max_name+'.x[1]'))
self._connections.append(xin2.name+'='+max_name+'.x[2]'))
#在y和最大对象属性y之间添加连接
y=self.Var()
self._connections.append(y.name+'='+max_name+'.y')
返回y
def max3(自身、x1、x2):
“”“使用二进制开关变量生成最大值。”。
传统的求最大值(max)的方法是不连续的
可微,并可能导致基于梯度的优化器失败
汇聚。
用法:y=m.max3(x1,x2)
输入:GEKKO变量、参数或表达式
输出:GEKKO变量
"""
#添加二进制(intb)和输出(y)变量
intb=self.Var(0,lb=0,ub=1,integer=True)
y=self.Var()
#添加切换条件的方程式
#当x1>x2且y=x1时,intb=0
#当x2>x1且y=x2时,intb=1
自方程((1-intb)*(x2-x1)