Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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_Numpy_Gekko - Fatal编程技术网

Python 在gekko中定义最大函数时出错

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#最大

在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#最大迭代次数
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()

何登仁教授的回答:

您需要使用内置的GEKKO
max2
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)