微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TypeError:“目标”函数非线性优化Gekko中类型为“ int”的对象没有len

如何解决TypeError:“目标”函数非线性优化Gekko中类型为“ int”的对象没有len

我要最大化非线性函数,并尝试使用GEKKO

m=GEKKO()
x=m.Var(value=1,lb=0,ub=50)
y=m.Var(value=1,ub=50)
m.Equation(puree*x+cutlet*y==1500)
m.Obj(-min(x,y))
m.solve(disp=False)
x.value
y.value

但是我在此字符串TypeError: object of type 'int' has no len()中得到了m.Obj(-min(x,y)),但我不知道要进行哪些更改才能使其正常工作...

解决方法

您的xy是特定的Gekko变量类型,即使您将它们显示为整数也是如此。在该特定类型上没有定义min函数。因此,当您调用min时,Python内置的min函数依赖于len,而Gekko特定的len函数将变量的值作为参数,因此有效地{ {1}}调用min,这是行不通的,因为len(x.value)是一个int(等效于x.value)。如果要将目标函数设置为yx的某个函数,则需要这样做:

y

,Gekko将尝试最小化m.Obj(<f(x,y)>) 。因此,如果您只想最小化f,那么您只需要x+y

,

tclarke13正确指出,您需要使用m.min2()m.min3()函数来创建最小函数的连续可区分版本。

from gekko import GEKKO
m=GEKKO()
x,y = m.Array(m.Var,2,value=1,lb=0,ub=50)
puree=100; cutlet=120
m.Equation(puree*x+cutlet*y==1500)
m.Maximize(m.min3(x,y))
m.solve(disp=False)
print(x.value[0],y.value[0])

m.min2()函数使用互补性约束,而m.min3()函数使用二进制变量。二进制变量要求使用混合整数线性规划(MILP)求解器或混合整数非线性规划(MINLP)求解器来解决此问题。使用m.options.SOLVER=1时,Gekko会自动选择m.min3()。产生解决方案:

6.8181818182
6.8181818182

有关m.min2()的更多信息是available here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。