如何解决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))
,但我不知道要进行哪些更改才能使其正常工作...
解决方法
您的x
和y
是特定的Gekko变量类型,即使您将它们显示为整数也是如此。在该特定类型上没有定义min函数。因此,当您调用min
时,Python内置的min
函数依赖于len
,而Gekko特定的len
函数将变量的值作为参数,因此有效地{ {1}}调用min
,这是行不通的,因为len(x.value)
是一个int(等效于x.value
)。如果要将目标函数设置为y
和x
的某个函数,则需要这样做:
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 举报,一经查实,本站将立刻删除。