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()
,我不知道要更改什么才能让它工作...
您的 x
和 y
是特定的 Gekko 变量类型,即使当您显示它们时它们显示为整数。该特定类型没有定义最小函数。因此,当您调用 min
时,Python 内置 min
函数依赖于 len
,而 Gekko 特定的 len
函数将变量的值作为其参数,所以有效地 min
调用 len(x.value)
,这是行不通的,因为 x.value
是一个整数(相当于 y
)。如果你想将你的 objective 函数设置为 x
和 y
的某个函数,那么你需要这样做:
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。
我要最大化我的非线性函数并尝试使用 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()
,我不知道要更改什么才能让它工作...
您的 x
和 y
是特定的 Gekko 变量类型,即使当您显示它们时它们显示为整数。该特定类型没有定义最小函数。因此,当您调用 min
时,Python 内置 min
函数依赖于 len
,而 Gekko 特定的 len
函数将变量的值作为其参数,所以有效地 min
调用 len(x.value)
,这是行不通的,因为 x.value
是一个整数(相当于 y
)。如果你想将你的 objective 函数设置为 x
和 y
的某个函数,那么你需要这样做:
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。