TypeError: object of type 'int' has no len() in Objective function nonlinear optimization Gekko

TypeError: object of type 'int' has no len() in Objective function nonlinear optimization Gekko

我要最大化我的非线性函数并尝试使用 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(),我不知道要更改什么才能让它工作...

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

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

Gekko 将尝试最小化 f。所以如果你只想最小化 x+y,那么你只需要 m.Obj(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.min3() 时,Gekko 会自动选择 m.options.SOLVER=1。这产生了解决方案:

6.8181818182
6.8181818182

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