【问题标题】:TypeError: object of type 'int' has no len() in Objective function nonlinear optimization GekkoTypeError:“int”类型的对象在目标函数非线性优化 Gekko 中没有 len()
【发布时间】:2020-10-09 17:13:15
【问题描述】:

我将最大化我的非线性函数并尝试使用 GEKKO 来做到这一点

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

但是我在这个字符串m.Obj(-min(x,y)) 中得到了TypeError: object of type 'int' has no len(),我不知道要改变什么才能让它工作......

【问题讨论】:

  • 我对 GEKKO 了解不多,但从您的错误消息来看,m.Obj(-min(x,y)) 预计 x 和 y 是列表而不是整数。检查 GEKKO 的文档以确定。如果是这种情况,请尝试m.Obj(-min([x],[y]))

标签: python-3.x typeerror nonlinear-optimization maximize gekko


【解决方案1】:

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

m.Obj(<f(x,y)>)

Gekko 将尝试最小化f。所以如果你只想最小化x+y,那么你只需要m.Obj(x+y)

【讨论】:

  • U(x,y)=min(x,y) 是我要最大化的初始效用函数。我试过m.Obj(&lt;f(x,y)&gt;),但它产生SyntaxError: invalid syntax
  • 那么考虑到你的等式约束,你需要min2函数,即m.Obj(-m.min2(x,y))
【解决方案2】:

正如 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.min3() 时,Gekko 会自动选择m.options.SOLVER=1。这产生了解决方案:

6.8181818182
6.8181818182

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2021-02-26
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多